source: MondoRescue/branches/2.2.5/mindi/mindi@ 1575

Last change on this file since 1575 was 1575, checked in by Bruno Cornec, 17 years ago

Fix a bug in interactive mode on ia64 where lilo wasn't forced.

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