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

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

Do not use compare to -1 rather != 0

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