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

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

elilo.efi is now searched throughout /boot/efi and not in a fixed place as there is no standard

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