source: MondoRescue/branches/2.2.8/mindi/mindi@ 2798

Last change on this file since 2798 was 2798, checked in by Bruno Cornec, 13 years ago

r2169@localhost (orig r2168): bruno | 2009-03-18 15:47:08 +0100

  • Attempt to fix a bug with nosegneg optimized libs on RHEL, where some are still missing at restore time.


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