source: MondoRescue/branches/2.2.10/mindi/mindi@ 2396

Last change on this file since 2396 was 2396, checked in by Bruno Cornec, 15 years ago

mondorestore is handled in deplist.txt

  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 103.1 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2396 2009-09-14 11:03:51Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-image boot/root kit. The first image is the boot
9# disk: it contains a kernel, a ramdisk etc. The second disk is data disk #1;
10# the third disk is data disk #2; and so it goes.
11#
12# See http://www.mondorescue.org for details.
13#-----------------------------------------------------------------------------
14
15### Which arch are we on (useful for ia64 port)
16ARCH=`/bin/uname -m`
17KERVERRUN=`/bin/uname -r`
18# By default we use the running kernel as a reference
19KERVER=$KERVERRUN
20
21ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off"
22
23MINDI_REV=PBREV
24MINDI_VER=PBVER
25
26MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
27MINDI_PREFIX=XXX
28MINDI_CONF=YYY
29MINDI_SBIN=${MINDI_PREFIX}/sbin
30MINDI_LIB=LLL
31
32# Temporary directory for mindi
33TMPDIR=/tmp
34
35EXTRA_SPACE=49152 # increase if you run out of ramdisk space
36BOOT_SIZE=16384 # size of the boot disk
37
38PROMPT_MAKE_CD_IMAGE="yes"
39 # Ask if you want to make a CD Image to be written?
40 # if this is set to 'no', then the image will be created automatically
41
42PROMPT_MAKE_USB_IMAGE="yes"
43 # Ask if you want to make a USB Image to be written?
44 # if this is set to 'no', then the image will be created automatically
45
46USE_OWN_KERNEL="yes"
47 # If set to "no", you will be prompted for whether or not
48 # you want to use your own kernel, or the supplied default.
49 # If "yes" mindi will automatically use your own kernel.
50
51MY_FSTAB=/etc/fstab
52TAPE_MODS="ht st osst ide-tape ide_tape"
53SCSI_MODS="3w-xxxx 3w_xxxx 3w_9xxx 3w-9xxx 53c7,8xx a100u2w a320raid aacraid adpahci advansys aha152x aha1542 aha1740 aic79xx aic79xx_mod aic7xxx aic7xxx_mod aic7xxx_old AM53C974 atp870u BusLogic cciss cpqfc dmx3191d dpt_i2o dtc eata eata_dma eata_pio fdomain gdth g_NCR5380 i2o_block i2o_core ide-scsi ieee1394 imm in2000 initio ips iscsi iscsi_tcp libiscsi scsi_transport_iscsi isp megaraid megaraid_mm megaraid_mbox megaraid_sas mptbase mptscsih mptsas mptspi mptfc mptscsi mptctl NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp dc395x"
54
55# ide-probe-mod
56IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod edd paride ata_generic ata_piix libata dock via82cxxx generic nvidia ahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks pata_sis amd74xx sis5513 jmicron sata_promise sata_via serverworks"
57PCMCIA_MODS="pcmcia_core ds yenta_socket"
58USB_MODS="usb-storage usb-ohci usb-uhci usbcore usb_storage input hid uhci_hcd ehci_hcd uhci-hcd ehci-hcd ohci-hcd ohci_hcd usbkbd usbhid keybdev mousedev libusual scsi_mod ff-memless"
59NET_MODS="sunrpc nfs nfs_acl lockd fscache loop mii 3c59x e100 bcm5700 bnx2 e1000 e1000e igb eepro100 ne2k-pci tg3 libphy pcnet32 8139cp 8139too 8390 forcedeth vmxnet vmnet exportfs fuse"
60CDROM_MODS="$TAPE_MODS $IDE_MODS $USB_MODS $PCMCIA_MODS $SCSI_MODS $NET_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_base nls_cp437 nls_utf8 sg sr_mod zlib_inflate iso9660"
61# Those modules will only go on the backup media, not the boot media.
62EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid10 raid5 raid456 lvm-mod dm-mod dm_mod dm-snapshot dm_snapshot dm-zero dm_zero dm-mirror dm_mirror dm-multipath dm-round-robin dm-emc dm-hp-sw dm-rdac multipath jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16"
63# Replace with that line for HP OCMP e.g.
64#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
65DENY_MODS="kqemu"
66# Force some modules to be included
67FORCE_MODS=""
68
69LOGFILE=/var/log/mindi.log
70MINDI_CACHE=/var/cache/mindi
71BOOT_MEDIA_MESSAGE="\
72To format and restore all files automatically, type 'nuke' <enter>.\n\
73To restore some/all files interactively, type 'interactive' <enter>.\n\
74To compare the archives with your filesystem, type 'compare' <enter>.\n\
75To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
76You may add one or more of the following parameters as well:-\n\n\
77 donteject - mondorestore will not eject the CD; this is useful if, for\n\
78 instance, your PC's case has a concealed CD-ROM drive\n\
79 noresize - your mountlist will not be adjusted to use your unallocated\n\
80 hard disk space\n\
81 textonly - do not call any Newt library routines; this is unattractive\n\
82 but valuable if you find your Newt library has bugs in it\n\n\
83e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
84a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
85"
86FDISK=$MINDI_SBIN/parted2fdisk
87
88# Using a config file allow to overwrite some values
89MINDI_CONFIG="$MINDI_CONF/mindi.conf"
90if [ -f $MINDI_CONFIG ]; then
91 . $MINDI_CONFIG
92fi
93DEPLIST_FILE="$MINDI_CONF/deplist.txt"
94ISO_CMD="/usr/bin/mkisofs"
95ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
96
97# Now we can create what we need
98MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
99if [ $? -ne 0 ]; then
100 df $TMPDIR
101 Die "Unable to create a temporary directory ! Check space on $TMPDIR"
102fi
103if [ _"$MINDI_TMP" = _"" ]; then
104 Die "MINDI_TMP is empty, aborting"
105fi
106if [ _"$MINDI_TMP" = _"/" ]; then
107 Die "MINDI_TMP is /, aborting"
108fi
109export MINDI_TMP
110
111# ----------------------------------------------------------------------------
112
113
114AbortHere() {
115 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
116 Die "Program is terminating in response to signal received from OS/user"
117}
118
119
120Aborted() {
121 trap SIGHUP SIGTERM SIGTRAP SIGINT
122 [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
123 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
124 Die "User abort."
125}
126
127
128AddFileToCfgIfExists() {
129 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
130}
131
132
133AddKeyboardMappingFile() {
134 local mappath r included_list included_item i res ii sss
135 mappath=$1
136 KBDEPTH=$(($KBDEPTH+1))
137 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
138 if [ -e "$bigdir/$mappath" ] ; then
139 LogFile "$mappath already added"
140 return
141 elif [ -d "$bigdir/$mappath" ] ; then
142 echo "Cannot add $mappath: it's a directory. Sorry."
143 return
144 fi
145 LogFile "Added kbd map $mappath"
146 if [ ! -e "$mappath" ] ; then
147 mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
148 if [ ! -e "$mappath" ] ; then
149 LogAll "Cannot add $mappath: kbd map file not found"
150 return
151 fi
152 else
153 echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
154 fi
155
156 mkdir -p $bigdir/etc
157 tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogAll "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
158 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
159 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
160 else
161 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
162 fi
163 for included_item in $included_list ; do
164 if [ ! -e "$included_item" ] ; then
165 sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
166 [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
167 for ii in $sss ; do
168 [ -e "$ii" ] && AddKeyboardMappingFile $ii
169 done
170 else
171 AddKeyboardMappingFile $included_item
172 fi
173 done
174}
175
176
177CopyDependenciesToDirectory() {
178 local outdir incoming fname counter d found
179 outdir=$1
180 mkdir -p $outdir
181 incoming=`ReadLine`
182 counter=0
183 while [ "$incoming" != "" ] ; do
184 # Non absolute file names should not arrive till here => skipped
185 if [ `echo "$incoming" | cut -c1` != '/' ]; then
186 LogAll "Unable to handle $incoming"
187 incoming=`ReadLine`
188 continue
189 fi
190 # no parent directory of incoming should be a link, copy is not possible in that case
191 d=`dirname "$incoming"`
192 found="false"
193 while [ $d != "/" -a $found = "false" ]; do
194 [ -h "$d" ] && found="true"
195 d=`dirname "$d"`
196 done
197 if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
198 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
199 elif [ -e "$incoming" ] && [ $found = "false" ]; then
200 tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd $outdir ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
201
202 # Only uncompress modules if not using udevd
203 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
204 gunzip -f $outdir/$incoming || LogAll "Cannot gunzip $outdir/$incoming"
205 fi
206 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
207 counter=$(($counter+1))
208 if [ "$counter" -ge "5" ] ; then
209 counter=0
210 echo -en "."
211 fi
212 fi
213 incoming=`ReadLine`
214 done
215}
216
217
218CountItemsIn() {
219 local r
220 r=0
221 for q in $1 ; do
222 r=$(($r+1))
223 done
224 echo $r
225}
226
227
228# Last function called before exiting
229# Parameter is exit code value
230MindiExit() {
231 local my_partitions
232
233 LogFile "Mindi $MINDI_VERSION is exiting"
234 LogFile "End date : `date`"
235 if [ _"$MONDO_SHARE" != _"" ] ; then
236 echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
237 cat $LOGFILE >> /var/log/mondoarchive.log
238 echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
239 fi
240
241 cd /
242 sync&
243
244 # Unmount what could remain mounted
245 my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
246 [ "$my_partitions" != "" ] && umount $my_partitions
247 # Clean temporary files only when standalone mindi
248 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
249 rm -Rf $MINDI_TMP
250 fi
251 exit $1
252}
253
254Die() {
255 local i
256 if [ "$1" = "" ] ; then
257 LogAll "FATAL ERROR"
258 else
259 LogAll "FATAL ERROR. $1"
260 fi
261 if [ _"$2" != _"" ]; then
262 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
263 fi
264 rm -f "$2"
265
266 LogAll "Please e-mail a copy of $LOGFILE to the mailing list."
267 LogAll "See http://www.mondorescue.org for more information."
268 LogAll "WE CANNOT HELP unless you enclose that file.\n"
269 MindiExit -1
270}
271
272
273DropOptimizedLibraries() {
274 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
275 filelist=$1
276 outdir=$2
277
278 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
279 if [ "$list_of_optimized_libraries" = "" ] ; then
280 return 0
281 fi
282 echo -en "Dropping i686-optimized libraries if appropriate"
283 for optimized_lib_name in $list_of_optimized_libraries ; do
284 echo -en "."
285 reason=""
286 vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
287 echo "$vanilla_lib_name" >> $filelist
288 LogFile "Adding $vanilla_lib_name to filelist"
289 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
290 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
291
292 # This may return multiple files
293 for resolved in `ReadAllLink $vanilla_lib_name`; do
294 LogFile "Adding as deps $resolved to filelist"
295 vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
296 mkdir -p $outdir$resolved> /dev/null 2> /dev/null
297 rmdir $outdir$resolved > /dev/null 2> /dev/null
298 ln -sf $vanilla_resolved_name $outdir$resolved
299 LogFile "Excluding deps $resolved"
300 grep -Fvx "$resolved" "$filelist" > $filelist.tmp
301 LogFile "Replacing it with $vanilla_resolved_name"
302 echo "$vanilla_resolved_name" >> $filelist.tmp
303 mv -f $filelist.tmp $filelist
304 done
305 done
306 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
307 mv -f $filelist.tmp $filelist
308 echo -e "$DONE"
309}
310
311
312FindAndAddUserKeyboardMappingFile() {
313 local r res mapfile mappath included_item included_list keyfile mp locale
314 LogAll "Analyzing your keyboard's configuration."
315 KEYDIR=/lib/kbd
316 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
317 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
318 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
319 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
320 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
321 if [ ! -e "$KEYDIR" ] ; then
322 LogAll "Keyboard mapping directory not found. I shall use default map at boot-time."
323 return 0
324 fi
325 if [ -e "/etc/sysconfig/keyboard" ] ; then
326 LogFile "Red Hat-style config detected."
327 keyfile=/etc/sysconfig/keyboard
328 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
329 LogFile "Slackware-style config detected."
330 keyfile=/etc/rc.d/rc.keymap
331 elif [ -e "/etc/rc.config" ] ; then
332 LogFile "Debian-style config detected."
333 keyfile=/etc/rc.config
334 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
335 LogFile "Debian-style config detected."
336 echo -en "Adding the following keyboard mapping tables: "
337 mkdir -p $bigdir/tmp
338 echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
339 KBDEPTH=0
340 mkdir -p $bigdir/etc/console
341 cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
342 echo -e "$DONE"
343 return 0
344 elif [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
345 LogFile "Ubuntu-style config detected."
346 echo -en "Adding the following keyboard mapping tables: "
347 mkdir -p $bigdir/tmp
348 echo "/etc/console-setup/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
349 KBDEPTH=0
350 mkdir -p $bigdir/etc/console-setup
351 cp /etc/console-setup/boottime.kmap.gz $bigdir/etc/console-setup 2>> $LOGFILE
352 echo -e "$DONE"
353 return 0
354 elif [ -e "/etc/conf.d/keymaps" ] ; then
355 LogFile "Gentoo-style config detected."
356 keyfile=/etc/conf.d/keymaps
357 else
358 echo -en "Searching for rc.config ..."
359 keyfile=`find /etc -name rc.config | head -n1`
360 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
361 LogAll "Unknown config detected. Default keyboard map will be used."
362 return
363 else
364 LogFile "Found $keyfile"
365 fi
366 fi
367 if [ ! -e "$KEYDIR/keymaps" ] ; then
368 LogAll "Keyboard mapping directory not found. Default keyboard map will be used."
369 return
370 fi
371 LogFile "keyfile=$keyfile"
372 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
373 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
374 [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2` # Gentoo
375 LogFile "locale=$locale"
376 #
377 # Process the keymaps dir once for all
378 # AddKeyboardMappingFile will use it recursively
379 #
380 find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
381 mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
382 [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
383 # If we have multiple keymaps then log it !!
384 echo "$mp" | grep -q " "
385 if [ $? -eq 0 ]; then
386 LogAll "WARNING: Multiple keymaps found: $mp"
387 LogFile "The following one will be used"
388 fi
389 for i in $mp ; do
390 mappath=$i
391 [ -e "$i" ] && [ ! -d "$i" ] && break
392 done
393 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
394 mappath=$(find / -name "*/kbd/keymaps/*/$locale")
395 fi
396 LogFile "mappath = $mappath"
397 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
398 LogAll "Keyboard mapping file not found. Default keyboard map will be used."
399 return
400 fi
401 echo -en "Adding the following keyboard mapping tables: "
402 mkdir -p $bigdir/tmp
403 echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
404 KBDEPTH=0
405 AddKeyboardMappingFile $mappath
406 echo -e "$DONE"
407 rm -f $MINDI_TMP/keymaps.find
408 return 0
409}
410
411
412FindIsolinuxBinary() {
413 ISOLINUX=/usr/lib/isolinux.bin
414 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
415 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
416 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
417 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
418 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
419 [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
420 [ ! -e "$ISOLINUX" ] && Die "Please install isolinux first. If your syslinux RPM doesn't include isolinux, you may download an isolinux RPM from Mondo's website - go to http://www.mondorescue.com and click on 'Download'"
421 LogFile "Found isolinux.bin at $ISOLINUX"
422}
423
424
425FindSpecificModuleInPath() {
426 local modpaths pwd line
427 pwd=`pwd`
428 if [ "$YOUR_KERNEL_SUCKS" ] ; then
429 cd $MINDI_TMP
430 else
431 cd /
432 fi
433 if [ ! -e "$1" ] ; then
434 LogAll "WARNING - cannot search specific path '$1'"
435 return 1
436 fi
437 modpaths=`find $1 -name $2.*o -type f`
438 #[ "$?" -ne "0" ] && Die "find $1 -name $2.o -type f --- failed"
439 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f`
440 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f`
441 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f`
442 echo "$modpaths"
443 cd $pwd
444}
445
446
447GenerateGiantDependencyList() {
448 local incoming loc fname list_of_files i tempfile outfile progress filelist res r mapfile mappath included_list included_item old_pwd tempdepfile modres noof_lines lvmversion lvmresolved
449
450 echo -en "Analyzing dependency requirements"
451 outfile=$1
452 tempfile=$MINDI_TMP/$$.txt
453 incoming=`ReadLine`
454
455 > $tempfile
456 progress=0
457 res=0
458 noof_lines=$2
459 while [ "$incoming" != "" ] ; do
460 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
461 incoming=`ReadLine`
462 continue
463 fi
464 if [ "$incoming" = "LVMFILES:" ] ; then
465 break
466 fi
467 filelist=`GenerateListForFile "$incoming"`
468 r=$?
469 [ "$r" -ne "0" ] && LogAll "$incoming not found"
470 res=$(($res+$r))
471# echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
472 for fname in $filelist ; do
473 [ "$fname" != "" ] && echo "$fname" >> $tempfile
474 done
475 progress=$(($progress+1))
476 LogProgress $progress $noof_lines
477 incoming=`ReadLine`
478 done
479 if [ "$incoming" = "LVMFILES:" ] ; then
480 incoming=`ReadLine`
481 lvmversion=""
482 while [ "$incoming" != "" ] ; do
483 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
484 incoming=`ReadLine`
485 continue
486 fi
487 filelist=`GenerateListForFile "$incoming"`
488 for tool in $filelist ; do
489 lvmresolved=`readlink -f $tool`
490 if [ "$tool" = "$lvmresolved" ]; then
491 echo "$tool" >> $tempfile
492 elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
493 if [ "$lvmversion" = "" ] ; then
494 lvmversion=`$lvmresolved`
495 echo "$lvmresolved" >> $tempfile
496 fi
497 toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
498 if [ "$lvmversion" = "200" ]; then
499 # pvdata and lvmcreate_initrd don't exist in LVM2
500 case "$toolstripped" in
501 "pvdata")
502 continue
503 ;;
504 "lvmcreate_initrd")
505 continue
506 ;;
507 esac
508 fi
509 toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
510 if [ -e "$toolpath" ] ; then
511 echo "$toolpath" >> $tempfile
512 echo "$tool" >> $tempfile
513 else
514 toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
515 fi
516 if [ -e "$toolpath" ] ; then
517 echo "$toolpath" >> $tempfile
518 echo "$tool" >> $tempfile
519 else
520 echo "Where are your LVM-Tools? Couldn't find $tool"
521 fi
522 else
523 echo "$tool" >> $tempfile
524 fi
525 done
526 progress=$(($progress+1))
527 LogProgress $progress $noof_lines
528 incoming=`ReadLine`
529 done
530 fi
531 echo -en "$DONE\nMaking complete dependency list"
532
533 tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
534 mv -f $tempfile.new $tempfile
535 > $outfile.pre
536 progress=0
537 noof_lines=`cat $tempfile | wc -l`
538 LogFile "---------------------------------"
539 LogFile "List of dependencies: "
540 LogFile "---------------------------------"
541 for fname in `cat $tempfile` ; do
542 echo "$fname" | tee -a $LOGFILE >> $outfile.pre
543 LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
544 progress=$(($progress+1))
545 LogProgress $progress $noof_lines
546 done
547 if [ _"$MONDO_SHARE" != _"" ]; then
548 mkdir -p $bigdir/tmp
549 mkdir -p $bigdir/sbin
550 mkdir -p $bigdir/bin
551 if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
552 LogAll "\nIncorporating post-nuke tarball"
553 old_pwd=`pwd`
554 cd $bigdir
555 tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogAll "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
556 cd $old_pwd
557 fi
558 cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogAll "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
559 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
560 LogAll "\nIncorporating NFS-related settings"
561 for r in NETFS-* ISO-PREFIX ; do
562 cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
563 LogFile "Copying $r to ramdisk"
564 done
565 fi
566 fi
567 tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
568 rm -f $tempfile $outfile.pre
569 [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
570 return $res
571}
572
573
574GenerateListForFile() {
575 local files_found loc fname incoming i res
576 incoming="$1"
577 files_found=""
578 res=0
579
580 for fname in $incoming ; do
581 files_found="$files_found `LocateFile $fname`"
582 done
583
584 echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
585}
586
587
588# Returns all disk devices which are part of a raid array
589GetAllRaidMembers() {
590 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
591}
592
593
594GetFileSizeList() {
595 local i
596 for i in `find $1 -type d -o -print` ; do
597 du -sk $i
598 done
599}
600
601
602GetHomeDir() {
603 local res loc
604 loc=`which $1 2>/dev/null`
605 res=`file $loc | $AWK '{print $NF;}'`
606 dirname $res
607}
608
609
610# Check kernel filesystem capabilites for accessing initrd image
611#
612# Interface definition:
613# param #1: absolute path to kernel image
614GetInitrdFilesystemToUse() {
615
616 # interface test: make sure we have one parameter
617 if [ $# -ne 1 ]; then
618 Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
619 fi
620
621 # interface parameters
622 local lvKernelImage=$1
623
624 # local constants (filesystem magic strings)
625 local lcMagicCramfs="<3>cramfs: wrong magic"
626 local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
627 local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
628 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
629initramfs"
630
631 # local variables
632 local lvOffset
633 local lvScanRes
634 local lvUseFilesystem
635
636 # say where we are.
637 LogFile " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage.\n"
638
639 # verify that file exists
640 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
641
642 # Kernel may be gzip compressed
643 file $lvKernelImage 2>&1 | grep -q gzip
644 if [ $? -eq 0 ]; then
645 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
646 else
647 # Since 2.6.30 kernel can use lzma and bzip2 in addition to gzip for initramfs compression
648 # get offet of gzip magic "1f8b0800" in file (or 1f8b9e ??)
649 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}'`
650 if [ $lvOffset -eq 0 ]; then
651 # get offet of bzip2 magic "425a" in file
652 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "425a")}'`
653 if [ $lvOffset -eq 0 ]; then
654 # get offet of lzma magic "5d00" in file
655 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "5d00")}'`
656 if [ $lvOffset -eq 0 ]; then
657 Die "No magic compression pattern found in file $lvKernelImage. Terminating."
658 else
659 comp="lzma"
660 fi
661 else
662 comp="bzip2"
663 fi
664 else
665 comp="gzip"
666 fi
667
668 lvOffset=`expr $lvOffset / 2`
669 LogFile " GetInitrdFilesystemToUse(): $comp magic found in $lvKernelImage at lvOffset $lvOffset.\n"
670
671 # scan kernel image for initrd filessystem support
672 lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | $comp -dc 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
673 fi
674
675 # determine which filesystem to use for initrd image: ext2fs, gzip'ed cpio (initramfs ) or cramfs
676 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
677 lvUseFilesystem="ext2fs"
678 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
679 lvUseFilesystem="ext3fs"
680 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
681 lvUseFilesystem="initramfs"
682 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
683 lvUseFilesystem="cramfs"
684 else
685 lvUseFilesystem="UNSUPPORTED"
686 fi
687
688 # say what we are using
689 LogFile " GetInitrdFilesystemToUse(): Filesytem to use for initrd is $lvUseFilesystem.\n"
690
691 # return file system to use
692 echo "$lvUseFilesystem"
693
694}
695
696# Searches parent raid device of given disk device
697# $1: disk device (i.e. /dev/hda1)
698GetParentRaidDev() {
699 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
700}
701
702
703# Searches members of raid device
704# $1: raid device (/dev/md...)
705GetRaidDevMembers() {
706 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
707}
708
709
710HackPathsToFailsafe() {
711 local incoming newpath stub i pwd
712 incoming=`ReadLine`
713 pwd=`pwd`
714 cd $MINDI_TMP
715 while [ "$incoming" != "" ] ; do
716 stub=`basename $incoming`
717 newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
718 for i in $newpath ; do
719 echo "$i"
720 done
721 read incoming
722 done
723 cd $pwd
724}
725
726
727ListAllPartitions() {
728 local res currline partition all_partitions ap_orig remaining i j
729
730 grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
731 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
732 if [ -e "/vmfs/volumes" ]; then
733 # For VMWare ESX 3 get the device names of these volumes
734 vdf -P | grep -E '/vmfs/volumes' | awk '{print $1}'
735 fi
736 return
737}
738
739
740ListImagesForUser() {
741 local path fname
742 path=$MINDI_CACHE
743 echo -en "In the directory '$path' you will find the images:-\n"
744 for fname in `ls $path | grep -F mindi-` ; do
745 printf "%19s " $fname
746 done
747 echo " "
748}
749
750
751ListKernelModulePaths() {
752 local module_list module fname oss r kern
753 oss="/root/oss/modules"
754 module_list="$MODULES"
755 # Remove unwanted modules from list
756 for i in $DENY_MODS; do
757 module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
758 EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
759 done
760###
761### Sq-Modification ... Use kernelname for module search path if specified
762###
763 if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
764 then
765 kern=${kernelname}
766 else
767 kern="$KERVERRUN"
768 fi
769 export KERVER=$kern
770###
771### Sq-Mod End
772###
773 for module in $module_list $EXTRA_MODS ; do
774 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
775 LogFile "module $module --> $r"
776 [ "$r" ] && echo "$r"
777 [ -f "$oss" ] && find $oss | grep -F $module
778 done
779 find /lib/modules/$kern/modules.* -type f 2> /dev/null
780 [ -f "$oss" ] && find $oss.* 2> /dev/null
781}
782
783#
784# Critical function which computes all dependencies (dyn. lib.)
785# for a list of binaries
786#
787LocateDeps() {
788 local incoming fname deps
789 incoming="$*"
790 for fname in $incoming ; do
791 if [ ! -e "$fname" ] ; then
792 LogFile "WARNING - $fname does not exist; cannot be LDD'd."
793 if echo $fname | grep lvm &> /dev/null ; then
794 LogFile "This warning only affects you if you are using LVM."
795 if echo "$MODULES" | grep lvm &> /dev/null ; then
796 LogFile "I think you are, so please take heed!"
797 else
798 LogFile "I don't think you are, so don't worry about it."
799 fi
800 fi
801 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
802 LogFile "$fname is softlink"
803 else
804 ldd $fname 2> /dev/null | ProcessLDD
805 fi
806 done
807}
808
809
810# Give all symlinks recursively of a full path name
811ReadAllLink() {
812 file="$1"
813
814 echo $file | grep -q '\.\./'
815 if [ $? -eq 0 ]; then
816 # We need to normalise the path with .. in it
817 file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
818 fi
819 echo "$file"
820 if [ ! -h $file ]; then
821 return 0
822 fi
823
824 link=`readlink $file`
825 d=`dirname $file`
826 fchar=`echo $link | cut -c1`
827 # If mother dir is a link print it
828 if [ -h "$d" ]; then
829 echo "$d"
830 d=`readlink $d`
831 fi
832 if [ "$fchar" != "/" ]; then
833 # Relative or local link
834 ReadAllLink "$d/$link"
835 else
836 # Absolute path
837 ReadAllLink $link
838 fi
839}
840
841
842LocateFile() {
843 local i path fname_to_find location output resolved tmp stub cache_id loclist
844 fname_to_find="$1"
845 # It's an absolute path
846 if echo "$fname_to_find" | grep -x "/.*" ; then
847 output="$fname_to_find"
848 if [ -h "$output" ] ; then
849 output="`ReadAllLink $output` $output"
850 fi
851 echo "$output"
852 return 0
853 fi
854 # It's not an absolute path
855 output=""
856 for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin `find /usr/lib /lib /usr/local/lib /usr/X11R6/lib /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d -maxdepth 1 2> /dev/null` ; do
857 #for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/lib64 /usr/lib64/* /lib /lib64 /lib64/* /usr/local/lib /usr/local/lib64 /usr/local/lib64/* /usr/X11R6/lib /usr/X11R6/lib64 /usr/X11R6/lib64/* ; do
858 [ -h "$path" ] && continue
859 [ ! -e "$path/$fname_to_find" ] && continue
860 output="$path/$fname_to_find $output"
861 if [ -h "$path/$fname_to_find" ] ; then
862 output="`ReadAllLink $path/$fname_to_find` $output"
863 fi
864 done
865 if [ "$output" = "" ] ; then
866 return 1
867 fi
868 echo "$output"
869 return 0
870}
871
872LogProgress() {
873 local i progress modres noof_lines
874
875 progress=$1
876 noof_lines=$2
877
878 echo -en "\r\t\t\t\t\t\t\t\t"
879 i=$(($progress*100))
880 i=$(($i/$noof_lines))
881 echo -en "$i"
882 echo -en "%"
883 modres=$(($progress%4))
884 [ "$modres" -eq "0" ] && echo -en "\t/"
885 [ "$modres" -eq "1" ] && echo -en "\t-"
886 [ "$modres" -eq "2" ] && echo -en "\t\\"
887 [ "$modres" -eq "3" ] && echo -en "\t|"
888}
889
890# Function to log on screen only
891LogScreen() {
892 if [ -e /dev/stderr ] ; then
893 echo -e "$1" >> /dev/stderr
894 elif [ -e /usr/bin/logger ] ; then
895 /usr/bin/logger -s $1
896 fi
897}
898
899# Function to log in log file only
900LogFile() {
901
902 echo -e "$1" >> $LOGFILE
903 if [ _"$2" != _"" ]; then
904 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
905 fi
906 rm -f "$2"
907}
908
909# Function to log in both screen and logfile
910LogAll() {
911 LogScreen "$1"
912 LogFile "$1" "$2"
913}
914
915
916# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
917MakeMondoConfigFile() {
918 local outfile use_lzo use_comp use_star
919 outfile=$1
920 > $outfile
921 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
922 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
923 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
924 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
925 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
926 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
927 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
928 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
929 use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
930 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
931 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
932 echo "use-lzo $use_lzo" >> $outfile
933 echo "use-lzma $use_lzma" >> $outfile
934 echo "use-star $use_star" >> $outfile
935 echo "use-comp $use_comp" >> $outfile
936 echo "datestamp `date`" >> $outfile
937 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
938 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
939 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
940 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
941 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
942 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
943 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
944 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
945 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
946 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
947 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
948 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
949 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
950 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
951 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
952 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
953 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
954 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
955 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
956 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
957 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
958 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
959 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
960}
961
962
963MakeMountlist() {
964 local scratchdir mountlist all_partitions current_partition \
965partition_size partition_format outstring partition_number \
966partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
967absolute_partition old_partition_fmt current_lvolume uname skip
968
969 LogFile "Your raw fstab file looks like this:"
970 LogFile "------------------------------------"
971 cat $MY_FSTAB >> $LOGFILE
972 LogAll "Your mountlist will look like this:"
973 LogAll "-----------------------------------"
974
975# scratchdir, mountlist(OUT)
976 scratchdir=$MINDI_TMP
977 mountlist=$1
978
979# NB: partition = device
980# NB: mountpt = where the device is mounted
981
982 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
983
984 [ "$mountlist" != "" ] && rm -Rf $mountlist
985 > $mountlist
986 all_partitions=""
987
988 if [ $LVM != "false" ]; then
989 echo -en "Analyzing LVM...\n"
990 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
991 if [ $? -ne 0 ]; then
992 LVM="false"
993 fi
994 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-32`
995 fi
996 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
997# echo "all partitions = $all_partitions" > /dev/stderr
998 for i in $IMAGE_DEVS ; do
999 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1000 done
1001 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1002 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
1003 useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1"
1004 for c_p in $all_partitions ; do
1005 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
1006 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1007 if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
1008 current_partition=`readlink -f $c_p`
1009 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1010 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1011 else
1012 current_partition="$c_p"
1013 fi
1014 [ "$c_p" = "none" ] && continue
1015 # Debian 5 does that
1016 [ "$c_p" = "proc" ] && continue
1017 redhat_label=""
1018 label=""
1019 uuid=""
1020 absolute_partition=`readlink -f $c_p`
1021 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1022
1023 # Detects noauto partitions not mounted and exclude them
1024 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1025 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1026 continue
1027 fi
1028
1029 # set default in case we dont't find it
1030 str_to_find_fmt_with=$current_partition
1031
1032 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1033 # current_partition contains only first column of /etc/fstab
1034 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1035 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1036 actual_dev=""
1037
1038 # 1st try, findfs - the RHEL way of finding labels and their partitions
1039 if [ -x "/sbin/findfs" ]; then
1040 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1041 fi
1042
1043 # 2nd try : blkid, the good way for all LABEL except swap
1044 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1045 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1046 # For LVM FS it will give a /dev/dm-# which should then be converted
1047 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1048 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1049 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1050 for dev in `ls /dev/mapper/*`; do
1051 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1052 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1053 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1054 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1055 break
1056 fi
1057 done
1058 fi
1059 fi
1060
1061 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1062 # For LVM gives a /dev/mapper entry
1063 if [ "x$actual_dev" = "x" ]; then
1064 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1065 fi
1066
1067 # 4th try, with vol_id
1068 # SWAP only
1069 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1070 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1071 for dev_swap in $list_swaps ; do
1072 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1073 if [ "x$dev_exists" != "x" ]; then
1074 actual_dev=$dev_swap
1075 break;
1076 fi
1077 done
1078 fi
1079
1080 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1081 # LABEL=SW-cciss/c0d0p3 (RDP)
1082 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1083 # SWAP only
1084 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1085 skip=""
1086 uname=$KERVERRUN
1087 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1088 # 2.6.12 needs 16 (FC3)
1089 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1090 # 2.6.19 and upper needs 1052
1091 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1092 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1093 if [ $skip = "" ]; then
1094 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1095 fi
1096 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1097 do
1098 # Location of the swap label for kernel 2.6
1099 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1100 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1101 actual_dev=$try_dev
1102 fi
1103 done
1104 fi
1105
1106 # Check if one of all those tries has known success
1107 if [ "x$actual_dev" != "x" ]; then
1108 current_partition=$actual_dev
1109 else
1110 Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or install findfs|blkid|vol_id"
1111 fi
1112 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1113 # current_partition contains only first column of /etc/fstab
1114 elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1115 uuid=`echo "$current_partition" | cut -d'=' -f2`
1116 actual_dev=""
1117
1118 # 1st try, findfs - the RHEL way of finding labels and their partitions
1119 if [ -x "/sbin/findfs" ]; then
1120 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1121 fi
1122
1123 # 2nd try : blkid, the good way for all UUID except swap
1124 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1125 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1126 # For LVM FS it will give a /dev/dm-# which should then be converted
1127 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1128 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1129 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1130 for dev in `ls /dev/mapper/*`; do
1131 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1132 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1133 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1134 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1135 break
1136 fi
1137 done
1138 fi
1139 fi
1140
1141 # 3th try, with vol_id
1142 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1143 list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1144 for dev in $list_dev ; do
1145 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1146 if [ "x$dev_exists" != "x" ]; then
1147 actual_dev=$dev
1148 break;
1149 fi
1150 done
1151 fi
1152
1153 # 4th try, with dumpuuid (VMWare only ?) for swap
1154 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1155 list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1156 for dev in $list_dev ; do
1157 dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1158 if [ "x$dev_exists" != "x" ]; then
1159 actual_dev=$dev
1160 break;
1161 fi
1162 done
1163 fi
1164
1165 # Check if one of all those tries has known success
1166 if [ "x$actual_dev" != "x" ]; then
1167 current_partition=$actual_dev
1168 else
1169 Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
1170 fi
1171 else
1172 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1173 # they use symlinks in fstab unrelated to what is shown in mount !
1174 if [ _"$partition_mountpt" = _"" ]; then
1175 # set default in case we dont't find it
1176 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1177 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1178 str_to_find_fmt_with=$tmpp
1179 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1180 break;
1181 fi
1182 done
1183 fi
1184 fi
1185
1186 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1187 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1188 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1189 # the former is then a link to the latter, so we test whether
1190 # $current_partition is actually such a link or not and set
1191 # $current_lvolume accordingly. On Debian you may find more than one answer
1192 # so we remove the one corresponding to /dev/.static
1193 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1194 # principle is the same and we need to find the link to it as well.
1195 # Note that $current_lvolume may well be an
1196 # ordinary device. It is just to make sure that we feed the right value
1197 # into any of the LVM tools if possible.
1198
1199 current_lvolume="$current_partition"
1200 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1201 # .static dir are a Debian specificity
1202 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1203 echo $current_lvolume | grep -q ' '
1204 if [ $? -eq 0 ]; then
1205 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1206 fi
1207 # if it's not found, it may well be a real device such as a multipath one
1208 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1209 if [ _"$current_lvolume" = _"" ]; then
1210 current_lvolume="$current_partition"
1211 fi
1212 fi
1213 #
1214 # End of LVM device style variation code (other than $current_lvolume).
1215
1216 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1217 # Size computed via LVM not directly
1218 partition_size="lvm"
1219 else
1220 partition_size=`SizeOfPartition $current_partition`
1221 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1222 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1223 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1224 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1225 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1226 [ "$partition_format" != "swap" ] && partition_format="swap"
1227 if [ "$partition_size" = "" ] ; then
1228 totalsize=0
1229 items=0
1230 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1231 totalsize=$(($totalsize+$i))
1232 items=$(($items+1))
1233 done
1234 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1235 [ "$partition_size" -lt "125000" ] && partition_size=125000
1236 LogFile "I'm guessing $c_p is $(($partition_size/1024))MB"
1237 fi
1238 fi
1239 fi
1240 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1241 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1242 if [ "$partition_mountpt" = "" ] ; then
1243 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1244 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1245 partition_mountpt="raid"
1246 partition_format="raid"
1247 else
1248 partition_mountpt="lvm"
1249 partition_format="lvm"
1250 fi
1251 fi
1252 fi
1253 psz=$partition_size
1254 LogFile "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1255 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1256 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1257 partition_mountpt="image"
1258 old_partition_fmt=$partition_format
1259 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1260 partition_size=$(($partition_size+1)); # just in case
1261 if [ "$partition_format" = "Linux" ] ; then
1262 LogFile "Are you imaging a mounted swap partition? Silly..."
1263 LogFile "Reverting format from $old_partition_fmt to $partition_format"
1264 partition_format=$old_partition_fmt
1265 fi
1266 fi
1267 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1268 LogFile "Excluding $current_partition from mountlist"
1269 continue
1270 fi
1271 if [ ! "$partition_mountpt" ] ; then
1272 LogFile "------- $FDISK -l $qq log ------------"
1273 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1274 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1275 [ "$partition_format" ] && break
1276 done
1277 LogFile "------- $FDISK log end ------------"
1278 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1279 partition_format="compaq"
1280 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1281 LogAll "Unable to find mountpoint of $current_partition - ignoring"
1282 continue
1283 fi
1284 fi
1285 if [ "$redhat_label" ]; then
1286 label="$redhat_label"
1287 elif [ "$uuid" ]; then
1288 label="$uuid"
1289 fi
1290 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1291 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1292 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1293 if [ "$current_partition" = "" ] ; then
1294 LogFile "Unknown partition (outstring = $unofficial_outstring)"
1295 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1296 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1297 partition_mountpt=raid
1298 partition_format=raid
1299 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1300 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1301 else
1302 LogFile "Unknown mountpoint (outstring = $unofficial_outstring)"
1303 fi
1304 elif [ "$partition_format" = "" ] ; then
1305 LogFile "Unknown format (outstring = $unofficial_outstring)"
1306 elif [ "$partition_size" = "" ] ; then
1307 LogFile "Unknown partition size (outstring = $unofficial_outstring)"
1308 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1309 continue
1310 else
1311 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1312 LogFile "Stupid bastard..."
1313 partition_format="vfat"
1314 fi
1315 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1316 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1317 fi
1318 done
1319}
1320
1321
1322MakeSureNumberIsInteger() {
1323 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1324 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1325 echo "result = '$res'"
1326 Die "$1 should be an integer"
1327 fi
1328}
1329
1330
1331OfferToMakeBootableISO() {
1332 local i old_pwd
1333 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1334 echo -en "Shall I make a bootable CD image? (y/[n]) "
1335 read i
1336 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1337 fi
1338 rm -Rf $MINDI_TMP/iso
1339 mkdir -p $MINDI_TMP/iso/{images,archives}
1340 cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogAll "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1341 LogFile "mindi_lib = $MINDI_LIB"
1342 for i in memdisk memtest.bin memtest.img ; do
1343 j=$MINDI_LIB/$i
1344 k=$MINDI_TMP/iso
1345 if [ -e "$j" ] ; then
1346 LogAll "Copying $j to $k"
1347 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1348 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1349 if [ _"$MONDO_SHARE" != _"" ]; then
1350 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1351 fi
1352 fi
1353 done
1354 MakeMessageFile > $MINDI_TMP/iso/message.txt
1355 cp $kernelpath $MINDI_TMP/iso/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/iso/vmlinuz). Did you run out of disk space?"
1356 cp $MINDI_TMP/initrd.img $MINDI_TMP/iso/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MINDI_TMP/iso/initrd.img. Did you run out of disk space?"
1357 if [ _"$MONDO_SHARE" != _"" ]; then
1358 cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
1359 cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
1360 fi
1361 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1362 if [ "$ARCH" != "ia64" ] ; then
1363 cp $ISOLINUX $MINDI_TMP/iso/isolinux.bin 2>> $LOGFILE || Die "Cannot copy isolinux.bin ($ISOLINUX) to $MINDI_TMP/iso - did you run out of disk space?"
1364 fi
1365 old_pwd=`pwd`
1366 cd $MINDI_TMP/iso
1367 if [ "$ARCH" != "ia64" ] ; then
1368 if [ _"$MONDO_SHARE" != _"" ]; then
1369 cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1370 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1371 fi
1372 $ISO_CMD -U $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
1373 else
1374 $ISO_CMD $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c images/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
1375 rm -f images/mindi-bootroot.$BOOT_SIZE.img
1376 fi
1377 if [ "$?" -ne "0" ] ; then
1378 LogFile "----------- $ISO_CMD's errors --------------"
1379 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1380 echo "$ISO_CMD returned the following errors:-"
1381 cat $MINDI_TMP/mkisofs.log
1382 LogAll "Failed to create ISO image."
1383 else
1384 LogAll "Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1385 fi
1386 rm -f $MINDI_TMP/mkisofs.log
1387 cd $old_pwd
1388}
1389
1390
1391OfferToMakeBootableUSB() {
1392 local i
1393 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1394 echo -n "Shall I make a bootable USB image ? (y/[n]) "
1395 read i
1396 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1397 if [ "$USBDEVICE" = "" ]; then
1398 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1399 read dev
1400 USBDEVICE=$dev
1401 fi
1402 echo "WARNING: This will erase all content on $USBDEVICE"
1403 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1404 read i
1405 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1406 fi
1407 rm -Rf $MINDI_TMP/usb
1408 mkdir -p $MINDI_TMP/usb
1409 USBPART="${USBDEVICE}1"
1410
1411 echo -en "Transforming $USBDEVICE in a Bootable device "
1412 echo -en "."
1413 LogFile "Transforming $USBDEVICE in a Bootable device"
1414 LogFile "Checking $USBDEVICE"
1415 $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1416 if [ $? -ne 0 ]; then
1417 LogAll "Unable to access $USBDEVICE"
1418 LogAll "Make sure your USB device is pluged in"
1419 exit -1
1420 fi
1421 echo -en "."
1422 LogFile "Unmounting $USBDEVICE just in case"
1423 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1424 # If your key has no MBR it may cause an issue
1425 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1426 LogFile "Preparing $USBDEVICE"
1427 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1428d
1429d
1430d
1431d
1432n
1433p
14341
1435
1436
1437t
1438b
1439a
14401
1441w
1442EOF
1443 if [ $? -ne 0 ]; then
1444 LogAll "Unable to create a vfat Filesystem on $USBDEVICE"
1445 LogAll "Make sure your USB device is pluged in"
1446 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1447 MindiExit -1
1448 fi
1449 LogFile "The USB device $USBDEVICE now looks like this:"
1450 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1451 echo -en "."
1452 LogFile "Creating a vfat filesystem on $USBPART"
1453 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1454 if [ $? -ne 0 ]; then
1455 LogAll "Unable to create a vfat filesystem on $USBPART"
1456 LogAll "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)"
1457 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1458 MindiExit -1
1459 fi
1460 echo -en "."
1461 LogFile "Mounting $USBPART on $MINDI_TMP/usb"
1462 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1463 if [ $? -ne 0 ]; then
1464 LogAll "Unable to mount $USBPART on $MINDI_TMP/usb"
1465 LogAll "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)"
1466 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1467 MindiExit -1
1468 fi
1469 echo -en "."
1470 mkdir -p $MINDI_TMP/usb/images
1471 cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogAll "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1472 echo -en "."
1473 LogFile "mindi_lib = $MINDI_LIB"
1474 for i in memdisk memtest.bin memtest.img ; do
1475 j=$MINDI_LIB/$i
1476 k=$MINDI_TMP/usb
1477 if [ -e "$j" ] ; then
1478 LogAll "Copying $j to $k"
1479 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1480 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1481 fi
1482 done
1483 echo -en "."
1484 MakeMessageFile > $MINDI_TMP/usb/message.txt
1485 echo -en "."
1486 cp $kernelpath $MINDI_TMP/usb/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/vmlinuz). Did you run out of disk space?"
1487 echo -en "."
1488 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1489 echo -en "."
1490 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1491 echo -en "."
1492 umount $MINDI_TMP/usb
1493 if [ "$ARCH" != "ia64" ] ; then
1494 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1495 if [ "$?" -ne "0" ] ; then
1496 LogAll "----------- syslinux's errors --------------" |tee -a $LOGFILE
1497 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1498 LogAll "Failed to create USB image."
1499 else
1500 echo -e "$DONE"
1501 LogFile "Created bootable USB image on $USBDEVICE"
1502 fi
1503 rm -f $MINDI_TMP/syslinux.log
1504 else
1505 echo "No USB boot support for ia64"
1506 MindiExit -1
1507 fi
1508}
1509
1510
1511MakeMessageFile() {
1512
1513 if [ -x "/bin/lsb_release" ]; then
1514 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1515 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1516 # For pb >= 0.9.8
1517 DESC=`/usr/bin/pbdistrocheck -d`
1518 else
1519 iss="/dev/null"
1520 [ -r /etc/issue.net ] && iss="/etc/issue.net"
1521 [ -r /etc/issue ] && iss="/etc/issue"
1522 DESC=`head -1 $iss`
1523 fi
1524 sed "s/ZZZZZ/$MINDI_VERSION/" $MINDI_LIB/msg-txt | sed "s/KKKKK/Kernel $KERVER/" | sed "s/AAAAA/on a $ARCH architecture/" | sed "s/TTTTT/`LC_TIME=C date`/" | sed "s/MMMMM/`hostname`/" | sed "s/DDDDD/$DESC/"
1525 if [ _"$MONDO_SHARE" != _"" ]; then
1526 if [ "$CDRECOVERY" != "yes" ] ; then
1527 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1528 echo -en "Press <enter> to continue.\n"
1529 elif [ ! "$MINDI_TMP" ] ; then
1530 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1531 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1532 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1533 fi
1534 else
1535 echo -en "$BOOT_MEDIA_MESSAGE"
1536 fi
1537 else
1538 echo -en "\
1539To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1540CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1541 fi
1542 fi
1543 echo -en "\n\n\n"
1544}
1545
1546
1547MakeBootConfFile() {
1548 local options i ooo
1549 options=""
1550 # Type of boot file (elilo or syslinux/isolinux)
1551 type=$1
1552 if [ "$type" = "elilo" ]; then
1553 sep="="
1554 else
1555 sep=" "
1556 fi
1557
1558 # Generic header for conf file
1559 if [ "$type" != "elilo" ] ; then
1560 echo -en "prompt 1\ndisplay message.txt\n"
1561 else
1562 echo -en "prompt\n"
1563 fi
1564
1565 # Compute which default option to boot from
1566 if [ "$CDRECOVERY" = "yes" ] ; then
1567 echo -en "default${sep}RESTORE\n"
1568 # In case it's mondoarchive
1569 elif [ _"$MONDO_SHARE" != _"" ]; then
1570 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1571 echo -en "default${sep}iso\n"
1572 else
1573 echo -en "default${sep}interactive\n"
1574 fi
1575 else
1576 echo -en "default${sep}expert\n"
1577 fi
1578
1579 # Handle timeout
1580 if [ "$CDRECOVERY" != "yes" ] ; then
1581 echo -en "timeout${sep}300\n"
1582 else
1583 echo -en "timeout${sep}10000\n"
1584 fi
1585 echo -en "\n"
1586
1587 # prepare which labels will be generated
1588 if [ "$CDRECOVERY" = "yes" ] ; then
1589 options="RESTORE expert"
1590 else
1591 if [ _"$MONDO_SHARE" != _"" ]; then
1592 options="interactive expert compare iso nuke isonuke"
1593 else
1594 options="expert"
1595 fi
1596 fi
1597
1598 # Generate rest of conf file
1599 for i in $options ; do
1600 ooo=$i
1601 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1602 if [ "$type" = "elilo" ]; then
1603 outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/initrd.img\n\troot=/dev/ram0 append=\" rw ramdisk_size=$ramdisk_size $ooo $ADDITIONAL_BOOT_PARAMS \"\n"
1604 else
1605 ps="/"
1606 if [ "$type" = "syslinux" ]; then
1607 ps=""
1608 fi
1609 outstr="label $i\n\tkernel ${ps}vmlinuz\n\tappend initrd=${ps}initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $ADDITIONAL_BOOT_PARAMS\n"
1610 fi
1611 echo -en "$outstr"
1612 done
1613
1614 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1615 if [ "$type" = "elilo" ]; then
1616 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1617 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1618 else
1619 ps="/"
1620 if [ "$type" = "syslinux" ]; then
1621 ps=""
1622 fi
1623 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1624 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1625 fi
1626 fi
1627}
1628
1629
1630PrepareBootDiskImage_LILO() {
1631 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1632 imagesdir=$MINDI_CACHE
1633 kernelpath=$1
1634
1635 retval=0
1636 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1637 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1638 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1639 echo -en "..."
1640 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1641 mountpoint=$MINDI_TMP/mountpoint.$$
1642 mkdir -p $mountpoint
1643 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1644 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1645 mount -t vfat -o loop $imagefile $mountpoint || LogAll "Cannot mount (PBDI)"
1646 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1647 mkdir -p $mountpoint/etc
1648 liloconf=$mountpoint/elilo.conf
1649
1650 MakeBootConfFile elilo > $liloconf
1651
1652 # Copy it so that CD-ROM menu entry is satisfied
1653 mountefi=0
1654 df -T | grep /boot/efi | grep -q vfat
1655 if [ $? -ne 0 ]; then
1656 mount /boot/efi
1657 if [ $? -ne 0 ]; then
1658 echo "You have to mount your EFI partition when using mindi"
1659 MindiExit -1
1660 fi
1661 mountefi=1
1662 fi
1663 el=`find /boot/efi -name elilo.efi`
1664 cp $el $mountpoint
1665 cp $liloconf $mountpoint
1666 if [ $mountefi -eq 1 ]; then
1667 umount /boot/efi 2>&1 > /dev/null
1668 fi
1669
1670 LogFile "Copying $MINDI_TMP/initrd.img to $mountpoint..."
1671 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1672 if [ "$?" -ne "0" ] ; then
1673 LogAll "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1674 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1675 LogAll "Please unload some of your modules and try again."
1676 rm -f $MINDI_TMP/mtpt.$$
1677 LogAll "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1678 retval=$(($retval+1))
1679 fi
1680 MakeMessageFile > $mountpoint/message.txt
1681
1682 mkdir -p $mountpoint/tmp
1683 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1684 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1685 fi
1686
1687 # copy the kernel across
1688 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1689 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1690 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1691 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1692 if [ "$?" -ne "0" ] ; then
1693 LogFile "Files at mountpoint ($mountpoint) :-"
1694 du -sk $mountpoint/* >> $LOGFILE
1695 LogFile "--- end of list of files ---"
1696 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1697Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1698 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1699 cd $old_pwd
1700 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1701 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1702 # losetup /dev/loop0 -d
1703 [ "$imagefile" != "" ] && rm -f $imagefile
1704 return 0
1705 fi
1706 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1707 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1708 LogFile "Free space left on image = $free_space KB"
1709 LogFile "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1710 # make it bootable
1711 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1712 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1713 if [ "$KERN_DISK_MADE" ] ; then
1714 LogFile "Not running LILO. It's not that kind of disk."
1715 fi
1716
1717 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1718 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1719 echo -en "..."
1720 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1721 if [ "$retval" -eq "0" ] ; then
1722 echo -en "...$DONE\n"
1723 if [ "$KERN_DISK_MADE" ] ; then
1724 LogAll "$BOOT_SIZE KB boot disks were created OK\n"
1725 fi
1726 else
1727 echo -en "...failed\n"
1728 LogAll $BOOT_SIZE"KB boot disk was NOT created\n"
1729 [ "$imagefile" != "" ] && rm -f $imagefile
1730 fi
1731 [ "$retval" -ne "0" ] && LogAll "PrepareBootDiskImage() is returning nonzero"
1732 return $retval
1733}
1734
1735
1736PrepareBootDiskImage_ISOLINUX() {
1737 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1738 imagesdir=$MINDI_CACHE
1739 kernelpath=$1
1740 do_boot_root_thingy=""
1741 local retval old_pwd
1742 retval=0
1743
1744 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1745 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1746 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
1747 echo -en "..."
1748 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1749 mountpoint=$MINDI_TMP/mountpoint.$$
1750 mkdir -p $mountpoint
1751 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1752 LogFile "Creating vfat filesystem on $imagefile"
1753 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1754 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
1755 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1756
1757 # Only move it now to its final destination abd use it now
1758 mv $imagefile $imagesdir
1759 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1760
1761 mount -t vfat -o loop $imagefile $mountpoint || LogAll "Cannot mount (PBDI)"
1762
1763 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1764 MakeMessageFile > $mountpoint/message.txt
1765 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1766 LogFile "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1767 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1768 if [ "$?" -ne "0" ] ; then
1769 LogAll "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1770 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1771 LogAll "Please unload some of your modules and try again."
1772 rm -f $MINDI_TMP/mtpt.$$
1773 LogAll "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1774 retval=$(($retval+1))
1775 fi
1776
1777 mkdir -p $mountpoint/tmp
1778 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1779 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1780 fi
1781
1782 # copy the kernel across
1783 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1784 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1785 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1786 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1787 if [ "$?" -ne "0" ] ; then
1788 LogFile "Files at mountpoint ($mountpoint) :-"
1789 du -sk $mountpoint/* >> $LOGFILE
1790 LogFile "--- end of list of files ---"
1791 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1792Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1793 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1794 cd $old_pwd
1795 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1796 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1797
1798 [ "$imagefile" != "" ] && rm -f $imagefile
1799 return 0
1800 fi
1801 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1802 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1803 LogFile "Free space left on image = $free_space KB"
1804 LogFile "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1805
1806 # make it bootable
1807 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1808 mkdir -p $mountpoint/etc
1809 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1810 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1811 echo -en "..."
1812 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1813
1814 if [ "$retval" -eq "0" ] ; then
1815 echo -en "...$DONE\n"
1816 if [ "$KERN_DISK_MADE" ] ; then
1817 [ "$imagefile" != "" ] && rm -f $imagefile
1818 LogAll "$BOOT_SIZE KB boot disks were created OK\n"
1819 fi
1820 else
1821 echo -en "...failed\n"
1822 LogAll $BOOT_SIZE"KB boot disk was NOT created\n"
1823 [ "$imagefile" != "" ] && rm -f $imagefile
1824 fi
1825 [ "$retval" -ne "0" ] && LogAll "PrepareBootDiskImage() is returning nonzero"
1826 return $retval
1827}
1828
1829
1830ParseModprobeForIncludes() {
1831local MODPROBE_CONF mpincfile includes include
1832
1833MODPROBE_CONF=/etc/modprobe.conf
1834mpincfile=$1
1835touch $mpincfile
1836if [ -a $MODPROBE_CONF ]; then
1837 includes=$(awk '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
1838 if [ -n "$includes" ]; then
1839 for include in $includes
1840 do
1841 if [ -a "$include" ]; then
1842 echo $include >> $mpincfile
1843 fi
1844 done
1845 fi
1846fi
1847}
1848
1849
1850PrepareDataDiskImages() {
1851 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
1852
1853 imagesdir=$MINDI_CACHE
1854 rm -f $imagesdir/mindi.iso
1855 needlist=$MINDI_TMP/what-we-need.txt
1856 bigdir=$MINDI_TMP/bigdir
1857 mkdir -p $bigdir/usr/bin
1858 mkdir -p $bigdir/usr/sbin
1859 includefile=$MINDI_TMP/$$.includefile.txt
1860
1861 lfiles="$DEPLIST_FILE"
1862 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1863 ParseModprobeForIncludes $includefile
1864 lines=$(($lines+`cat $includefile | wc -l`))
1865 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
1866 res=$?
1867 rm -f $includefile
1868 if [ "$YOUR_KERNEL_SUCKS" ]; then
1869 pwd=`pwd`
1870 cd $MINDI_TMP
1871 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1872 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
1873 done
1874 for i in $EXTRA_MODS ; do
1875 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1876 [ ! "$j" ] && LogFile "WARNING - cannot find failsafe module $i.o.gz"
1877 for k in $j ; do
1878 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogAll "ERROR on module $k" $MINDI_TMP/$$.log
1879 LogFile "Added failsafe module $k to ramdisk"
1880 done
1881 done
1882 cd $pwd
1883 else
1884 ListKernelModulePaths >> $needlist
1885 fi
1886 if [ "$res" -ne "0" ] ; then
1887 Die "You have $res files present in dependency list\nbut absent from filesystem."
1888 fi
1889 FindAndAddUserKeyboardMappingFile
1890 mkdir -p $bigdir/tmp
1891 if [ _"$MONDO_SHARE" != _"" ]; then
1892 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1893 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1894 fi
1895 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1896 DropOptimizedLibraries $needlist $bigdir
1897 echo -en "Assembling dependency files"
1898 CopyDependenciesToDirectory < $needlist $bigdir
1899
1900 # also copy io.sys and msdos.sys, if we can find them
1901 for i in `mount | cut -d' ' -f3` ; do
1902 for j in io.sys msdos.sys ; do
1903 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1904 done
1905 done
1906
1907 # master boot record, too
1908 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1909 if [ "$i" ] ; then
1910 LogAll "Backing up $i's MBR"
1911 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1912 sleep 1
1913 sync
1914 j=$i
1915 [ -h "$j" ] && j=`readlink -f $j`
1916 LogAll "Creating /dev/boot_device ($j)"
1917 mkdir -p $bigdir/dev
1918 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
1919 fi
1920
1921 old_pwd=`pwd`
1922 cd $bigdir
1923
1924 # Get terminfo content
1925 ti="usr/share/terminfo/l"
1926 if [ -d /$ti ]; then
1927 mkdir -p $ti
1928 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "WARNING - error occurred while copying terminfo"
1929 fi
1930 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1931 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1932 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1933 fi
1934 if [ -d "/lib/dev-state" ]; then
1935 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1936 fi
1937 cd $old_pwd
1938 echo -e "$DONE"
1939 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1940 MakeMountlist $MINDI_TMP/mountlist.txt
1941 mkdir -p $bigdir/tmp
1942 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1943 if [ _"$MONDO_SHARE" != _"" ]; then
1944 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1945 fi
1946 if [ $LVM != "false" ]; then
1947 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1948 if [ "$?" -ne "0" ]; then
1949 LVM="false"
1950 rm -f $bigdir/tmp/i-want-my-lvm
1951 fi
1952 fi
1953 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
1954 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1955 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
1956 if [ _"$MONDO_SHARE" != _"" ]; then
1957 for q in filelist.full.gz biggielist.txt ; do
1958 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1959 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1960 done
1961 fi
1962
1963 echo -en "Tarring and zipping the data content..."
1964 size_of_all_tools=`du -sk $bigdir | cut -f1`
1965 (cd $bigdir ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogAll "Problem creating all.tar.gz" $MINDI_TMP/$$.log)
1966 du -sk $imagesdir/*gz >> $LOGFILE
1967 echo -e "$DONE"
1968
1969 FRIENDLY_OUTSTRING="Boot and data disk images were created."
1970 rm -rf $bigdir
1971 rm -f $needlist
1972}
1973
1974
1975ProcessLDD() {
1976 local incoming f d nd bd bnd
1977 read incoming
1978 while [ "$incoming" != "" ]; do
1979 # We take the full path name of the dyn. lib. we want
1980 incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1981 for f in $incoming ; do
1982 # echo modified file name if one of the parent dir is a link
1983 # by replacing the original dirname by the destination of the link
1984 d="`dirname $f`"
1985 found="false"
1986 while [ "$d" != "/" ]; do
1987 if [ -h "$d" ]; then
1988 nd=`readlink -f $d`
1989 bd=`basename $d`
1990 bnd=`basename $nd`
1991 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
1992 echo $d
1993 fi
1994 d="`dirname $d`"
1995 done
1996
1997 echo "$f"
1998 echo "`ReadAllLink $f`"
1999 done
2000 read incoming
2001 done
2002}
2003
2004
2005Prompt() {
2006 echo -en "$1"
2007 read line
2008}
2009
2010
2011ReadLine() {
2012 local i incoming
2013 read incoming
2014 i=0
2015 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2016 i=$(($i+1))
2017 read incoming
2018 done
2019 echo "$incoming"
2020}
2021
2022
2023SizeOfPartition() {
2024 local devpath drive res stub
2025 device=$1
2026 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2027 res=`SizeOfRaidPartition $device`
2028 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2029 echo "$res"
2030 return 0
2031 fi
2032 # patch from Bill <bill@iwizard.biz> - 2003/08/25
2033 res=`$FDISK -s $device 2>> $LOGFILE`
2034 # end patch
2035 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2036 [ "$res" = "" ] && res="-1"
2037 echo $res
2038 return 0
2039}
2040
2041
2042SizeOfRaidPartition() {
2043 local real_dev smallest_size silly tmp
2044
2045 silly=999999999
2046 smallest_size=$silly
2047
2048 for real_dev in `GetRaidDevMembers $1` ; do
2049 tmp=`SizeOfPartition $real_dev`
2050 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2051 done
2052
2053 if [ "$smallest_size" = "$silly" ] ; then
2054 echo "-1"
2055 return 1
2056 else
2057 echo "$smallest_size"
2058 return 0
2059 fi
2060}
2061
2062
2063StripComments()
2064{
2065 local tempfile
2066
2067 tempfile=$MINDI_TMP/$$.strip.txt
2068 cp -f $1 $tempfile 2>> $LOGFILE
2069 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2070 rm -f $tempfile
2071 LogFile "Stripped comments from $2"
2072}
2073
2074
2075
2076StripExecutable()
2077{
2078 local tmpfile
2079
2080 tmpfile=$MINDI_TMP/stripped.$$.dat
2081 [ -d "$1" ] || [ -h "$1" ] && return
2082 cp -f $1 $tmpfile 2>> $LOGFILE
2083 strip $tmpfile 2> /dev/null
2084 if [ "$?" -eq "0" ] ; then
2085 cp -f $tmpfile $1 2>> $LOGFILE
2086 LogFile "Stripped binary $2"
2087 fi
2088 rm -f $tmpfile
2089}
2090
2091KernelVer() {
2092 local fkern_ver fname
2093
2094 fname=$1
2095 file $fname | grep -q gzip
2096 if [ "$?" -eq "0" ] ; then
2097 # Used by ia64
2098 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2099 else
2100 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2101 fi
2102 echo "$fkern_ver"
2103}
2104
2105
2106TryToFindKernelPath() {
2107 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2108
2109 we_want_version=$KERVERRUN
2110 possible_kernels=""
2111 duff_kernels=""
2112
2113 if [ "$ARCH" = "ia64" ] ; then
2114 root="/boot/efi/efi"
2115 else
2116 root="/"
2117 fi
2118 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2119 [ ! -e "$fname" ] && continue
2120 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2121 fkern_ver=`KernelVer $fname`
2122 [ "$fkern_ver" = "" ] && continue
2123 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2124 [ -f "$fname" ] || continue
2125 [ -h "$fname" ] && continue
2126 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2127 file $fname | grep -q gzip
2128 if [ "$?" -eq "0" ] ; then
2129 # Used by ia64
2130 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2131 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2132 duff_kernels="$fname $duff_kernels"
2133 else
2134 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2135 possible_kernels="$fname $possible_kernels"
2136 fi
2137 else
2138 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2139 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2140 duff_kernels="$fname $duff_kernels"
2141 else
2142 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2143 possible_kernels="$fname $possible_kernels"
2144 fi
2145 fi
2146 done
2147 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2148 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2149 fi
2150 if [ ! "$possible_kernels" ] ; then
2151 LogAll "No kernel matches exactly. Are there any duff kernels?"
2152 possible_kernels="$duff_kernels"
2153 if [ ! "$possible_kernels" ] ; then
2154 LogAll "Sorry, no duff kernels either"
2155 else
2156 LogAll "I bet you're running Debian or Gentoo, aren't you?"
2157 LogAll "Your kernel doesn't have a sane builddate. Oh well..."
2158 fi
2159 fi
2160 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2161 noof_kernels=`CountItemsIn "$possible_kernels"`
2162 if [ "$noof_kernels" -eq "0" ] ; then
2163 LogAll "Could not find your kernel."
2164 if [ -e "/boot/vmlinuz" ] ; then
2165 LogAll "Using /boot/vmlinuz as a last resort."
2166 output=/boot/vmlinuz
2167 else
2168 output=""
2169 fi
2170 elif [ "$noof_kernels" -eq "1" ] ; then
2171 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2172 LogFile "Your kernel is $kernelpath (v$KERVERRUN)"
2173 output="$kernelpath"
2174 else
2175 for i in $possible_kernels ; do
2176 if echo $i | grep "$KERVERRUN" ; then
2177 LogAll "OK, I used my initiative and found that "
2178 LogAll "$i is probably your kernel. "
2179 output="$i"
2180 return
2181 fi
2182 done
2183 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2184 output=/boot/vmlinuz
2185 LogFile "Schlomo, this one's for you."
2186 else
2187 LogAll "Two or more possible kernels found. You may specify any one of them and the "
2188 LogAll "boot disks will still work, probably. If one does not work, try another."
2189 LogAll "$possible_kernels"
2190 echo ""
2191 fi
2192 fi
2193 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2194}
2195
2196
2197TurnTgzIntoRdz() {
2198 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2199
2200 tgz_dir_fname=$1
2201 rdz_fname=$2
2202 kernelsize=$3
2203 maxsize=$(($BOOT_SIZE-$kernelsize))
2204 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2205 tempfile=$MINDI_TMP/temp.rd
2206 mountpoint=$MINDI_TMP/mnt1
2207 res=0
2208 echo -en "..."
2209 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2210 echo -en "..."
2211 LogFile "Creating ext2 filesystem on $tempfile"
2212 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2213 echo -en "..."
2214 mkdir -p $mountpoint
2215 mount -t ext2 -o loop $tempfile $mountpoint || Die "Cannot loopmount $tempfile to $mountpoint! The reason may be missing support for loopfs or ext2 (or both) in the running kernel."
2216 echo -en "..."
2217 old_pwd=`pwd`
2218 cd $mountpoint
2219
2220 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2221 if [ -h "/lib64" ]; then
2222 mkdir -p lib || LogAll "Unable to create lib in $mountpoint."
2223 ln -s lib lib64 || LogAll "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2224 fi
2225
2226 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2227 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2228
2229 cd dev || Die "Can't cd to dev"
2230 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2231 rm -f dev-entries.tgz
2232 cd ..
2233
2234 for w in insmod.static insmod.static.old ; do
2235 s=`which $w 2> /dev/null`
2236 if [ -e "$s" ] ; then
2237 tar cf - -C / $s 2> /dev/null | tar xf -
2238 fi
2239 done
2240
2241 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2242
2243 # Handle the case where busybox and mount are dynamically linked
2244 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2245 if [ $? -eq 0 ]; then
2246 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2247 rm -f bin/mount $MINDI_TMP/busy.lis
2248 mountlis=`grep mount $DEPLIST_FILE`
2249 for f in $MINDI_LIB/rootfs/bin/busybox $mountlis ; do
2250 if [ -f $f ]; then
2251 LocateDeps $f >> $MINDI_TMP/busy.lis
2252 fi
2253 done
2254 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in mount analysis" $MINDI_TMP/$$.log
2255 rm -f $MINDI_TMP/busy.lis
2256 fi
2257
2258 # Copy of files mandatory for ld.so
2259 cp -rp /etc/ld.so.c* $mountpoint/etc
2260
2261 # Avoid an issue on some distro (RHEL5)
2262 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2263
2264 mkdir -p $mountpoint/tmp
2265 # Management of udev (which includes modprobe in rules)
2266 ps auxww | grep -v grep | grep -qw udevd
2267 if [ $? -eq 0 ]; then
2268 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2269 LogAll "udev device manager found"
2270 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2271 # This avoids NIC remapping if on another machine at restore time on Debian at least
2272 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2273 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2274 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2275 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2276 if [ -x /sbin/udevd ]; then
2277 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2278 lis=""
2279 # Get only the files which exist in that list
2280 # and potentially their symlink structure
2281 for i in $lis2; do
2282 if [ -h $i ]; then
2283 j=$i
2284 while [ -h $j ]; do
2285 lis="$lis $j"
2286 j=`readlink $j`
2287 done
2288 lis="$lis $j"
2289 elif [ -f $i ]; then
2290 lis="$lis $i"
2291 fi
2292 done
2293 # And their deps
2294 LocateDeps $lis > $MINDI_TMP/udev.lis
2295 for i in $lis; do
2296 if [ "`echo $i | cut -c1`" = "/" ]; then
2297 j=`echo $i | cut -c2-`
2298 [ "$j" != "" ] && rm -f $j
2299 fi
2300 done
2301 tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in udev.lis analysis" $MINDI_TMP/$$.log
2302 rm -f $MINDI_TMP/udev.lis
2303 else
2304 LogAll "udevd daemon not in standard place (/sbin)"
2305 LogAll "mindi will use static devices which may cause problems"
2306 rm -f $mountpoint/tmp/USE-UDEV
2307 fi
2308 fi
2309
2310 # Management of potential HW info (Proliant only at the moment)
2311 rm -rf $MINDI_CACHE/bkphw
2312 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2313 if [ -d $MINDI_CACHE/bkphw ]; then
2314 LogAll "Hardware Information found and saved ..."
2315 cp -rp $MINDI_CACHE/bkphw .
2316 if [ -f $MINDI_CACHE/tools.files ]; then
2317 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2318 LocateDeps $lis > $MINDI_TMP/tools.lis
2319 tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2320 fi
2321 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2322 mv -f $MINDI_CACHE/mindi-rsthw .
2323 chmod 755 ./mindi-rsthw
2324 fi
2325 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2326 fi
2327
2328 # Management of perl scripts delivered needed at restore time
2329 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2330 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2331
2332 for w in cdrom groovy-stuff ; do
2333 mkdir -p mnt/$w
2334 done
2335
2336 tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in fd dev analysis" $MINDI_TMP/$$.log
2337
2338 cd $old_pwd
2339 echo -en "..."
2340 old_pwd=`pwd`
2341 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2342 cd $MINDI_TMP
2343 needed_modules_path=lib/modules/$FAILSAFE_KVER
2344 else
2345 cd /
2346 if [ "${kernelname}" != "" ]
2347 then
2348 needed_modules_path=lib/modules/${kernelname}
2349 else
2350 needed_modules_path=lib/modules/$KERVERRUN
2351 fi
2352 fi
2353
2354 needed_modules=""
2355 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2356
2357 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2358 # For PXE boot
2359 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2360 fi
2361 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2362 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2363 fi
2364 for i in $DENY_MODS; do
2365 LogFile "Removing $i from the list of modules to load"
2366 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2367 done
2368
2369 [ -e "$needed_modules_path" ] || LogAll "path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
2370 for i in $list_of_groovy_mods ; do
2371 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2372 done
2373
2374 for i in $needed_modules ; do
2375 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2376 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2377 LogFile "Adding $i ($s KB) to the rootfs"
2378 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogAll "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2379 # Uncompress modules if not using udev and native modprobe
2380 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2381 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2382 LogFile "Uncompressing $i"
2383 gunzip -f $mountpoint/$i
2384 fi
2385 fi
2386 done
2387
2388 # Also copy modules.dep in case of udev so that normal modprobe works
2389 tar cf - -C / /$needed_modules_path/modules.dep 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogAll "Unable to copy modules.dep to $mountpoint" $MINDI_TMP/$$.log
2390
2391 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2392 LogFile "Deleting devfsd daemon from ramdisk"
2393 [ ! -e "/sbin/devfsd" ] && LogFile "...because /sbin/devfsd not found"
2394 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "...because kernel is failsafe"
2395 rm -f $mountpoint/sbin/devfsd
2396 fi
2397 cd $old_pwd
2398 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2399 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2400 rm -f $mountpoint/zero
2401 if [ _"$MONDO_SHARE" != _"" ]; then
2402 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2403 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2404 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2405 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2406 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2407 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2408 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2409 [ "$USE_LZMA" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-LZMA
2410 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2411 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2412 fi
2413 mkdir -p $mountpoint/proc
2414 echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2415 # Determine what filesystem to use for initrd image
2416 LogFile "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2417 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2418 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2419 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2420 # say what will be used
2421 LogFile "Creating an $gvFileSystem initrd image..."
2422 # kernel expects linuxrc in ext2 filesystem
2423 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2424 # unmount loop filesystem and create image file using the standard approach
2425 umount $mountpoint || Die "Cannot unmount $tempfile"
2426 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2427 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2428 ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2429 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2430 rm -f ${rdz_fname}.tmp
2431 # log that we are done
2432 LogFile "...done."
2433 elif [ "$gvFileSystem" = "initramfs" ]; then
2434 # say what will be used
2435 LogFile "Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2436 # make sure that cpio is there
2437 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2438 # go into filesystem
2439 cd $mountpoint
2440 # kernel expects init in cpio filesystem
2441 ln -sf sbin/init init
2442 # create cpio image file and unmount loop filesystem
2443 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2444 cd $old_pwd
2445 umount $mountpoint || Die "Cannot unmount $tempfile"
2446 # log that we are done
2447 LogFile "...done."
2448 else
2449 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2450 fi
2451
2452 if [ "$res" -eq "0" ] ; then
2453 echo -en "..."
2454 else
2455 echo -en "\rMade an rdz WITH ERRORS. \n"
2456 fi
2457 return 0
2458}
2459
2460
2461##############################################################################
2462#----------------------------------- Main -----------------------------------#
2463##############################################################################
2464
2465# Now we can create what we need
2466mkdir -p $MINDI_TMP
2467
2468# Purge from potential old run
2469if [ _"$MINDI_CACHE" = _"" ]; then
2470 Die "MINDI_CACHE undefined"
2471fi
2472
2473if [ "$1" = "--printvar" ] ; then
2474 shift
2475 if [ _"$1" != _"" ] ; then
2476 set | grep -Ew "^$1" | cut -d= -f2
2477 fi
2478 exit 0
2479fi
2480
2481> $LOGFILE
2482LogFile "mindi v$MINDI_VERSION"
2483LogFile "$ARCH architecture detected"
2484LogFile "mindi called with the following arguments:"
2485LogFile "$@"
2486LogFile "Start date : `date`"
2487LogFile "-----------------------------"
2488
2489[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2490
2491# Log some capital variables
2492[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2493LogFile "MONDO_SHARE = $MONDO_SHARE"
2494LogFile "MINDI_LIB = $MINDI_LIB"
2495LogFile "MINDI_SBIN = $MINDI_SBIN"
2496[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2497LogFile "MINDI_CONF = $MINDI_CONF"
2498if [ -f $MINDI_CONFIG ]; then
2499 LogFile "-----------------------------"
2500 LogFile " Mindi configuration file "
2501 LogFile "-----------------------------"
2502 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2503 LogFile "-----------------------------"
2504fi
2505
2506
2507trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2508
2509# Sanity checks
2510which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2511which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2512which gawk > /dev/null 2> /dev/null || Die "Gawk is missing from your computer. Please install gawk. You may find the package on Debian's website. How did I know you're running Debian? Because only Debian would be stupid enough not to include gawk in your distribution."
2513which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2514if which awk &> /dev/null ; then
2515 if ! which gawk &> /dev/null ; then
2516 LogAll "You have awk but not gawk.\nPlease note that mindi works fine with a _sane_ awk binary.\nIf your awk binary misbehaves then please contact your vendor\nor distribution's mailing list for technical support.\n"
2517 fi
2518fi
2519which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2520[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2521
2522[ "`echo $KERVERRUN | grep "2.4.[0-6]" | grep -v "2.4.[0-9][0-9]"`" != "" ] && echo "WARNING! Your kernel may have buggy loopfs code. Consider upgrading to 2.4.7"
2523
2524# Update the PATH variable if incomplete
2525if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2526 PATH=$PATH:/sbin:/usr/sbin
2527 export PATH
2528 LogFile "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2529 LogFile "However, you may wish to ask your vendor to provide a permanent fix..."
2530 LogFile " Or you might like to call 'su -' instead of 'su', for example."
2531fi
2532
2533# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2534if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2535 source $MINDI_LIB/FindDistroFailsafe
2536 # Log kernel image
2537 LogAll "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2538else
2539 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2540fi
2541
2542if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2543 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2544fi
2545
2546### BERLIOS
2547### Fix as it's not mandatory on ia64
2548if [ "$ARCH" = "ia64" ] ; then
2549 if which elilo &> /dev/null ; then
2550 LILO_EXE=elilo
2551 else
2552 LILO_EXE=`which false 2> /dev/null`
2553 fi
2554else
2555 FindIsolinuxBinary
2556fi
2557trap "Aborted" SIGTERM
2558DONE="\r\t\t\t\t\t\t\t\tDone. "
2559kernelpath=""
2560MONDO_ROOT=/var/cache/mondo
2561mkdir -p $MONDO_ROOT
2562
2563if [ -d "/proc/lvm" ]; then
2564 # LVM v1
2565 LVMCMD=""
2566 LVM="v1"
2567elif [ -d "/dev/mapper" ]; then
2568 # LVM v2
2569 LVMCMD="lvm"
2570 LVM="v2"
2571else
2572 LVM="false"
2573fi
2574
2575if [ -e "/proc/cmdline" ]; then
2576 CMDLINE="/proc/cmdline"
2577elif [ -e "/tmp/cmdline" ]; then
2578 CMDLINE="/tmp/cmdline"
2579else
2580 CMDLINE="/dev/null"
2581fi
2582
2583LogFile "LVM set to $LVM"
2584LogFile "----------"
2585LogFile "mount result:"
2586LogFile "-------------"
2587mount >> $LOGFILE
2588LogFile "-------------"
2589if [ -e /etc/raidtab ]; then
2590 LogFile "-------------"
2591 LogFile "/etc/raidtab content:"
2592 LogFile "-------------"
2593 cat /etc/raidtab >> $LOGFILE
2594fi
2595LogFile "-------------"
2596LogFile "cat $CMDLINE"
2597LogFile "-------------"
2598cat $CMDLINE >> $LOGFILE
2599LogFile "-------------"
2600LogFile "cat /proc/swaps:"
2601LogFile "-------------"
2602cat /proc/swaps >> $LOGFILE
2603LogFile "-------------"
2604LogFile "cat /proc/partitions:"
2605LogFile "-------------"
2606cat /proc/partitions >> $LOGFILE
2607LogFile "-------------"
2608LogFile "cat /proc/filesystems:"
2609LogFile "-------------"
2610cat /proc/filesystems >> $LOGFILE
2611LogFile "-------------"
2612LogFile "lsmod result:"
2613LogFile "-------------"
2614lsmod >> $LOGFILE
2615MODULES="`cat /proc/modules | awk '{print $1}'`"
2616if [ -x /usr/sbin/esxcfg-module ]; then
2617 LogFile "-------------"
2618 LogFile "VMWare ESX server detected - Enabling dedicated support"
2619 LogFile "-------------"
2620 LogFile "VMWare modules"
2621 LogFile "-------------"
2622 /usr/sbin/esxcfg-module -l >> $LOGFILE
2623 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | awk '{print $1}'`"
2624fi
2625LogFile "FORCE_MODS:"
2626LogFile "-------------"
2627LogFile $FORCE_MODS
2628LogFile "-------------"
2629LogFile "DENY_MODS:"
2630LogFile "-------------"
2631LogFile $DENY_MODS
2632LogFile "-------------"
2633LogFile "df result:"
2634LogFile "----------"
2635df -T >> $LOGFILE
2636LogFile "-------------"
2637LogFile "Liste of extra modules is:"
2638LogFile "$EXTRA_MODS"
2639LogFile "-------------"
2640
2641# Compute libata version
2642laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
2643# If libata v2 is used then remove ide-generic as it will perturbate boot
2644if [ "`echo $MODULES | grep libata`" ]; then
2645 if [ "$laver" = "2" ]; then
2646 DENY_MODS="$DENY_MODS ide-generic"
2647 LogFile "ide-generic removed from module list as your system uses libata v2+"
2648 LogFile "-------------"
2649 fi
2650fi
2651
2652FLOPPY_WAS_MOUNTED=""
2653for mtpt in /media/floppy /mnt/floppy /floppy ; do
2654 if mount | grep -w $mtpt &> /dev/null ; then
2655 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2656 umount $mtpt
2657 fi
2658done
2659
2660#
2661# If we have a USB device we need to store info
2662# and remove it from the parameters line
2663#
2664if [ "$#" -ne "0" ] ; then
2665 if [ "$1" = "--usb" ] ; then
2666 shift
2667 USBDEVICE=$1
2668 if [ _"$USBDEVICE" = _"" ]; then
2669 Die "No USB device specified"
2670 fi
2671 shift
2672 fi
2673fi
2674
2675if [ "$#" -ne "0" ] ; then
2676 if [ "$1" = "--findkernel" ] ; then
2677 res=`TryToFindKernelPath`
2678 # Avoids logfile content for mondo
2679 export MONDO_SHARE=""
2680 if [ "$res" = "" ] ; then
2681 MindiExit -1
2682 else
2683 echo "$res"
2684 MindiExit 0
2685 fi
2686 elif [ "$1" = "--locatedeps" ] ; then
2687 [ ! "$2" ] && Die "Please specify the binary to look at"
2688 LocateDeps $2
2689 # Avoids logfile content for mondo
2690 export MONDO_SHARE=""
2691 MindiExit $?
2692 elif [ "$1" = "--readalllink" ] ; then
2693 [ ! "$2" ] && Die "Please specify the binary to look at"
2694 ReadAllLink $2
2695 # Avoids logfile content for mondo
2696 export MONDO_SHARE=""
2697 MindiExit $?
2698 elif [ "$1" = "--makemountlist" ] ; then
2699 [ ! "$2" ] && Die "Please specify the output file"
2700 MakeMountlist $2
2701 # Avoids logfile content for mondo
2702 export MONDO_SHARE=""
2703 MindiExit $?
2704 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2705 echo "Mindi v$MINDI_VERSION"
2706 # Avoids logfile content for mondo
2707 export MONDO_SHARE=""
2708 MindiExit 0
2709 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2710 MONDO_TMP=$2
2711 # Change MINDI_TMP for the one provided by mondo
2712 # So that it can get back the built files
2713 if [ _"$MONDO_TMP" = _"" ]; then
2714 Die "MONDO_TMP is empty, aborting"
2715 fi
2716 if [ _"$MONDO_TMP" = _"/" ]; then
2717 Die "MONDO_TMP is /, aborting"
2718 fi
2719 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2720 rmdir $MINDI_TMP
2721 export MINDI_TMP=$MONDO_TMP
2722 mkdir -p $MINDI_TMP
2723
2724 # This is the scratch dir in mondo - subdir images
2725 MINDI_CACHE=$3
2726
2727 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2728###
2729### Sq-Modification...
2730### Attempt to locate kernel specific module path
2731### if module path is found then use it other wise use uname -r to set it...
2732###
2733 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2734 LogAll "kernelname = $kernelname"
2735 LogAll "kernelpath = $kernelpath"
2736 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2737 then
2738 LogAll "Module path for ${kernelpath} not found..."
2739 LogAll "using running kernel\'s modules."
2740 kernelname=$KERVERRUN
2741 else
2742 LogAll "Using modules for kernel: ${kernelname}"
2743 fi
2744###
2745### end of Sq-Modification
2746###
2747 TAPEDEV=$5
2748 TAPESIZE=$6
2749 FILES_IN_FILELIST=$7
2750 USE_LZO=$8
2751 CDRECOVERY=$9
2752 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2753 IMAGE_DEVS=""
2754 else
2755 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2756 fi
2757 if [ "${11}" ] ; then
2758 LILO_OPTIONS=""
2759 # LogAll "LILO will use conservative settings, to be compatible with older BIOSes."
2760 fi
2761 LAST_FILELIST_NUMBER=${12}
2762 ESTIMATED_TOTAL_NOOF_SLICES=${13}
2763 EXCLUDE_DEVS="${14}"
2764 USE_COMP="${15}"
2765 USE_LILO="${16}"
2766 USE_STAR="${17}"
2767 INTERNAL_TAPE_BLOCK_SIZE="${18}"
2768 DIFFERENTIAL="${19}"
2769 USE_GZIP="${20}"
2770 USE_LZMA="${21}"
2771 NOT_BOOT="${22}"
2772 [ "$USE_COMP" = "" ] && USE_COMP=yes
2773 [ "$USE_GZIP" = "" ] && USE_GZIP=no
2774 [ "$USE_LZMA" = "" ] && USE_LZMA=no
2775 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2776 [ "$TAPEDEV" ] && LogAll "This is a tape-based backup. Fine."
2777 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2778 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2779 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2780 then
2781 LogAll "Module path for ${kernelpath} not found..."
2782 LogAll "using running kernel\'s modules."
2783 kernelname=$KERVERRUN
2784 else
2785 LogAll "Using modules for kernel: ${kernelname}"
2786 fi
2787 # MONDO_ROOT is the real scratchdir
2788 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2789 if [ _"$MONDO_ROOT" != _"" ]; then
2790 mkdir -p $MONDO_ROOT
2791 else
2792 Die "MONDO_ROOT is undefined"
2793 fi
2794 else
2795 LogScreen "Syntax: mindi (--custom ....)"
2796 MindiExit -1
2797 fi
2798fi
2799
2800if [ _"$MINDI_CACHE" != _"" ]; then
2801 rm -rf $MINDI_CACHE/* 2> /dev/null
2802 mkdir -p $MINDI_CACHE
2803fi
2804
2805[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2806
2807if [ _"$MONDO_SHARE" = _"" ]; then
2808 LogAll "Mindi Linux mini-distro generator v$MINDI_VERSION"
2809 LogAll "Latest Mindi is available from http://www.mondorescue.org"
2810 LogAll "BusyBox sources are available from http://www.busybox.net"
2811 LogAll "------------------------------------------------------------------------------"
2812else
2813 LogFile "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
2814fi
2815if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2816 LogAll "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2817else
2818 LogAll "Unable to find mindi-busybox, please install it"
2819 MindiExit -1
2820fi
2821
2822# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2823insmod /lib/modules/$KERVERRUN/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2824for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2825 insmod $i >> $LOGFILE 2>> $LOGFILE
2826done
2827
2828KERN_DISK_MADE=""
2829
2830LogFile "DIFFERENTIAL = $DIFFERENTIAL"
2831LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
2832LogFile "NOT_BOOT = '$NOT_BOOT'"
2833if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2834 LogAll "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2835 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2836 MakeMountlist $MINDI_TMP/mountlist.txt
2837 mkdir -p $MINDI_TMP/small-all/tmp
2838 cd $MINDI_TMP/small-all
2839 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
2840 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
2841 sleep 2
2842 LogAll "Done. Exiting."
2843 MindiExit 0
2844fi
2845
2846if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2847 LogAll "Including the generation of a Bootable USB device on $USBDEVICE"
2848fi
2849
2850if [ "$kernelpath" = "" ] ; then
2851 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2852 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2853 read ch
2854 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2855 USE_OWN_KERNEL="yes"
2856 else
2857 USE_OWN_KERNEL="no"
2858 fi
2859 if [ "$USE_OWN_KERNEL" = "yes" ]; then
2860 YOUR_KERNEL_SUCKS=""
2861 kernelpath=`TryToFindKernelPath`
2862 if [ "$kernelpath" = "" ] ; then
2863 echo -n "Please enter kernel path : "
2864 read kernelpath
2865 fi
2866 else
2867 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2868 fi
2869fi
2870if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2871 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2872 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2873 source $MINDI_LIB/FindDistroFailsafe
2874 # Log kernel image
2875 LogAll "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2876 kernelpath="$FAILSAFE_KBIN"
2877 LogAll "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2878 LogAll "The failsafe kernel is $kernelpath.\n"
2879 LogAll "However, you are still running your kernel. If Mindi fails to create your\n"
2880 LogAll "disks then it may still be a result of a problem with your kernel.\n"
2881 pwd=`pwd`
2882 cd $MINDI_TMP
2883 mkdir -p lib/modules
2884 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2885 cd $pwd
2886 else
2887 kernelpath=$MINDI_LIB/vmlinuz
2888 LogAll "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2889 LogAll "However, you are still running your kernel. If Mindi fails to create your"
2890 LogAll "disks then it may still be a result of a problem with your kernel."
2891 pwd=`pwd`
2892 cd $MINDI_TMP
2893 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2894 cd $pwd
2895 fi
2896 YOUR_KERNEL_SUCKS="Your kernel sucks"
2897fi
2898LogFile "Mindi's temp dir=$MINDI_TMP"
2899LogFile "Mindi's output dir=$MINDI_CACHE"
2900[ "$(($RANDOM%64))" -eq "0" ] && LogAll "Dude, I've looked inside your computer and it's really dusty..."
2901
2902[ "$YOUR_KERNEL_SUCKS" ] && [ ! "$FAILSAFE_KVER" ] && Die "Please install mindi-kernel package. You need it.\nGo to http://www.mondorescue.org and download it, then install it."
2903
2904PrepareDataDiskImages
2905
2906ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2907rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2908export ramdisk_size=$rds
2909
2910LogFile "Ramdisk will be $ramdisk_size KB"
2911if [ "$ARCH" = "ia64" ] ; then
2912 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2913else
2914 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2915fi
2916
2917[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2918...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2919
2920if [ _"$MONDO_SHARE" = _"" ]; then
2921 ListImagesForUser
2922 OfferToMakeBootableISO
2923 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2924 OfferToMakeBootableUSB
2925 fi
2926 LogAll "Finished."
2927elif [ "$TAPEDEV" ] ; then
2928 if [ "$ARCH" != "ia64" ] ; then
2929 # We need to keep the img file as boot file for ia64 platform
2930 rm -f $MINDI_CACHE/{*img,*iso}
2931 else
2932 rm -f $MINDI_CACHE/*iso
2933 fi
2934 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2935 OfferToMakeBootableUSB
2936 fi
2937 OfferToMakeBootableISO
2938 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2939 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2940 else
2941 Die "Cannot find all.tar.gz, to be written to tape"
2942 fi
2943elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2944 OfferToMakeBootableUSB
2945else
2946 OfferToMakeBootableISO
2947fi
2948# cleanup
2949LogAll "$FRIENDLY_OUTSTRING"
2950for mtpt in $FLOPPY_WAS_MOUNTED ; do
2951 mount $mtpt
2952done
2953MindiExit 0
Note: See TracBrowser for help on using the repository browser.