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

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