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

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