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

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