source: MondoRescue/branches/stable/mindi/mindi@ 957

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

Preliminary UUID support (for Ubuntu and VMWare)
(they are not yet restored, just handled in mindi)

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