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

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

Adds preliminary Hardware support to mindi (Proliant SSSTK)
Not tested yet, just coded, and saved in SVN as a backup :-)

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