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

Last change on this file since 1715 was 1715, checked in by Bruno Cornec, 16 years ago

We also need vaft format support for USB boot

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