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

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

Links were not correctly done as non relative for modules in mindi

  • Property svn:keywords set to Rev Id
File size: 122.2 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 1728 2007-10-28 18:57:03Z 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."
881 local lcMagicInitfs="<6>checking if image is initramfs..."
882
883 # local variables
884 local lvOffset
885 local lvScanRes
886 local lvUseFilesystem
887
888 # say where we are.
889 echo " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage.\n" >> $LOGFILE
890
891 # verify that file exists
892 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
893
[1566]894 # Kernel may be gzip compressed
895 file $lvKernelImage 2>&1 | grep -q gzip
896 if [ $? -eq 0 ]; then
897 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -e "$lcMagicCramfs" -e "$lcMagicExt2fs" -e "$lcMagicInitfs"`
898 else
899 # get offet of gzip magic "1f8b0800" in file
900 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}'`
901 [ $lvOffset -eq 0 ] && Die "gzip magic not found in file $lvKernelImage. Terminating."
902 lvOffset=`expr $lvOffset / 2`
903 echo " GetInitrdFilesystemToUse(): gzip magic found at lvOffset $lvOffset.\n" >> $LOGFILE
[1230]904
[1566]905 # scan kernel image for initrd filessystem support
906 lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | gunzip -c 2> /dev/null | strings | grep -e "$lcMagicCramfs" -e "$lcMagicExt2fs" -e "$lcMagicInitfs"`
907 fi
[1230]908
909 # determine which filesystem to use for initrd image: ext2fs, gzip'ed cpio (initramfs ) or cramfs
910 if [ `echo $lvScanRes | grep -c "$lcMagicExt2fs"` -eq 1 ]; then
911 lvUseFilesystem="ext2fs"
912 elif [ `echo $lvScanRes | grep -c "$lcMagicInitfs"` -eq 1 ]; then
913 lvUseFilesystem="initramfs"
914 elif [ `echo $lvScanRes | grep -c "$lcMagicCramfs"` -eq 1 ]; then
915 lvUseFilesystem="cramfs"
916 else
917 lvUseFilesystem="UNSUPPORTED"
918 fi
919
920 # say what we are using
921 echo " GetInitrdFilesystemToUse(): Filesytem to use for initrd is $lvUseFilesystem.\n" >> $LOGFILE
922
923 # return file system to use
924 echo "$lvUseFilesystem"
925
926}
927
[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
[957]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 ' ' '`"
[976]1253 printf " %-15s %-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
1505 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
[963]1506 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
[976]1507 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label" $uuid`
[747]1508 if [ "$current_partition" = "" ] ; then
1509 echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1510 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1511 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1512 partition_mountpt=raid
1513 partition_format=raid
[976]1514 printf "\t%-15s %-15s %-15s %7s %-15s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label" $uuid | tee -a $LOGFILE
1515 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" $uuid >> $mountlist
[747]1516 else
1517 echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1518 fi
1519 elif [ "$partition_format" = "" ] ; then
1520 echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1521 elif [ "$partition_size" = "" ] ; then
1522 echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1523 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1524 continue
1525 else
1526 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1527 echo "Stupid bastard..." >> $LOGFILE
1528 partition_format="vfat"
1529 fi
[976]1530 printf "\t%-15s %-15s %-15s %7s %-15s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$redhat_label" $uuid | tee -a $LOGFILE
1531 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$redhat_label" $uuid >> $mountlist
[747]1532 fi
1533 done
1534}
1535
1536
1537MakeSureNumberIsInteger() {
1538 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1539 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1540 echo "result = '$res'"
1541 Die "$1 should be an integer"
1542 fi
1543}
1544
1545
1546MakeSyslinuxMessageFile() {
1547 mkdir -p $1
1548 rmdir $1
1549 echo -en " " > $1
1550 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1551 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s%DDDDD%"Debian GNU\/`uname -s` `cut -d ' ' -f 3 /etc/issue.net` `hostname`"% | sed s/KKKKK/"Kernel `uname -r` on a `uname -m`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ >> $1.tmp
1552 else
1553 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s/DDDDD/"`grep -i "linux" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/KKKKK/"`grep -i "kernel" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/' '\\r' 'on' 'an' '\/' '`uname -r`' 'on' 'an' '`uname -m`/ >> $1.tmp
1554 fi
1555 sed s/%r/"`uname -r`"/ $1.tmp | sed s/%t/"`hostname`"/ > $1
1556 rm -f $1.tmp
1557 if [ "$CDRECOVERY" != "yes" ] ; then
[940]1558 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1559 echo -en "Press <enter> to continue.\n" >> $1
[940]1560 elif [ ! "$MINDI_TMP" ] ; then
[747]1561 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n" >> $1
1562 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1563 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n" >> $1
1564 fi
1565 else
1566 echo -en "$BOOT_MEDIA_MESSAGE" >> $1
1567 fi
1568 else
1569 echo -en " \
1570To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1571CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n" >> $1
1572 fi
1573}
1574
1575
1576MoveHyperlinkSensibly() {
1577 local filename minidir_root resides_on_diskno noof_disks old_diskno d old_pwd
1578 filename=$1
1579 minidir_root=$2
1580 resides_on_diskno=$3
1581 noof_disks=$4
1582
1583 [ -h "$minidir_root/$resides_on_diskno/$filename" ] || Die "$filename isn't a softlink (or doesn't exist): how can I move it sensibly?"
1584
1585 old_diskno=$resides_on_diskno
1586 d=1
1587 while [ "$d" -le "$noof_disks" ] ; do
1588 if [ "$d" -ne "$old_diskno" ] ; then
1589 old_pwd=`pwd`
1590 cd $minidir_root/$old_diskno
[963]1591 cp --parents -Rdf $filename $minidir_root/$d/ 2>> $LOGFILE || Die "Can't move $filename (sensibly) from $old_diskno to $d"
[747]1592 rm -f $filename
1593 cd $old_pwd
1594 fi
1595# when the softlink is resolvable, our work here is done
1596 [ -e "$minidir_root/$d/$filename" ] && return 0
1597 old_diskno=$d
1598 d=$(($d+1))
1599 done
1600 return 1
1601}
1602
1603
1604
1605OfferToCopyImagesToDisks() {
1606 local imagesdir i imagename dev count boot_dev data_dev
1607 imagesdir=$1
1608 boot_dev=$2
1609 data_dev=$3
[925]1610
[966]1611 echo -en "Would you like to create boot+data floppy disks now (y/[n]) ?"
[747]1612 read i
1613 [ "$i" != "y" ] && [ "$i" != "Y" ] && return
1614 mount | grep -F /dev/fd > /dev/null && Die "Please unmount your floppies first."
1615 echo "WARNING! THIS WILL ERASE YOUR FLOPPY DISKS."
1616 [ ! -e "$boot_dev" ] && Die "Cannot find $boot_dev - is your Linux distro broken?"
1617 [ ! -e "$data_dev" ] && Die "Cannot find $data_dev - is your Linux distro broken?"
1618 i=`find $imagesdir -type f | grep -F "/mindi-root.1" 2> /dev/null`
[1282]1619 j=`find $imagesdir -type f | grep -F "/mindi-boot" | grep -Ev "2880|$BOOT_SIZE"`
[747]1620 if [ "$i" ] ; then
1621 CopyImageToDisk $j $data_dev "boot disk"
1622 CopyImageToDisk $i $data_dev "root disk"
1623 else
1624 CopyImageToDisk $j $boot_dev "boot/root disk"
1625 fi
1626 count=1
1627 for i in `find $imagesdir | grep -F mindi-data` ; do
1628 CopyImageToDisk $i $data_dev "data disk #$count"
1629 count=$(($count+1))
1630 done
1631}
1632
1633
1634OfferToMakeBootableISO() {
1635 local i old_pwd
[1684]1636 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[966]1637 echo -en "Shall I make a bootable CD image? (y/[n]) "
[747]1638 read i
1639 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1640 fi
[940]1641 if [ ! "$MINDI_TMP" ] ; then
[963]1642 LogIt "NB: Mindi's bootable CD always uses isolinux."
1643 LogIt "For a bootable CD w/LILO, please use Mondo."
[747]1644 fi
[940]1645 rm -Rf $MINDI_TMP/iso
1646 mkdir -p $MINDI_TMP/iso/{images,archives,isolinux}
[963]1647 cp -f $1/*.img $1/*.gz $MINDI_TMP/iso/images 2>> $LOGFILE || LogIt "OfferToMakeBootableISO: Cannot copy $i to $MINDI_TMP/iso/images"
[747]1648 old_pwd=`pwd`
[940]1649 cd $MINDI_TMP/iso
[747]1650 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1651 for i in memdisk memtest.bin memtest.img ; do
[953]1652 j=$MINDI_LIB/$i
1653 k=$MINDI_TMP/iso/isolinux
1654 if [ -e "$j" ] ; then
[963]1655 LogIt "Copying $j to $k"
[953]1656 cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1657 cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1658 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1659 fi
[747]1660 done
[940]1661 MakeSyslinuxMessageFile $MINDI_TMP/iso/isolinux/message.txt
[1010]1662 cp $kernelpath $MINDI_TMP/iso/isolinux/vmlinuz 2> /dev/null || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MINDI_TMP/iso/isolinux/vmlinuz). Did you run out of disk space?"
1663 cp $kernelpath $MONDO_ROOT/vmlinuz 2> /dev/null || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
[963]1664 cp $MINDI_TMP/mindi.rdz $MINDI_TMP/iso/isolinux/initrd.img 2>> $LOGFILE
[1010]1665 cp $MINDI_TMP/mindi.rdz $MONDO_ROOT/initrd.img 2>> $LOGFILE
[747]1666 [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
[940]1667 cd $MINDI_TMP/iso/isolinux
1668 cat $iso_cfg_file | HackSyslinuxFile $ramdisk_size $MINDI_TMP/iso > isolinux.cfg || Die "Cannot copy isolinux.cfg from mindi_home to tmp_root - did you run out of disk space?"
1669 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1670 mv isolinux.cfg isolinux.cfg.old
1671 sed s/interactive/iso/ isolinux.cfg.old > isolinux.cfg
1672 fi
1673 if [ "$ARCH" != "ia64" ] ; then
[953]1674 cp $ISOLINUX isolinux.bin 2> /dev/null || Die "Cannot copy isolinux.bin ($ISOLINUX) to tmp_root - did you run out of disk space?"
[963]1675 cp $ISOLINUX ../ 2>> $LOGFILE
[747]1676 fi
[940]1677 cd $MINDI_TMP/iso
[747]1678 if [ "$ARCH" != "ia64" ] ; then
[953]1679 cp -f $MINDI_TMP/iso/isolinux/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2> /dev/null || Die "Cannot copy core files to ramdisk for boot disk. Did you run out of disk space?"
[747]1680 fi
[963]1681 [ "$MONDO_SHARE" ] && cp -f $MONDO_SHARE/autorun . 2>> $LOGFILE
[747]1682 if [ "$ARCH" != "ia64" ] ; then
[940]1683 mkisofs -U -J -r -o $CACHE_LOC/mindi.iso -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
[747]1684 else
[1282]1685 mkisofs -J -r -o $CACHE_LOC/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c isolinux/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
[747]1686 fi
1687 if [ "$?" -ne "0" ] ; then
[925]1688 echo "----------- mkisofs's errors --------------" >> $LOGFILE
[940]1689 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
[925]1690 echo "mkisofs returned the following errors:-"
[940]1691 cat $MINDI_TMP/mkisofs.log
[963]1692 LogIt "Failed to create ISO image."
[747]1693 else
[925]1694 echo "Created bootable ISO image at $CACHE_LOC/mindi.iso" >> $LOGFILE
[747]1695 fi
[940]1696 rm -f $MINDI_TMP/mkisofs.log
[747]1697 cd $old_pwd
1698}
1699
1700
[1684]1701OfferToMakeBootableUSB() {
1702 local i old_pwd
1703 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1704 echo "Shall I make a bootable USB image ?"
[1722]1705 if [ "$USBDEVICE" != "" ]; then
1706 echo -en "WARNING: This will erase all content on $USBDEVICE ([y]/n) "
1707 read i
1708 [ "$i" = "n" ] || [ "$i" = "N" ] && return 0
1709 else
1710 echo -en "WARNING: This will erase all content on $USBDEVICE (y/[n]) "
1711 read i
1712 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1713 fi
[1684]1714 fi
1715 if [ _"$MINDI_TMP" = _"" ]; then
1716 Die "MINDI_TMP undefined"
1717 fi
1718 rm -Rf $MINDI_TMP/usb
1719 mkdir -p $MINDI_TMP/usb
1720 USBPART="${USBDEVICE}1"
1721
1722 echo -en "Transforming $USBDEVICE in a Bootable device "
1723 echo -en "."
1724 echo "Transforming $USBDEVICE in a Bootable device" >> $LOGFILE
1725 echo "Checking $USBDEVICE" >> $LOGFILE
1726 $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1727 if [ $? -ne 0 ]; then
1728 echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1729 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1730 exit -1
1731 fi
1732 echo -en "."
[1691]1733 echo "Unmounting $USBDEVICE just in case" >> $LOGFILE
[1721]1734 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
[1684]1735 echo "Erasing $USBDEVICE" >> $LOGFILE
[1721]1736 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
[1684]1737d
1738d
1739d
1740d
1741n
1742p
17431
1744
1745
1746t
1747b
1748a
17491
1750w
1751EOF
1752 if [ $? -ne 0 ]; then
1753 echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1754 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1755 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1756 MindiExit -1
1757 fi
1758 echo -en "."
1759 echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
[1688]1760 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
[1684]1761 if [ $? -ne 0 ]; then
1762 echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1763 echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1764 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1765 MindiExit -1
1766 fi
1767 echo -en "."
1768 echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1769 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1770 if [ $? -ne 0 ]; then
1771 echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1772 echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1773 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1774 MindiExit -1
1775 fi
1776 echo -en "."
[1691]1777 mkdir -p $MINDI_TMP/usb/images
1778 cp -f $1/*.img $1/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogIt "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
[1684]1779 echo -en "."
1780 old_pwd=`pwd`
1781 cd $MINDI_TMP/usb
1782 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1783 for i in memdisk memtest.bin memtest.img ; do
1784 j=$MINDI_LIB/$i
1785 k=$MINDI_TMP/usb
1786 if [ -e "$j" ] ; then
1787 LogIt "Copying $j to $k"
1788 cp -f $j $k 2> /dev/null || Die "Failed to copy $j to $k"
1789 cp -f $j $MINDI_TMP 2> /dev/null || Die "Failed to copy $j to $MINDI_TMP"
1790 fi
1791 done
1792 echo -en "."
1793 MakeSyslinuxMessageFile $MINDI_TMP/usb/message.txt
1794 echo -en "."
1795 cp $kernelpath $MINDI_TMP/usb/vmlinuz 2> /dev/null || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/syslinux/vmlinuz). Did you run out of disk space?"
1796 echo -en "."
1797 cp $MINDI_TMP/mindi.rdz $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1798 echo -en "."
1799 [ -e "$iso_cfg_file" ] || Die "FIXME - unable to find $iso_cfg_file - this should never occur"
1800 cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $MINDI_TMP/usb > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to $MINDI_TMP/usb - did you run out of disk space?"
1801 echo -en "."
1802 if [ "$NFS_DEV" != "" ] ; then
1803 perl -pi -e 's/interactive/iso/' syslinux.cfg
1804 fi
1805 cd $old_pwd
1806 echo -en "."
[1721]1807 umount $MINDI_TMP/usb
[1684]1808 if [ "$ARCH" != "ia64" ] ; then
1809 syslinux $USBPART 2>> $MINDI_TMP/syslinux.log
1810 if [ "$?" -ne "0" ] ; then
1811 echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1812 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1813 LogIt "Failed to create USB image."
1814 else
1815 echo -e "$DONE"
1816 echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1817 fi
1818 rm -f $MINDI_TMP/syslinux.log
1819 else
1820 echo "No USB boot support for ia64" | tee -a $LOGFILE
1821 MindiExit -1
1822 fi
1823 echo -en "."
1824}
1825
1826
[747]1827PluralOrNot() {
1828 [ "$1" -gt "1" ] && echo -en "s"
1829}
1830
1831
1832MakeMessageFile() {
1833 local disksize
1834 disksize=$1
1835 if [ "`grep -Fi "debian" /etc/issue.net 2> /dev/null`" ] ; then
1836 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s%DDDDD%"Debian GNU\/`uname -s` `cut -d ' ' -f 3 /etc/issue.net` `hostname`"% | sed s/KKKKK/"Kernel `uname -r` on a `uname -m`"/ | sed s/TTTTT/"`LC_TIME=C date`"/
1837 else
1838 sed s/ZZZZZ/$MINDI_VERSION/ $MINDI_LIB/msg-txt | sed s/YYYYY/"Mondo Rescue"/ | sed s/XXXXX/"a cousin of"/ | sed s/DDDDD/"`grep -i "linux" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/KKKKK/"`grep -i "kernel" /etc/issue.net | head -n1 | tr -s ' ' ' '`"/ | sed s/TTTTT/"`LC_TIME=C date`"/ | sed s/' 'r' 'on' 'an' 'm/' '`uname -r`' 'on' 'an' '`uname -m`/
1839 fi
1840 if [ "$disksize" -gt "2880" ] ; then
[1335]1841 if [ _"$MONDO_SHARE" != _"" ] ; then
[925]1842 if [ "$CDRECOVERY" != "yes" ] ; then
[940]1843 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[925]1844 echo -en "Press <enter> to continue.\n"
[940]1845 elif [ ! "$MINDI_TMP" ] ; then
[925]1846 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1847 else
1848 echo -en "$BOOT_MEDIA_MESSAGE"
1849 fi
[747]1850 fi
1851 fi
1852 fi
1853 if [ "$CDRECOVERY" = "yes" ] ; then
1854 echo -en "\
1855To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1856CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1857 fi
1858 echo -en "\n\n\n"
1859}
1860
1861
1862write_full_floppy_of_kernel() {
1863 local mtpt image old_pwd res disksize
1864
1865 res=0
1866 old_pwd=`pwd`
1867 KERN_DISK_MADE=1
1868 disksize=$3
1869 rand1=$RANDOM
1870 rand2=$RANDOM
[940]1871 image=$MINDI_TMP/$rand1.$rand2.img
1872 mtpt=$MINDI_TMP/$rand1.$rand2.mtpt
[963]1873 dd if=/dev/zero of=$image bs=1k count=$disksize &> /dev/null
[964]1874 mke2fs -N 26 -F $image &> /dev/null
[747]1875 mkdir -p $mtpt
1876 mount -o loop $image $mtpt
1877 cd $mtpt
1878 mkdir -p {dev,tmp,boot}
[963]1879 cp -f $1 vmlinuz 2>> $LOGFILE
[747]1880 if [ "$?" -ne "0" ] ; then
[963]1881 LogIt "Failed to copy $1 to ramdisk"
[747]1882 cd $old_pwd
1883 umount $mtpt
1884 rmdir $mtpt
1885 rm $image
1886 return 1
1887 fi
1888
1889 rdev vmlinuz 2,0
1890 rdev -R vmlinuz 0
1891 rdev -r vmlinuz 49152
1892
[963]1893 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz"
[1311]1894 # BERLIOS : Useless and generating errors on CentOS ? (losetup miss a param)
[1301]1895 #losetup /dev/loop0 > /dev/null 2> /dev/null
1896 #[ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary."
[747]1897 CopyBootBFile $mtpt/boot.b
1898
1899 MakeLiloConfFile $disksize >> bdlilo.conf
1900
1901 chmod 644 bdlilo.conf
1902 MakeMessageFile $disksize > message
1903 lilo -v -C bdlilo.conf -r $mtpt
1904 res=$?
1905
1906 cd $old_pwd
1907 umount $mtpt
1908 mv -f $image $2
1909 rmdir $mtpt
1910
1911 return $res
1912}
1913
1914
1915MakeLiloConfFile() {
1916 local disksize options i ooo
1917 disksize=$1
1918 options=""
[925]1919
1920 if [ "$ARCH" != "ia64" ] ; then
1921 echo -en "boot=/dev/loop0\ndisk=/dev/loop0\n"
1922 fi
1923 if [ "$disksize" -eq "2880" ] ; then
1924 echo -en "bios=0x00\nsectors=36\nheads=2\ncylinders=80\n"
1925 elif [ "$disksize" -eq "1722" ] ; then
1926 echo -en "bios=0x00\nsectors=21\nheads=2\ncylinders=82\n"
1927 elif [ "$disksize" -gt "2880" ] ; then
1928 /bin/true
1929 else
1930 echo -en "bios=0x00\nsectors=18\nheads=2\ncylinders=80\n"
1931 fi
1932 if [ "$ARCH" != "ia64" ] ; then
1933 echo -en "install=/boot.b\nmap=/boot.map\n"
1934 fi
[747]1935 if [ "$CDRECOVERY" = "yes" ] ; then
1936 echo -en "default=RESTORE\n"
[1335]1937 elif [ "$disksize" -gt "2880" ] && [ _"$MONDO_SHARE" != _"" ] ; then
[940]1938 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1939 echo -en "default=iso\n"
1940 else
1941 echo -en "default=interactive\n"
1942 fi
1943 else
1944 echo -en "default=expert\n"
1945 fi
1946
1947 echo -en "prompt\n"
1948 if [ "$ARCH" != "ia64" ] ; then
1949 echo -en "vga=normal\nbackup=/dev/null\nmessage=/message\n"
1950 fi
1951 if [ "$CDRECOVERY" != "yes" ] ; then
[925]1952 echo -en "timeout=300\n"
[747]1953 fi
1954 echo -en "\n"
1955 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1956 options="RESTORE expert"
[747]1957 elif [ "$disksize" -gt "2880" ] ; then
[1335]1958 if [ _"$MONDO_SHARE" != _"" ] ; then
[940]1959 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]1960 options="iso"
1961 else
1962 options="interactive expert compare iso nuke isonuke"
1963# hda hdb hdc hdd"
1964 fi
1965 else
1966 options="expert"
[925]1967 fi
[747]1968 else
1969 options="expert"
1970 fi
1971 for i in $options ; do
[925]1972 ooo=$i
1973 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1974 if [ "$ARCH" = "ia64" ] ; then
1975 rootpart="root=/dev/ram0\n\t"
1976 else
1977 rootpart=""
1978 fi
[1230]1979 outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/mindi.rdz\n\t${rootpart}append=\" rw ramdisk=$ramdisksize ramdisk_size=$ramdisksize maxcpus=1 $ooo_mode $ADDITIONAL_BOOT_PARAMS"
[747]1980
[925]1981 outstr=$outstr" $ooo_mode"
1982 outstr=$outstr"\"\n"
1983 if [ "$disksize" = "1440" ] ; then
1984 echo -en "$outstr" | sed s/initrd=.*// | grep -v root=
1985 else
1986 echo -en "$outstr"
1987 fi
[747]1988 done
1989}
1990
1991
1992PrepareBootDiskImage_LILO() {
1993 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1994 imagesdir=$1
1995 disksize=$2
1996 kernelpath=$3
1997 ramdisksize=$4
1998
1999 retval=0
2000 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2001 echo -en "Making "$disksize"KB boot disk..."
[940]2002 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/mindi.rdz $ramdisksize $disksize `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into mindi.rdz; are you SURE your kernel supports loopfs?"
[747]2003 if [ "$ARCH" != "ia64" ] ; then
[1282]2004 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "$BOOT_SIZE" ] && Die "PDBI - disksize is $disksize - bad size"
[747]2005 fi
2006 echo -en "..."
2007 imagefile=$imagesdir/mindi-bootroot.$disksize.img
[940]2008 mountpoint=$MINDI_TMP/mountpoint.$$
[747]2009 mkdir -p $mountpoint
2010 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
2011 if [ "$ARCH" = "ia64" ] ; then
[964]2012 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
2013 t=vfat
[747]2014 else
[964]2015 mke2fs -N 26 -m 0 -F $imagefile >> $LOGFILE 2>> $LOGFILE
2016 t=ext2
[747]2017 fi
[963]2018 mount -t $t -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
[964]2019 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]2020 mkdir -p $mountpoint/etc
2021 if [ "$ARCH" != "ia64" ] ; then
2022 liloconf=$mountpoint/etc/lilo.conf
2023 else
[925]2024 liloconf=$mountpoint/elilo.conf
[747]2025 fi
2026 old_pwd=`pwd`
2027 cd $mountpoint
2028 if [ "$ARCH" != "ia64" ] ; then
[963]2029 tar -zxf $MINDI_LIB/dev.tgz || LogIt "Cannot untar dev.tgz"
[747]2030 fi
2031 cd $old_pwd
[1311]2032 # BERLIOS : Useless and generating errors on CentOS ? (losetup miss a param)
2033 #losetup /dev/loop0 > /dev/null 2> /dev/null
2034 #[ "$?" -eq "0" ] || losetup /dev/loop0 -d || Die "Please free up /dev/loop0 by typing 'losetup /dev/loop0 -d'.\nReboot if necessary."
[747]2035 CopyBootBFile $mountpoint/boot.b
2036
2037 MakeLiloConfFile $disksize > $liloconf
2038
[1230]2039 # Copy it so that CD-ROM menu entry is satisfied
2040 if [ "$ARCH" = "ia64" ] ; then
2041 mountefi=0
2042 df -T | grep /boot/efi | grep -q vfat
2043 if [ $? -ne 0 ]; then
2044 mount /boot/efi
2045 if [ $? -ne 0 ]; then
2046 echo "You have to mount your EFI partition when using mindi"
2047 MindiExit -1
2048 fi
2049 mountefi=1
2050 fi
2051 cp /boot/efi/elilo.efi $mountpoint
2052 cp $liloconf $mountpoint/elilo.efi $mountpoint/efi/boot
2053 if [ $mountefi -eq 1 ]; then
2054 umount /boot/efi 2>&1 > /dev/null
2055 fi
2056 fi
2057
[940]2058 echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint..." >> $LOGFILE
2059 cp -f $MINDI_TMP/mindi.rdz $mountpoint 2>> $LOGFILE
[747]2060 if [ "$?" -ne "0" ] ; then
[963]2061 LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint"
[940]2062 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[963]2063 LogIt "Please unload some of your modules and try again."
[940]2064 rm -f $MINDI_TMP/mtpt.$$
[963]2065 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)"
[747]2066 retval=$(($retval+1))
2067 fi
2068 MakeMessageFile $disksize > $mountpoint/message
2069
2070 mkdir -p $mountpoint/tmp
[940]2071 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
[747]2072 if [ -e "$MINDI_LIB/memtest.img" ] ; then
2073 echo -en "image=/memtest.bin\nlabel=memtest\nn" >> $liloconf
2074 echo -en "image=/memdisk\nlabel=memtest\nappend=\"initrd=memtest.img\"\n" >> $liloconf
2075# echo "Yep, this is a multi-function CD" > $mountpoint/MULTIFUNC
2076 fi
2077
[925]2078 # copy the kernel across
[1230]2079 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]2080 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2081 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2082 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2> /dev/null
2083 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
[925]2084 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2085 du -sk $mountpoint/* >> $LOGFILE
2086 echo "--- end of list of files ---" >> $LOGFILE
2087 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
[747]2088Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2089 rm -f $mountpoint/vmlinuz
[925]2090 cd $old_pwd
[747]2091 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[963]2092 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[925]2093 # losetup /dev/loop0 -d
2094 res=0
[747]2095 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
[925]2096 res=$(($res+$?))
[963]2097 cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img 2>> $LOGFILE
[925]2098 res=$(($res+$?))
2099 rm -f $imagefile
2100 if [ "$res" -ne "0" ]; then
[963]2101 LogIt "WARNING - failed to create 1.44MB boot/root floppies"
[925]2102 rm -f $imagesdir/mindi-*.1440.img
2103 fi
2104 return $res
[747]2105 fi
2106 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2107 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2108 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2109 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
2110# make it bootable
2111 rm -f $mountpoint/zero
[963]2112 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]2113 if [ "$disksize" -gt "2880" ] && [ ! "$KERN_DISK_MADE" ] ; then
2114 if [ "$ARCH" != "ia64" ] ; then
2115 $LILO_EXE $LILO_OPTIONS -r $mountpoint >> $LOGFILE 2>> $LOGFILE
2116 else
2117 /bin/true
2118 fi
2119 elif [ ! "$KERN_DISK_MADE" ] ; then
2120# 12/28/2001 - if 1.72MB floppy then don't use LILO's optimizations at all
[925]2121 $LILO_EXE -r $mountpoint >> $LOGFILE 2>> $LOGFILE
[747]2122 else
[925]2123 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
[747]2124 fi
[925]2125
2126 # BERLIOS does not test necessarily what it expects
[747]2127 if [ $? -ne "0" ] ; then
[925]2128 if [ "`grep -F "/tmp/dev.0" $LOGFILE`" ] ; then
[963]2129 LogIt "The '/tmp/dev.0' error is NOT Mindi's fault. It is LILO's."
2130 LogIt "Please reboot your PC as a workaround."
2131 Die "LILO sneezed and Mindi caught a cold. Please read the README / FAQ."
[925]2132 fi
2133 echo "$LILO_EXE -r $mountpoint ...failed."
2134 echo -en "Press ENTER to continue."; read line
[963]2135 LogIt "Cannot run lilo on $mountpoint\nPlease upgrade/downgrade your version of LILO. It has a bug."
[925]2136 retval=$(($retval+1))
[747]2137 fi
[963]2138 cp -f $liloconf $MINDI_TMP/lilo.conf 2>> $LOGFILE
[747]2139 if [ "$ARCH" = "ia64" ] ; then
[963]2140 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
[747]2141 fi
2142 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2143 echo -en "..."
[963]2144 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]2145 if [ "$retval" -eq "0" ] ; then
2146 echo -en "...$DONE\r"
2147 if [ "$KERN_DISK_MADE" ] ; then
2148 LogIt "... $disksize KB boot disks were created OK\r"
2149 fi
2150 else
2151 echo -en "...failed\r"
2152 LogIt $disksize"KB boot disk was NOT created\r"
2153 rm -f $imagefile
2154 fi
[963]2155 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
[747]2156 return $retval
2157}
2158
2159
2160PrepareBootDiskImage_SYSLINUX() {
2161 local disksize imagesdir dev imagefile mountpoint fname i kernelpath ramdisksize cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
2162 imagesdir=$1
2163 disksize=$2
2164 kernelpath=$3
2165 ramdisksize=$4
2166 do_boot_root_thingy=""
2167 local retval old_pwd
2168 retval=0
[925]2169
[747]2170 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
2171 echo -en "Making "$disksize"KB boot disk..."
[940]2172 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]2173 [ "$disksize" != "1722" ] && [ "$disksize" != "2880" ] && [ "$disksize" != "$BOOT_SIZE" ] && Die "PDBI - disksize is $disksize - bad size"
[747]2174 echo -en "..."
2175 imagefile=$imagesdir/mindi-bootroot.$disksize.img
[940]2176 mountpoint=$MINDI_TMP/mountpoint.$$
[747]2177 mkdir -p $mountpoint
2178# If I format a 1722KB data file & run syslinux on it, the resultant image
2179# won't boot. So, I have formatted a floppy, called syslinux on/to it, and
2180# used 'dd' to copy it to sys-disk.raw (zipped to sys-disk.raw.gz).
2181# If I extract it, mount it, copy my files to it, etc. then the resultant
2182# image _is_ bootable. I don't know why syslinux and/or mkfs.vfat won't
2183# play nicely and I don't care. :) I have worked around the problem. -Hugo, 06/27/2002
2184 if [ "$disksize" = "1722" ] ; then
2185 gzip -dc $MINDI_LIB/sys-disk.raw.gz > $imagefile || Die "Cannot dd blank file"
2186 else
2187 dd if=/dev/zero of=$imagefile bs=1k count=$disksize &> /dev/null || Die "Cannot dd blank file"
[964]2188 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
2189 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
[747]2190 fi
[963]2191 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
[925]2192
2193 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]2194 old_pwd=`pwd`
2195 MakeSyslinuxMessageFile $mountpoint/message.txt
2196 cd $mountpoint
2197 [ -e "$sys_cfg_file" ] || Die "Obi Wan, word up?"
2198 cat $sys_cfg_file | HackSyslinuxFile $ramdisk_size $mountpoint > syslinux.cfg || Die "Cannot copy syslinux.cfg from mindi_home to tmp_root"
[940]2199 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]2200 mv syslinux.cfg syslinux.cfg.orig
2201 sed s/interactive/iso/ syslinux.cfg.orig > syslinux.cfg
2202 fi
2203 cd $old_pwd
[940]2204 echo "Copying $MINDI_TMP/mindi.rdz to $mountpoint/initrd.img..." >> $LOGFILE
2205 cp -f $MINDI_TMP/mindi.rdz $mountpoint/initrd.img 2>> $LOGFILE
[747]2206 if [ "$?" -ne "0" ] ; then
[963]2207 LogIt "Failed to copy $MINDI_TMP/mindi.rdz to $mountpoint"
[940]2208 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[963]2209 LogIt "Please unload some of your modules and try again."
[940]2210 rm -f $MINDI_TMP/mtpt.$$
[963]2211 LogIt "Cannot incorporate mindi.rdz in bootdisk (kernel / modules too big?)"
[747]2212 retval=$(($retval+1))
2213 fi
2214
2215 mkdir -p $mountpoint/tmp
[940]2216 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp &> /dev/null
[747]2217
[925]2218 # copy the kernel across
[1230]2219 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]2220 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
2221 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2222 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
2223 if [ "$?" -ne "0" ] || [ "$FORCE_DUAL_FLOPPIES" = "yes" ] ; then
2224 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
2225 du -sk $mountpoint/* >> $LOGFILE
2226 echo "--- end of list of files ---" >> $LOGFILE
2227 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
2228Sorry, your kernel is too big for a boot/root floppy.\nI'll try the new boot/root two-disk thingy.\n" >> $LOGFILE
2229 rm -f $mountpoint/vmlinuz
2230 cd $old_pwd
2231 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[963]2232 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]2233
2234 res=0
2235 write_full_floppy_of_kernel $kernelpath $imagesdir/mindi-boot.1440.img 1440
2236 res=$(($res+$?))
[963]2237 cp -f $MINDI_TMP/mindi.rdz $imagesdir/mindi-root.1440.img 2>> $LOGFILE
[747]2238 res=$(($res+$?))
2239 rm -f $imagefile
2240 if [ "$res" -ne "0" ]; then
[963]2241 LogIt "WARNING - failed to create 1.44MB boot/root floppies"
[747]2242 rm -f $imagesdir/mindi-*.1440.img
2243 fi
2244 return $res
2245 fi
2246 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
2247 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2248 echo "Free space left on floppy = $free_space KB" >> $LOGFILE
2249 echo "Max kernel size on $disksize KB floppy (est'd) = $max_kernel_size K" >> $LOGFILE
[925]2250
2251 # make it bootable
[747]2252 rm -f $mountpoint/zero
2253 mkdir -p $mountpoint/etc
[963]2254 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]2255 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2256 echo -en "..."
[963]2257 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]2258
2259 if [ "$retval" -eq "0" ] ; then
2260 echo -en "...$DONE\r"
2261 if [ "$KERN_DISK_MADE" ] ; then
2262 rm -f $imagefile
2263 LogIt "... $disksize KB boot disks were created OK\r"
2264 fi
2265 else
2266 echo -en "...failed\r"
2267 LogIt $disksize"KB boot disk was NOT created\r"
2268 rm -f $imagefile
2269 fi
[963]2270 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
[747]2271 return $retval
2272}
2273
2274
2275PrepareDataDiskImages() {
2276 local needlist bigdir minidir_root tardir diskdir imagesdir res i j k old_pwd lines
2277
2278 imagesdir=$1
2279 rm -f $imagesdir/mindi-*.img $imagesdir/[0-9]*.tar.gz $imagesdir/mindi.iso
[940]2280 needlist=$MINDI_TMP/what-we-need.txt
2281 bigdir=$MINDI_TMP/bigdir
2282 minidir_root=$MINDI_TMP/minidir
[747]2283 mkdir -p $minidir_root
2284 mkdir -p $bigdir/usr/bin
[940]2285 tardir=$MINDI_TMP/tardir
[747]2286
2287 lines=`grep -vx " *#.*" $MINDI_CONF/deplist.txt | grep -vx "" | wc -l`
2288 cat $MINDI_CONF/deplist.txt | GenerateGiantDependencyList $needlist $lines
2289 res=$?
2290 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]2291 pwd=`pwd`
[940]2292 cd $MINDI_TMP
[747]2293 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[963]2294 cp --parents -pRdf ./$i $bigdir 2>> $LOGFILE || Die "PDDI can't cp $i->$bigdir"
[925]2295 if [ "`du -sk $i | cut -f1`" -lt "$(($CHOPSIZE*2))" ] ; then
[963]2296 cp --parents -pRdf $i $bigdir 2>> $LOGFILE
[925]2297 else
2298 ChopUpAndCopyFile $i $bigdir $CHOPSIZE $BIGNO
2299 BIGNO=$(($BIGNO+1))
2300 fi
[747]2301 done
[925]2302 for i in $EXTRA_MODS ; do
2303 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o 2> /dev/null`
[963]2304 [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o" >> $LOGFILE
[925]2305 for k in $j ; do
2306 if [ "`du -sk $k | cut -f1`" -lt "$CHOPSIZE" ] ; then
[963]2307 cp --parents -pRdf $k $bigdir 2>> $LOGFILE
[925]2308 else
2309 ChopUpAndCopyFile $k $bigdir $CHOPSIZE $BIGNO
2310 BIGNO=$(($BIGNO+1))
2311 fi
2312 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2313 done
2314 done
2315 cd $pwd
[747]2316 else
[925]2317 ListKernelModulePaths >> $needlist
[747]2318 fi
2319 if [ "$res" -ne "0" ] ; then
2320 Die "You have $res file`PluralOrNot $res` present in dependency list\nbut absent from filesystem."
2321 fi
2322 FindAndAddUserKeyboardMappingFile
2323 mkdir -p $bigdir/tmp
[1335]2324 if [ _"$MONDO_SHARE" != _"" ] ; then
[940]2325 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2326 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]2327 fi
2328 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2329 DropOptimizedLibraries $needlist $bigdir
2330 echo -en "Assembling dependency files"
2331 CopyDependenciesToDirectory < $needlist $bigdir
2332
[925]2333 # also copy io.sys and msdos.sys, if we can find them
[747]2334 for i in `mount | cut -d' ' -f3` ; do
[925]2335 for j in io.sys msdos.sys ; do
[963]2336 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
[925]2337 done
[747]2338 done
2339
[925]2340 # master boot record, too
[940]2341 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]2342 if [ "$i" ] ; then
[963]2343 LogIt "Backing up $i's MBR"
[925]2344 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2345 sleep 1
2346 sync
2347 j=$i
2348 [ -h "$j" ] && j=`readlink -f $j`
[963]2349 LogIt "Creating /dev/boot_device ($j)"
[925]2350 mkdir -p $bigdir/dev
[953]2351 cp -pRdf $j $bigdir/dev/boot_device 2> /dev/null || Die "Unable to create /dev/boot_device on ramdisk"
[747]2352 fi
2353
2354 old_pwd=`pwd`
2355 cd $bigdir
2356
2357 [ -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]2358 cp -Rdf $MINDI_LIB/aux-tools/* . 2>> $LOGFILE || LogIt "WARNING - error occurred while unzipping aux-tools"
[747]2359 if [ -e "$MINDI_LIB/x11-tools.tgz" ] ; then
[963]2360 tar -zxf $MINDI_LIB/x11-tools.tgz 2>> $LOGFILE || LogIt "WARNING - error occurred while unzipping x11-tools.tgz"
[747]2361 fi
2362 if [ -e "$MONDO_SHARE/restore-scripts" ] ; then
2363 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
[1335]2364 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
[747]2365 fi
[963]2366 [ -d "/lib/dev-state" ] && cp --parents -pRdf /lib/dev-state . 2>> $LOGFILE
[747]2367 cd $old_pwd
2368 echo -e "$DONE"
2369 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2370 SplitDirectoryIntoMinidirs $bigdir $minidir_root
2371 noof_disks=$?
2372 [ "$noof_disks" -eq "0" ] && Die "Too much stuff!"
2373# if [ "$noof_disks" -ge "8" ] ; then
2374# LogIt "You are putting a ludicrously large amount of data on these disks."
2375# LogIt "I shall therefore double EXTRA_SPACE, just in case your ramdisk is too small."
2376# EXTRA_SPACE=$(($EXTRA_SPACE*2))
2377# fi
[940]2378 MakeMountlist $MINDI_TMP/mountlist.txt
[747]2379 mkdir -p $minidir_root/$noof_disks/tmp
[953]2380 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]2381 [ _"$MONDO_SHARE" != _"" ] && cp -f $minidir_root/$noof_disks/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
[964]2382 [ $LVM != "false" ] && $MINDI_LIB/analyze-my-lvm > $minidir_root/$noof_disks/tmp/i-want-my-lvm || LVM="false"
[747]2383 cat $minidir_root/$noof_disks/tmp/mountlist.txt >> $LOGFILE
2384 ZipMinidirsIntoTarballs $minidir_root $tardir $noof_disks
2385 CreateDataDiskImagesFromTarballs $tardir $imagesdir $noof_disks
2386 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[925]2387 # One 1.72MB boot disk, one 2.88MB boot disk and $noof_disks data disk images
[747]2388 rmdir $tardir $bigdir
2389 rm -f $needlist
2390 return $noof_disks
2391}
2392
2393
2394ProcessLDD() {
[1526]2395 local incoming f
[747]2396 read incoming
2397 while [ "$incoming" != "" ] ; do
[859]2398 # We take the full path name of the dyn. lib. we want
[1526]2399 incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2400 for f in $incoming ; do
[1721]2401 echo "$f"
2402 echo "`ReadAllLink $f`"
[747]2403 done
2404 read incoming
2405 done
2406}
2407
2408
2409Prompt() {
2410 echo -en "$1"
2411 read line
2412}
2413
2414
2415ReadLine() {
2416 local i incoming
2417 read incoming
2418 i=0
2419 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2420 i=$(($i+1))
2421 read incoming
[747]2422 done
2423 echo "$incoming"
2424}
2425
2426
2427RejigHyperlinks() {
2428 local minidir_root noof_disks fname path diskno old_pwd awk_loc gawk_loc dir i
2429 minidir_root=$1
2430 noof_disks=$2
2431
2432 old_pwd=`pwd`
2433 diskno=1
2434 while [ "$diskno" -le "$noof_disks" ] ; do
[859]2435 mkdir -p $minidir_root/$diskno
[747]2436 cd $minidir_root/$diskno
2437 for fname in `find -type d -o -print` ; do
2438 [ -h "$minidir_root/$diskno/$fname" ] && MoveHyperlinkSensibly $fname $minidir_root $diskno $noof_disks
2439 done
[925]2440 diskno=$(($diskno+1))
[747]2441 done
2442
2443 cd $old_pwd
2444 return
2445}
2446
2447
2448ReplaceIndividualLine() {
2449 local orig_file new_file lino newstring lines_total lines_remaining
[925]2450
[747]2451 orig_file=$1.orig
2452 mv -f $1 $orig_file || Die "Cannot move $1 to $orig_file"
2453 new_file=$1
2454 lino=$2
2455 newstring="$3"
2456 if [ "$lino" = "" ] || [ "$lino" -lt "1" ] ; then
[925]2457 echo "Can't find string" >> $LOGFILE
2458 return 1
[747]2459 fi
[963]2460 lines_total=`wc -l $orig_file | $AWK '{print $1;}'`
[747]2461 lines_remaining=$(($lines_total-$lino))
2462 head -n$(($lino-1)) $orig_file > $new_file
2463 echo "$newstring" >> $new_file
2464 echo "# The above line was added by Mindi, at the user's instruction" >> $new_file
2465 tail -n$lines_remaining $orig_file >> $new_file
2466 echo "Replace line $lino of $new_file with user-specified line, '$newstring'" >> $LOGFILE
2467 [ -x "$orig_file" ] && chmod +x $new_file
2468 rm -f $orig_file
2469 return 0
2470}
2471
2472
2473ScanCDandTape() {
2474 local i
2475
2476 for i in /dev/st0 /dev/ht0 /dev/cdrom /dev/cdrom0 /dev/cdrom 1 ; do
2477 dd if=$i of=/dev/null bs=64k count=1 &> /dev/null
2478 done
2479}
2480
2481
2482SizeOfPartition() {
2483 local devpath drive res stub
2484 device=$1
2485 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2486 res=`SizeOfRaidPartition $device`
2487 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2488 echo "$res"
2489 return 0
[747]2490 fi
[925]2491 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[960]2492 res=`$FDISK -s $device 2>> $LOGFILE`
[925]2493 # end patch
[747]2494 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2495 [ "$res" = "" ] && res="-1"
2496 echo $res
2497 return 0
2498}
2499
2500
2501SizeOfRaidPartition() {
2502 local real_dev smallest_size silly tmp
2503
2504 silly=999999999
2505 smallest_size=$silly
2506
2507 for real_dev in `GetRaidDevMembers $1` ; do
[925]2508 tmp=`SizeOfPartition $real_dev`
2509 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2510 done
2511
2512 if [ "$smallest_size" = "$silly" ] ; then
[925]2513 echo "-1"
2514 return 1
[747]2515 else
[925]2516 echo "$smallest_size"
2517 return 0
[747]2518 fi
2519}
2520
2521
2522StripComments()
2523{
2524 local tempfile
[925]2525
[940]2526 tempfile=$MINDI_TMP/$$.strip.txt
[963]2527 cp -f $1 $tempfile 2>> $LOGFILE
[747]2528 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2529 rm -f $tempfile
2530 echo "Stripped comments from $2" >> $LOGFILE
2531}
2532
2533
2534SplitDirectoryIntoMinidirs() {
2535 local bigdir minidir_root i noof_disks old_pwd res
[925]2536
[747]2537 bigdir=$1
2538 minidir_root=$2
[1230]2539 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
[747]2540
2541 TryToFitDataIntoSeveralDirs $bigdir $minidir_root
2542 noof_disks=$?
2543 if [ "$noof_disks" -eq "0" ] ; then
[925]2544 echo "Failed to fit data into several dirs."
[747]2545 return 0
2546 fi
2547 RejigHyperlinks $minidir_root $noof_disks
[1230]2548 [ "$bigdir" != "" ] && rm -Rf $bigdir/*
[925]2549 return $noof_disks
[747]2550}
2551
2552
2553StripExecutable()
2554{
2555 local tmpfile
[925]2556
[940]2557 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2558 [ -d "$1" ] || [ -h "$1" ] && return
[963]2559 cp -f $1 $tmpfile 2>> $LOGFILE
[747]2560 strip $tmpfile 2> /dev/null
2561 if [ "$?" -eq "0" ] ; then
[963]2562 cp -f $tmpfile $1 2>> $LOGFILE
[925]2563 echo "Stripped binary $2" >> $LOGFILE
[747]2564 fi
2565 rm -f $tmpfile
2566}
2567
2568
2569TemporarilyCompressAllFiles() {
2570 local i orig_fname out_fname out_list
2571
2572 i=0
2573 out_list=$2/compressed/compressed.txt
2574 mkdir -p $2/compressed
2575 > $out_list
2576 for orig_fname in $1 ; do
2577 out_fname=$2/compressed/$orig_fname.gz
2578 mkdir -p $out_fname 2> /dev/null
2579 rmdir $out_fname 2> /dev/null
2580 gzip -c6 $orig_fname > $out_fname 2> /dev/null
2581 i=$(((($i+1))%15))
2582 [ "$i" -eq "0" ] && echo -en "."
2583 du -sk $out_fname >> $out_list
2584 done
2585}
2586
2587
2588TryToFindKernelPath() {
2589 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
[925]2590
[747]2591 we_want_version=`uname -r`
2592 possible_kernels=""
2593 duff_kernels=""
2594
2595 if [ "$ARCH" = "ia64" ] ; then
2596 root="/boot/efi/efi"
2597 else
2598 root="/"
2599 fi
[1466]2600 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
[925]2601 [ ! -e "$fname" ] && continue
[747]2602 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[925]2603 file $fname | grep -q gzip
2604 if [ "$?" -eq "0" ] ; then
2605 # Used by ia64
[747]2606 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
[925]2607 else
[747]2608 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
[925]2609 fi
[747]2610 [ "$fkern_ver" = "" ] && continue
2611 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2612 [ -f "$fname" ] || continue
2613 [ -h "$fname" ] && continue
2614 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2615 file $fname | grep -q gzip
2616 if [ "$?" -eq "0" ] ; then
2617 # Used by ia64
2618 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[963]2619 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2620 duff_kernels="$fname $duff_kernels"
2621 else
[747]2622 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2623 possible_kernels="$fname $possible_kernels"
[925]2624 fi
[747]2625 else
[925]2626 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[963]2627 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2628 duff_kernels="$fname $duff_kernels"
2629 else
[747]2630 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2631 possible_kernels="$fname $possible_kernels"
[925]2632 fi
[747]2633 fi
2634 done
2635 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2636 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2637 fi
2638 if [ ! "$possible_kernels" ] ; then
[963]2639 LogIt "No kernel matches exactly. Are there any duff kernels?"
[747]2640 possible_kernels="$duff_kernels"
2641 if [ ! "$possible_kernels" ] ; then
[963]2642 LogIt "Sorry, no duff kernels either"
[747]2643 else
[963]2644 LogIt "I bet you're running Debian or Gentoo, aren't you?"
2645 LogIt "Your kernel doesn't have a sane builddate. Oh well..."
[747]2646 fi
2647 fi
2648 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2649 noof_kernels=`CountItemsIn "$possible_kernels"`
2650 if [ "$noof_kernels" -eq "0" ] ; then
[963]2651 LogIt "Could not find your kernel."
[925]2652 if [ -e "/boot/vmlinuz" ] ; then
[963]2653 LogIt "Using /boot/vmlinuz as a last resort."
[925]2654 output=/boot/vmlinuz
[747]2655 else
[925]2656 output=""
2657 fi
[747]2658 elif [ "$noof_kernels" -eq "1" ] ; then
2659 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2660 echo "Your kernel is $kernelpath (v`uname -r`)" >> $LOGFILE
2661 output="$kernelpath"
2662 else
2663 for i in $possible_kernels ; do
2664 if echo $i | grep "`uname -r`" ; then
[925]2665 LogIt "OK, I used my initiative and found that "
[963]2666 LogIt "$i is probably your kernel. "
[925]2667 output="$i"
2668 return
2669 fi
[747]2670 done
[925]2671 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2672 output=/boot/vmlinuz
2673 echo "Schlomo, this one's for you." >> $LOGFILE
2674 else
[963]2675 LogIt "Two or more possible kernels found. You may specify any one of them and the "
2676 LogIt "boot disks will still work, probably. If one does not work, try another."
2677 LogIt "$possible_kernels"
[747]2678 echo ""
[925]2679 fi
[747]2680 fi
2681 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2682}
2683
2684
2685TryToFitDataIntoSeveralDirs() {
2686 local bigdir minidir_root noof_disks diskno list_of_files filename old_pwd progress
2687 local i retval noof_disks total_files list_of_devs
[925]2688
[747]2689 bigdir=$1
2690 minidir_root=$2
2691 BIG_CLUNKY_SIZE_COUNTER=0
2692 retval=0
2693 noof_disks=1
2694
2695 echo -en "\r \rDividing data into several groups..."
2696 old_pwd=`pwd`
2697 cd $bigdir
2698 list_of_files=`GetFileSizeList . | sort -nr | cut -f2 | grep -Fv "/dev/"`
2699 progress=0
2700 total_files=`CountItemsIn "$list_of_files"`
2701 if [ "`echo "$filename" | grep -x "/dev/.*"`" ] ; then
2702 filesize=1
2703 fi
2704 mkdir -p $minidir_root/$noof_disks
2705 if [ -e "dev" ] ; then
2706 echo "Copying dev/* to $minidir_root/$noof_disks" >> $LOGFILE
[963]2707 cp --parents -pRdf dev $minidir_root/$noof_disks 2>> $LOGFILE
[747]2708 fi
2709 TemporarilyCompressAllFiles "$list_of_files" $minidir_root
2710 for filename in $list_of_files ; do
2711 AddFileToDir $filename $minidir_root $noof_disks
[925]2712 i=$?
2713 if [ "$i" -gt "$noof_disks" ] ; then
2714 noof_disks=$i
2715 echo -en "\r\t\t\t\t\t\t($noof_disks disks)"
2716 fi
2717 if [ "$i" -eq "0" ] ; then
[963]2718 LogIt "Cannot add file $filename to minidir $minidir_root"
[925]2719 retval=$(($retval+1))
2720 fi
[747]2721 progress=$(($progress+1))
[925]2722 echo -en "\r\t\t\t\t\t\t\t\t$(($progress*100/$total_files))% complete\r"
[747]2723 done
2724 cd $old_pwd
2725 echo -en "\rThe files have been subdivided into $noof_disks directories. \r"
[1230]2726 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/compressed
[747]2727 if [ "$retval" -gt "0" ] ; then
[925]2728 return 0
[747]2729 else
[925]2730 return $noof_disks
[747]2731 fi
2732}
2733
2734
2735TurnTgzIntoRdz() {
2736 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]2737
[747]2738 tgz_dir_fname=$1
2739 rdz_fname=$2
2740 ramdisksize=$3
2741 disksize=$4
2742 kernelsize=$5
2743 maxsize=$(($disksize-$kernelsize))
2744 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2745 tempfile=$MINDI_TMP/temp.rd
2746 mountpoint=$MINDI_TMP/mnt1
[747]2747 res=0
2748 echo -en "..."
2749 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2750 echo -en "..."
2751 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE
2752 echo -en "..."
2753 mkdir -p $mountpoint
2754 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."
2755 echo -en "..."
2756 old_pwd=`pwd`
2757 cd $mountpoint
[959]2758 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
[747]2759 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2760 cd dev || Die "Can't cd to dev"
2761 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2762 rm -f dev-entries.tgz
2763 cd ..
2764
2765 for w in insmod.static insmod.static.old ; do
[925]2766 s=`which $w 2> /dev/null`
2767 if [ -e "$s" ] ; then
[963]2768 cp --parents -af $s . 2>> $LOGFILE
[925]2769 fi
[747]2770 done
2771
2772 mkdir -p tmp
2773 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
[1724]2774
2775 # Management of udev (which includes modprobe in rules)
[1716]2776 ps auxww | grep -v grep | grep -q /udevd
2777 if [ $? -eq 0 ]; then
2778 echo "udev device manager found" > tmp/USE-UDEV
2779 cp --parents -Rdf /etc/udev . 2> /dev/null
[1718]2780 cp --parents -Rdf /lib/udev /lib64/udev . 2> /dev/null
[1720]2781 if [ -x /sbin/udevd ]; then
[1724]2782 LocateDeps /sbin/udevd /sbin/modprobe /sbin/insmod > $MINDI_TMP/udev.lis
[1726]2783 rm -f sbin/modprobe sbin/insmod
[1724]2784 cp --parents -Rdf /sbin/udevd /sbin/modprobe /sbin/insmod `sort -u $MINDI_TMP/udev.lis` .
[1721]2785 rm -f $MINDI_TMP/udev.lis
[1720]2786 else
2787 echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
[1724]2788 echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
[1720]2789 rm -f tmp/USE-UDEV
2790 fi
[1716]2791 fi
[747]2792 for w in cdrom floppy groovy-stuff ; do
2793 mkdir -p mnt/$w
2794 done
[925]2795 #if [ "$RUN_AFTER_INITIAL_BOOT_PHASE" ] ; then
2796 #ReplaceIndividualLine sbin/init `grep -n "#WHOLIVESINAPINEAPPLEUNDERTHESEA#" sbin/init | cut -d':' -f1` "$RUN_AFTER_INITIAL_BOOT_PHASE"
2797 #fi
[747]2798 if [ "$RUN_AFTER_BOOT_PHASE_COMPLETE" ] ; then
[925]2799 ReplaceIndividualLine sbin/init `grep -n "#ABSORBENTANDYELLOWANDPOROUSISHE#" sbin/init | cut -d':' -f1` "$RUN_AFTER_BOOT_PHASE_COMPLETE"
[747]2800 fi
2801
2802 cp --parents -Rdf /dev/fd0*[1,2][4,7,8]* . 2> /dev/null
[1721]2803
2804 # Handle the case where busybox is dynamically linked
2805 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2806 if [ $? -eq 0 ]; then
2807 LocateDeps $MINDI_LIB/rootfs/bin/busybox > $MINDI_TMP/busy.lis
2808 cp --parents -Rdf `sort -u $MINDI_TMP/busy.lis` .
2809 rm -f $MINDI_TMP/busy.lis
2810 fi
[747]2811 cd $old_pwd
2812 echo -en "..."
2813 MakeModuleLoadingScript $TMPMODPROBE_FLAG $mountpoint/sbin/insert-all-my-modules
2814 echo -en "..."
2815 old_pwd=`pwd`
2816 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[940]2817 cd $MINDI_TMP
[747]2818 floppy_modules_path=lib/modules/$FAILSAFE_KVER
2819 else
2820 cd /
2821###
2822### Sq-Modification... Use kernel name in module path if specified.
2823###
2824 #floppy_modules_path=lib/modules/`uname -r`
2825 if [ "${kernelname}" != "" ]
2826 then
2827 floppy_modules_path=lib/modules/${kernelname}
2828 else
2829 floppy_modules_path=lib/modules/`uname -r`
2830 fi
2831###
2832### Sq-Modification end
2833###
2834 fi
2835 floppy_modules=""
2836 if [ "$disksize" -lt "2880" ] ; then
[1354]2837 list_of_groovy_mods="$FLOPPY_MODS $FORCE_MODS $IDE_MODS ide-scsi sr_mod cdrom isocd isofs `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
[747]2838 else
[1354]2839 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS `WhichOfTheseModulesAreLoaded "$SCSI_MODS"`"
[747]2840 fi
[940]2841 if [ -e "$MINDI_TMP/NFS-DEV" ] ; then
[747]2842 # For PXE boot
2843 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2844 fi
[1715]2845 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2846 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2847 fi
[1727]2848 for i in $DENY_MODS; do
2849 echo "Removing $i from the list of modules to load" >> $LOGFILE
2850 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2851 done
2852
[963]2853 [ -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]2854 for i in $list_of_groovy_mods ; do
2855 floppy_modules="$floppy_modules `FindSpecificModuleInPath $floppy_modules_path $i`"
2856 done
2857 for i in $floppy_modules ; do
2858 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2859 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[747]2860 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
[1727]2861 cp --parents -pdf $i $mountpoint 2>/dev/null || LogIt "Unable to copy $i to $mountpoint"
2862 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2863 gunzip -f $mountpoint/$i
2864 i=`echo $i | sed 's/.gz//'`
2865 fi
[1728]2866 (cd $mountpoint ; ln -s $i . 2>/dev/null) || LogIt "Unable to link `basename $i` to $mountpoint"
[747]2867 [ "`echo "$i" | grep -F ".gz"`" ] && gunzip -f $mountpoint/`basename $i`
2868 done
[1727]2869 # Also copy modules.dep in case of udev so that normal modprobe works
2870 p=`echo $i | cut -d/ -f1-3`
2871 cp -df $p/modules.dep $mountpoint/$p 2>/dev/null || LogIt "Unable to copy modules.dep to $mountpoint"
[747]2872 if [ ! -e "/sbin/devfsd" ] || [ "$disksize" -lt "2880" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2873 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2874 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2875 [ "$disksize" -lt "2880" ] && echo "...because disksize = $disksize" >> $LOGFILE
2876 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2877 rm -f $mountpoint/sbin/devfsd
2878 fi
2879 cd $old_pwd
2880 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2881 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2882 rm -f $mountpoint/zero
[1335]2883 if [ _"$MONDO_SHARE" != _"" ] ; then
[747]2884 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[940]2885 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP &> /dev/null
[953]2886 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>/dev/null || Die "Cannot copy mountlist to ramdisk"
[747]2887 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2888 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2889 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2890 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[747]2891 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2892 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2893 fi
2894 mkdir -p $mountpoint/tmp
2895 mkdir -p $mountpoint/proc
2896 echo "$disksize" > $mountpoint/tmp/$disksize.siz
2897 find $mountpoint -name CVS -exec rm -rf '{}' \;
[1230]2898 # Determine what filesystem to use for initrd image
2899 echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2900 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2901 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2902 case "$gvFileSystem" in
2903 "ext2fs")
2904 # say what will be used
2905 echo "Creating an ext2 initrd image..." >> $LOGFILE
2906 # kernel expects linuxrc in ext2 filesystem
2907 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2908 # unmount loop filesystem and create image file using the standard approach
2909 umount $mountpoint || Die "Cannot unmount $tempfile"
2910 dd if=$tempfile bs=1k 2> /dev/null | gzip -v9 > $rdz_fname 2> /dev/null
2911 # log that we are done
2912 echo "...done." >> $LOGFILE
2913 ;;
2914 "initramfs")
2915 # say what will be used
2916 echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2917 # make sure that cpio is there
2918 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2919 # go into filesystem
2920 cd $mountpoint
2921 # kernel expects init in cpio filesystem
2922 ln -sf sbin/init init
2923 # create cpio image file and unmount loop filesystem
2924 find . -print | cpio -o -H newc | gzip -9 > $old_pwd/$rdz_fname 2> /dev/null
2925 cd $old_pwd
2926 umount $mountpoint || Die "Cannot unmount $tempfile"
2927 # log that we are done
2928 echo "...done." >> $LOGFILE
2929 ;;
2930 *)
2931 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2932 ;;
2933 esac
[747]2934 if [ "$res" -eq "0" ] ; then
2935 echo -en "..."
2936 else
2937 echo -en "\rMade an rdz WITH ERRORS. \n"
2938 fi
2939 return 0
2940}
2941
2942
2943WhichOfTheseModulesAreLoaded() {
2944 local modname loaded_modules
[1399]2945 loaded_modules="$MODULES"
[747]2946 for modname in $1 ; do
[1506]2947 [ "`echo "$loaded_modules" | grep -w "$modname"`" ] && echo "$modname"
[747]2948 done
2949}
2950
2951
2952ZipMinidirsIntoTarballs() {
2953 local minidir_root tardir noof_disks diskno old_pwd i
2954 minidir_root=$1
2955 tardir=$2
2956 noof_disks=$3
2957
2958 echo -en "Tarring and zipping the group`PluralOrNot $noof_disks`..."
2959 mkdir -p $tardir
2960 mkdir -p $minidir_root/all
2961 old_pwd=`pwd`
2962 diskno=1
2963 while [ "$diskno" -le "$noof_disks" ] ; do
[963]2964 cd $minidir_root/$diskno || LogIt "WARNING - cannot cd to $minidir_root/$diskno"
[747]2965 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."
2966 diskno=$(($diskno+1))
2967 echo -n "..."
[963]2968 cp -pRdf * $minidir_root/all 2>> $LOGFILE
[747]2969 done
2970 mkdir -p $minidir_root/all/tmp
2971 cd $minidir_root/all
2972 size_of_all_tools=`du -sk . | cut -f1`
[1684]2973 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2974 for q in filelist.full.gz biggielist.txt ; do
[940]2975 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
[963]2976 cp -pRdf $MINDI_TMP/$q tmp/ 2>> $LOGFILE
[747]2977 done
2978 mkdir -p $minidir_root/all/tmp
2979 echo -en "$FILES_IN_FILELIST" > $minidir_root/all/tmp/FILES-IN-FILELIST 2> /dev/null
2980 echo -en "$LAST_FILELIST_NUMBER" > $minidir_root/all/tmp/LAST-FILELIST-NUMBER 2> /dev/null
2981 fi
2982 tar -b 4096 -cf - * 2> /dev/null | gzip -9 > $tardir/all.tar.gz
2983 dd if=/dev/zero bs=1k count=64 >> $imagesdir/all.tar.gz 2> /dev/null
2984 [ "`du -sm $imagesdir/all.tar.gz | cut -f1`" -ge "30" ] && Die "You have too many tools in your shed"
2985 cd $old_pwd
[1230]2986 [ "$minidir_root" != "" ] && rm -Rf $minidir_root
[747]2987 echo -e "$DONE"
2988}
2989
2990
2991##############################################################################
[1021]2992#----------------------------------- Main -----------------------------------#
[747]2993##############################################################################
2994
2995
2996> $LOGFILE
2997echo "mindi v$MINDI_VERSION" >> $LOGFILE
2998echo "$ARCH architecture detected" >> $LOGFILE
2999echo "mindi called with the following arguments:" >> $LOGFILE
3000echo "$@" >> $LOGFILE
[800]3001echo "Start date : `date`" >> $LOGFILE
[1684]3002echo "-----------------------------" >> $LOGFILE
[747]3003
3004if [ -e "/etc/conf.modules" ] && [ ! -e "/etc/modules.conf" ] ; then
[963]3005 LogIt "WARNING - Ancient distro detected." 1
[747]3006 ln -sf /etc/conf.modules /etc/modules.conf
3007fi
3008[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
3009
[1010]3010# Log some capital variables
3011[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
3012echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
3013echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
3014[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
3015echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
3016echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
3017
[747]3018trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]3019
3020# Sanity checks
3021which which > /dev/null 2> /dev/null || Die "Please install 'which'."
3022which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
3023which 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."
3024which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
3025if which awk &> /dev/null ; then
3026 if ! which gawk &> /dev/null ; then
3027 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"
3028 fi
3029fi
3030which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
3031[ ! -e "$FDISK" ] && Die "Cannot find (s)fdisk"
3032
[747]3033[ "`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"
3034# If we have a 2.6 kernel, the system uses module-init-tools which means that we
3035# may have the modprobe configuration spread out across multiple files in
3036# directory /etc/modprobe.d. If this is the case we concatenate these files into
3037# a temporary file for further processing. Otherwise we continue in the standard
3038# way. Note further that in case /etc/modprobe.d exists, we use it and ignore
3039# /etc/modprobe.conf which is exactly what module-init-tools does. The temporary
3040# modprobe.conf file is created in MakeModuleLoadingScript. AL041128.
[1684]3041if [ -d "/etc/modprobe.d" ] && [ "`uname -r | cut -c1-3`" = "2.6" ] ; then
[925]3042 TMPMODPROBE_FLAG="Y"
[747]3043else
[925]3044 TMPMODPROBE_FLAG="N"
3045 [ -e "/etc/modprobe.conf" ] && [ ! -e "/etc/modules.conf" ] && ln -sf /etc/modprobe.conf /etc/modules.conf
3046 [ ! -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]3047fi
[1010]3048
3049# Update the PATH variable if incomplete
3050if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
3051 PATH=$PATH:/sbin:/usr/sbin
3052 export PATH
3053 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
3054 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
3055 echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
3056fi
3057
[747]3058[ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
[1010]3059
3060if ! which mkfs.vfat &> /dev/null ; then
3061 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
3062fi
3063
[925]3064### BERLIOS
[747]3065### Fix as it's not mandatory on ia64
3066if [ "$ARCH" = "ia64" ] ; then
[1010]3067 if which elilo &> /dev/null ; then
3068 LILO_EXE=elilo
3069 else
3070 LILO_EXE=`which false`
3071 fi
[747]3072else
3073 FindIsolinuxBinary
3074 FindLiloBinary
3075fi
[925]3076# BERLIOS: Remove as too dangerous and now useless
[940]3077#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]3078trap "Aborted" SIGTERM
3079DONE="\r\t\t\t\t\t\t\t\tDone. "
3080CHOPSIZE=240
3081BIGNO=0
3082MAX_COMPRESSED_SIZE=1300
3083kernelpath=""
[1010]3084MONDO_ROOT=/var/cache/mondo
[747]3085mkdir -p $MONDO_ROOT
3086
3087if [ -d "/proc/lvm" ]; then
3088 # LVM v1
3089 LVMCMD=""
3090 LVM="v1"
3091elif [ -d "/dev/mapper" ]; then
3092 # LVM v2
3093 LVMCMD="lvm"
3094 LVM="v2"
3095else
3096 LVM="false"
3097fi
[1021]3098echo "LVM set to $LVM" >> $LOGFILE
3099echo "----------" >> $LOGFILE
3100echo "df result:" >> $LOGFILE
3101echo "----------" >> $LOGFILE
[1230]3102df -T >> $LOGFILE
[1021]3103echo "-------------" >> $LOGFILE
[1230]3104echo "mount result:" >> $LOGFILE
3105echo "-------------" >> $LOGFILE
3106mount >> $LOGFILE
3107echo "-------------" >> $LOGFILE
[1315]3108if [ -e /etc/raidtab ]; then
3109 echo "-------------" >> $LOGFILE
3110 echo "/etc/raidtab content:" >> $LOGFILE
3111 echo "-------------" >> $LOGFILE
3112 cat /etc/raidtab >> $LOGFILE
3113fi
3114echo "-------------" >> $LOGFILE
[1418]3115echo "cat /proc/cmdline:" >> $LOGFILE
3116echo "-------------" >> $LOGFILE
3117cat /proc/cmdline >> $LOGFILE
3118echo "-------------" >> $LOGFILE
[1021]3119echo "lsmod result:" >> $LOGFILE
3120echo "-------------" >> $LOGFILE
3121lsmod >> $LOGFILE
[1399]3122MODULES="`cat /proc/modules | awk '{print $1}'`"
[1531]3123if [ -x /usr/sbin/esxcfg-module ]; then
[1497]3124 echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
3125 echo "-------------" >> $LOGFILE
3126 echo "VMWare modules" >> $LOGFILE
3127 echo "-------------" >> $LOGFILE
[1531]3128 /usr/sbin/esxcfg-module -l >> $LOGFILE
[1497]3129 MODULES="$MODULES `esxcfg-module -l | awk '{print $1}'`"
3130fi
[1021]3131echo "-------------" >> $LOGFILE
[1230]3132echo "Liste of extra modules is:" >> $LOGFILE
3133echo "$EXTRA_MODS" >> $LOGFILE
3134echo "-------------" >> $LOGFILE
[747]3135
[1723]3136# Compute libata version
[1726]3137laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g'`
[1723]3138# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]3139if [ "`echo $MODULES | grep libata`" ]; then
[1727]3140 if [ "$laver" = "2" ]; then
[1726]3141 DENY_MODS="$DENY_MODS ide-generic"
[1727]3142 echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
[1726]3143 echo "-------------" >> $LOGFILE
3144 fi
[1723]3145fi
3146
[747]3147if [ "$#" -ge "2" ] ; then
3148 if [ "$1" = "--max-compressed-size" ] ; then
3149 MAX_COMPRESSED_SIZE=$2
3150 shift; shift
3151 fi
3152fi
3153
3154FLOPPY_WAS_MOUNTED=""
3155for mtpt in /media/floppy /mnt/floppy /floppy ; do
3156 if mount | grep -w $mtpt &> /dev/null ; then
3157 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3158 umount $mtpt
3159 fi
3160done
3161
[1684]3162#
3163# If we have a USB device we need to store info
3164# and remove it from the parameters line
3165#
[747]3166if [ "$#" -ne "0" ] ; then
[1684]3167 if [ "$1" = "--usb" ] ; then
3168 shift
3169 USBDEVICE=$1
3170 if [ _"$USBDEVICE" = _"" ]; then
3171 Die "No USB device specified"
3172 fi
3173 shift
3174 fi
3175fi
3176
3177if [ "$#" -ne "0" ] ; then
[747]3178 if [ "$1" = "--findkernel" ] ; then
3179 res=`TryToFindKernelPath`
[1336]3180 # Avoids logfile content for mondo
3181 export MONDO_SHARE=""
[747]3182 if [ "$res" = "" ] ; then
[925]3183 MindiExit -1
[747]3184 else
3185 echo "$res"
[925]3186 MindiExit 0
[747]3187 fi
[1720]3188 elif [ "$1" = "--locatedeps" ] ; then
3189 [ ! "$2" ] && Die "Please specify the binary to look at"
3190 LocateDeps $2
3191 # Avoids logfile content for mondo
3192 export MONDO_SHARE=""
3193 MindiExit $?
[747]3194 elif [ "$1" = "--makemountlist" ] ; then
3195 [ ! "$2" ] && Die "Please specify the output file"
3196 MakeMountlist $2
[1336]3197 # Avoids logfile content for mondo
3198 export MONDO_SHARE=""
[925]3199 MindiExit $?
3200 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3201 echo "Mindi v$MINDI_VERSION"
[1336]3202 # Avoids logfile content for mondo
3203 export MONDO_SHARE=""
[925]3204 MindiExit 0
[747]3205 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]3206 MONDO_TMP=$2
3207 # Change MINDI_TMP for the one provided by mondo
3208 # So that it can get back the built files
[1010]3209 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2> /dev/null
3210 rmdir $MINDI_TMP
[1486]3211 export MINDI_TMP=$MONDO_TMP
[953]3212 mkdir -p $MINDI_TMP
[1696]3213 # This is the scratch dir in mondo - subdir images
[938]3214 CACHE_LOC=$3
3215 if [ _"$CACHE_LOC" != _"" ]; then
3216 mkdir -p $CACHE_LOC
3217 fi
[925]3218 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[747]3219###
3220### Sq-Modification...
3221### Attempt to locate kernel specific module path
3222### if module path is found then use it other wise use uname -r to set it...
3223###
3224 kernelname=`echo $kernelpath | cut -d'-' -f2-`
[963]3225 LogIt "kernelname = $kernelname"
3226 LogIt "kernelpath = $kernelpath"
[747]3227 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3228 then
[963]3229 LogIt "Module path for ${kernelpath} not found..."
3230 LogIt "using running kernel\'s modules."
[747]3231 kernelname=`uname -r`
3232 else
[963]3233 LogIt "Using modules for kernel: ${kernelname}"
[747]3234 fi
3235###
3236### end of Sq-Modification
3237###
[925]3238 TAPEDEV=$5
3239 TAPESIZE=$6
3240 FILES_IN_FILELIST=$7
3241 USE_LZO=$8
3242 CDRECOVERY=$9
[747]3243 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3244 IMAGE_DEVS=""
3245 else
3246 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3247 fi
[925]3248 if [ "${11}" ] ; then
3249 LILO_OPTIONS=""
3250 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3251 fi
3252 LAST_FILELIST_NUMBER=${12}
[747]3253 ESTIMATED_TOTAL_NOOF_SLICES=${13}
3254 EXCLUDE_DEVS="${14}"
3255 USE_COMP="${15}"
3256 USE_LILO="${16}"
[925]3257 USE_STAR="${17}"
3258 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]3259 DIFFERENTIAL="${19}"
[998]3260 USE_GZIP="${20}"
3261 NOT_BOOT="${21}"
[747]3262 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]3263 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[747]3264 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[963]3265 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
[925]3266 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
[747]3267 kernelname=`echo $kernelpath | cut -d'-' -f2-`
3268 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3269 then
[963]3270 LogIt "Module path for ${kernelpath} not found..."
3271 LogIt "using running kernel\'s modules."
[747]3272 kernelname=`uname -r`
3273 else
[963]3274 LogIt "Using modules for kernel: ${kernelname}"
[747]3275 fi
[925]3276 [ "$CDRECOVERY" = "yes" ] && [ "$TAPEDEV" != "" ] && Die "Sorry, you can't use --cd-recovery and --write-tapes at the same time"
[1696]3277 # MONDO_ROOT is the real scratchdir
[925]3278 MONDO_ROOT=`echo $CACHE_LOC | sed 's/\(.*\)\/.*/\1/'`
[938]3279 if [ _"$MONDO_ROOT" != _"" ]; then
3280 mkdir -p $MONDO_ROOT
3281 else
3282 Die "MONDO_ROOT is undefined"
3283 fi
[747]3284 else
[925]3285 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3286 MindiExit -1
[747]3287 fi
3288fi
3289#ScanCDandTape
3290[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3291if [ "$CDRECOVERY" = "yes" ] ; then
3292 iso_cfg_file=$MINDI_LIB/isolinux-H.cfg
3293 sys_cfg_file=$MINDI_LIB/syslinux-H.cfg
3294else
3295 iso_cfg_file=$MINDI_LIB/isolinux.cfg
3296 sys_cfg_file=$MINDI_LIB/syslinux.cfg
3297fi
3298
3299[ -e "$iso_cfg_file" ] || Die "Cannot find $iso_cfg_file"
[1684]3300if [ _"$MONDO_SHARE" = _"" ]; then
[963]3301 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3302 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3303 LogIt "BusyBox sources are available from http://www.busybox.net"
[747]3304 LogIt "------------------------------------------------------------------------------"
3305else
[1315]3306 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
[747]3307fi
[1005]3308if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3309 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3310else
3311 LogIt "Unable to find mindi-busybox, please install it"
3312 MindiExit -1
3313fi
[747]3314
3315# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
3316insmod /lib/modules/`uname -r`/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
3317for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3318 insmod $i >> $LOGFILE 2>> $LOGFILE
3319done
3320
3321KERN_DISK_MADE=""
3322
3323echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3324echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3325echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3326if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[963]3327 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]3328 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3329 MakeMountlist $MINDI_TMP/mountlist.txt
3330 mkdir -p $MINDI_TMP/small-all/tmp
3331 cd $MINDI_TMP/small-all
[953]3332 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]3333 tar -cv tmp | gzip -9 > $MINDI_TMP/all.tar.gz || Die "Cannot make small all.tar.gz"
[747]3334 sleep 2
[963]3335 LogIt "Done. Exiting."
[925]3336 MindiExit 0
[747]3337fi
3338
[1690]3339if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1684]3340 LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
3341fi
3342
[747]3343if [ "$kernelpath" = "" ] ; then
[1335]3344 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]3345 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3346 read ch
3347 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3348 USE_OWN_KERNEL="yes"
[747]3349 fi
3350 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]3351 YOUR_KERNEL_SUCKS=""
3352 kernelpath=`TryToFindKernelPath`
3353 if [ "$kernelpath" = "" ] ; then
3354 echo -n "Please enter kernel path : "
3355 read kernelpath
3356 fi
[747]3357 else
[925]3358 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]3359 fi
3360fi
[1575]3361if [ _"$MONDO_SHARE" = _"" ] && [ "$ARCH" != "ia64" ]; then
[966]3362 echo -en "Would you like to use LILO (instead of syslinux)\nfor your boot CD/floppies (y/[n]) ?"
[747]3363 read ch
[966]3364 if [ "$ch" != "y" ] && [ "$ch" != "Y" ] ; then
3365 USE_LILO=no
3366 else
[747]3367 USE_LILO=yes
3368 fi
3369fi
3370if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3371 kernelpath=$MINDI_LIB/vmlinuz
[963]3372 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3373 LogIt "However, you are still running your kernel. If Mindi fails to create your"
3374 LogIt "disks then it may still be a result of a problem with your kernel."
[747]3375 pwd=`pwd`
[940]3376 cd $MINDI_TMP
[747]3377 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3378 cd $pwd
3379 YOUR_KERNEL_SUCKS="Your kernel sucks"
3380fi
[940]3381echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$CACHE_LOC" >> $LOGFILE
[963]3382[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
[747]3383
[965]3384[ "$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]3385
[925]3386PrepareDataDiskImages $CACHE_LOC
[747]3387noof_disks=$?
3388ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3389rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3390ramdisk_size=$rds
3391
3392echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
[1567]3393if [ "$ARCH" = "ia64" ] ; then
3394 PrepareBootDiskImage_LILO $CACHE_LOC $BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create ia64 floppy disk image."
3395else
3396 if [ "$USE_LILO" = "yes" ] ; then
[925]3397 if ! PrepareBootDiskImage_LILO $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
[964]3398 LogIt "WARNING - failed to create 1.72MB boot image."
3399 LogIt "Please reduce your kernel's size if you want to make a 1.72MB floppy disk."
[747]3400 fi
[925]3401 if ! PrepareBootDiskImage_LILO $CACHE_LOC 2880 $kernelpath $ramdisk_size ; then
[963]3402 LogIt "WARNING - failed to create 2.88MB floppy disk image."
[964]3403 LogIt "Please reduce your kernel's size if you want to make a 2.88MB floppy disk."
[1282]3404 PrepareBootDiskImage_LILO $CACHE_LOC $BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create 2.88MB floppy disk image."
[747]3405 fi
[1567]3406 else
3407 if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 1722 $kernelpath $ramdisk_size ; then
3408 LogIt "WARNING - failed to create 1.72MB boot image."
3409 LogIt "Please reduce your kernel's size if you want to make a 1.72MB floppy disk."
3410 if ! PrepareBootDiskImage_SYSLINUX $CACHE_LOC 2880 $kernelpath $ramdisk_size ; then
3411 LogIt "WARNING - failed to create 2.88MB floppy disk image."
3412 LogIt "Please reduce your kernel's size if you want to make a 2.88MB floppy disk."
3413 PrepareBootDiskImage_SYSLINUX $CACHE_LOC $BOOT_SIZE $kernelpath $ramdisk_size || Die "Failed to create 5.76MB floppy disk image."
3414 fi
[747]3415 fi
3416 fi
3417fi
3418
3419[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3420...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3421
[1684]3422if [ _"$MONDO_SHARE" = _"" ]; then
[925]3423 ListImagesForUser $CACHE_LOC
[747]3424 boot_dev=/dev/fd0u1722
3425 [ ! -e "$boot_dev" ] && mknod $boot_dev b 2 60
3426 [ ! -e "$boot_dev" ] && boot_dev=/dev/fd0H1722
3427 [ ! -e "$boot_dev" ] && Die "Oh Lord, will you PLEASE tell the vendor to create the 1.72MB devices in /dev?"
3428 if [ "$PROMPT_WRITE_BOOT_FLOPPIES" = "yes" ]; then
[925]3429 OfferToCopyImagesToDisks $CACHE_LOC $boot_dev $FDDEVICE
[747]3430 fi
[1684]3431 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3432 OfferToMakeBootableUSB $CACHE_LOC
3433 fi
[925]3434 OfferToMakeBootableISO $CACHE_LOC
[963]3435 LogIt "Finished."
[747]3436elif [ "$TAPEDEV" ] ; then
[925]3437 OfferToMakeBootableISO $CACHE_LOC
3438 if [ -e "$CACHE_LOC/all.tar.gz" ] ; then
[963]3439 cp -f $CACHE_LOC/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]3440 else
[925]3441 Die "Cannot find all.tar.gz, to be written to tape"
[747]3442 fi
[1695]3443elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1684]3444 OfferToMakeBootableUSB $CACHE_LOC
[747]3445else
[925]3446 OfferToMakeBootableISO $CACHE_LOC
[747]3447fi
3448# cleanup
[963]3449LogIt "$FRIENDLY_OUTSTRING"
[747]3450for mtpt in $FLOPPY_WAS_MOUNTED ; do
3451 mount $mtpt
3452done
[925]3453MindiExit 0
Note: See TracBrowser for help on using the repository browser.