source: MondoRescue/branches/2.2.10/mindi/mindi@ 2395

Last change on this file since 2395 was 2395, checked in by Bruno Cornec, 15 years ago
  • Fix interface of evaluate_mountlist (remove 2nd param useless) and fix nuke mode which wasn't working.
  • Tries to add support for bzip2 and lzma initramfs (preliminary, not tested) for 2.6.30

(Backport from 2.2.9)

  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 103.7 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 2395 2009-09-12 00:57:02Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
[1880]8# Mindi can create a multi-image boot/root kit. The first image is the boot
[747]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`
[2293]17KERVERRUN=`/bin/uname -r`
18# By default we use the running kernel as a reference
19KERVER=$KERVERRUN
[747]20
[1511]21ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off"
[747]22
[1691]23MINDI_REV=PBREV
24MINDI_VER=PBVER
[747]25
26MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
27MINDI_PREFIX=XXX
28MINDI_CONF=YYY
29MINDI_SBIN=${MINDI_PREFIX}/sbin
[934]30MINDI_LIB=LLL
[747]31
[925]32# Temporary directory for mindi
33TMPDIR=/tmp
34
[1914]35EXTRA_SPACE=49152 # increase if you run out of ramdisk space
[1821]36BOOT_SIZE=16384 # size of the boot disk
[747]37
38PROMPT_MAKE_CD_IMAGE="yes"
39 # Ask if you want to make a CD Image to be written?
40 # if this is set to 'no', then the image will be created automatically
41
[1684]42PROMPT_MAKE_USB_IMAGE="yes"
43 # Ask if you want to make a USB Image to be written?
44 # if this is set to 'no', then the image will be created automatically
45
[966]46USE_OWN_KERNEL="yes"
[747]47 # If set to "no", you will be prompted for whether or not
48 # you want to use your own kernel, or the supplied default.
49 # If "yes" mindi will automatically use your own kernel.
[925]50
[747]51MY_FSTAB=/etc/fstab
52TAPE_MODS="ht st osst ide-tape ide_tape"
[2159]53SCSI_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 iscsi_tcp libiscsi scsi_transport_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 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp dc395x"
[747]54
55# ide-probe-mod
[2169]56IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod edd paride ata_generic ata_piix libata dock via82cxxx generic nvidia ahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks pata_sis amd74xx sis5513 jmicron sata_promise sata_via serverworks"
[747]57PCMCIA_MODS="pcmcia_core ds yenta_socket"
[2151]58USB_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 scsi_mod ff-memless"
[2382]59NET_MODS="sunrpc nfs nfs_acl lockd fscache loop mii 3c59x e100 bcm5700 bnx2 e1000 e1000e igb eepro100 ne2k-pci tg3 libphy pcnet32 8139cp 8139too 8390 forcedeth vmxnet vmnet exportfs fuse"
[1993]60CDROM_MODS="$TAPE_MODS $IDE_MODS $USB_MODS $PCMCIA_MODS $SCSI_MODS $NET_MODS af_packet cdrom isocd isofs inflate_fs nls_iso8859-1 nls_base nls_cp437 nls_utf8 sg sr_mod zlib_inflate iso9660"
61# Those modules will only go on the backup media, not the boot media.
[2382]62EXTRA_MODS="$CDROM_MODS vfat fat loop md-mod linear raid0 raid1 xor raid10 raid5 raid456 lvm-mod dm-mod dm_mod dm-snapshot dm_snapshot dm-zero dm_zero dm-mirror dm_mirror dm-multipath dm-round-robin dm-emc dm-hp-sw dm-rdac multipath jfs xfs xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16"
[1230]63# Replace with that line for HP OCMP e.g.
[2073]64#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
[1828]65DENY_MODS="kqemu"
[1399]66# Force some modules to be included
[1354]67FORCE_MODS=""
[925]68
[747]69LOGFILE=/var/log/mindi.log
[1880]70MINDI_CACHE=/var/cache/mindi
[747]71BOOT_MEDIA_MESSAGE="\
72To format and restore all files automatically, type 'nuke' <enter>.\n\
73To restore some/all files interactively, type 'interactive' <enter>.\n\
74To compare the archives with your filesystem, type 'compare' <enter>.\n\
75To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
76You may add one or more of the following parameters as well:-\n\n\
77 donteject - mondorestore will not eject the CD; this is useful if, for\n\
78 instance, your PC's case has a concealed CD-ROM drive\n\
79 noresize - your mountlist will not be adjusted to use your unallocated\n\
80 hard disk space\n\
81 textonly - do not call any Newt library routines; this is unattractive\n\
82 but valuable if you find your Newt library has bugs in it\n\n\
83e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
84a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
85"
[925]86FDISK=$MINDI_SBIN/parted2fdisk
[747]87
[925]88# Using a config file allow to overwrite some values
89MINDI_CONFIG="$MINDI_CONF/mindi.conf"
90if [ -f $MINDI_CONFIG ]; then
91 . $MINDI_CONFIG
92fi
[1885]93DEPLIST_FILE="$MINDI_CONF/deplist.txt"
94ISO_CMD="/usr/bin/mkisofs"
95ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
[925]96
[1485]97# Now we can create what we need
[2150]98MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
99if [ $? -ne 0 ]; then
100 df $TMPDIR
101 Die "Unable to create a temporary directory ! Check space on $TMPDIR"
102fi
[2153]103if [ _"$MINDI_TMP" = _"" ]; then
104 Die "MINDI_TMP is empty, aborting"
105fi
106if [ _"$MINDI_TMP" = _"/" ]; then
107 Die "MINDI_TMP is /, aborting"
108fi
[2150]109export MINDI_TMP
[940]110
[747]111# ----------------------------------------------------------------------------
112
113
114AbortHere() {
115 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
116 Die "Program is terminating in response to signal received from OS/user"
117}
118
119
120Aborted() {
121 trap SIGHUP SIGTERM SIGTRAP SIGINT
[1880]122 [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
[747]123 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
124 Die "User abort."
125}
126
127
128AddFileToCfgIfExists() {
129 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
130}
131
132
133AddKeyboardMappingFile() {
134 local mappath r included_list included_item i res ii sss
135 mappath=$1
136 KBDEPTH=$(($KBDEPTH+1))
137 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
138 if [ -e "$bigdir/$mappath" ] ; then
[2341]139 LogFile "$mappath already added"
[747]140 return
141 elif [ -d "$bigdir/$mappath" ] ; then
142 echo "Cannot add $mappath: it's a directory. Sorry."
143 return
144 fi
[2341]145 LogFile "Added kbd map $mappath"
[747]146 if [ ! -e "$mappath" ] ; then
[1764]147 mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
[747]148 if [ ! -e "$mappath" ] ; then
[2341]149 LogAll "Cannot add $mappath: kbd map file not found"
[747]150 return
151 fi
152 else
153 echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
154 fi
155
156 mkdir -p $bigdir/etc
[2341]157 tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogAll "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
[747]158 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
159 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
160 else
161 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
162 fi
163 for included_item in $included_list ; do
[925]164 if [ ! -e "$included_item" ] ; then
[1764]165 sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
166 [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
[925]167 for ii in $sss ; do
[747]168 [ -e "$ii" ] && AddKeyboardMappingFile $ii
[925]169 done
170 else
171 AddKeyboardMappingFile $included_item
172 fi
[747]173 done
174}
175
176
177CopyDependenciesToDirectory() {
[1989]178 local outdir incoming fname counter d found
[747]179 outdir=$1
180 mkdir -p $outdir
181 incoming=`ReadLine`
182 counter=0
183 while [ "$incoming" != "" ] ; do
[1526]184 # Non absolute file names should not arrive till here => skipped
185 if [ `echo "$incoming" | cut -c1` != '/' ]; then
[2341]186 LogAll "Unable to handle $incoming"
[1526]187 incoming=`ReadLine`
188 continue
189 fi
190 # no parent directory of incoming should be a link, copy is not possible in that case
191 d=`dirname "$incoming"`
192 found="false"
193 while [ $d != "/" -a $found = "false" ]; do
194 [ -h "$d" ] && found="true"
195 d=`dirname "$d"`
196 done
197 if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
[747]198 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
[1526]199 elif [ -e "$incoming" ] && [ $found = "false" ]; then
[2166]200 tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd $outdir ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
[1989]201
202 # Only uncompress modules if not using udevd
203 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
[2341]204 gunzip -f $outdir/$incoming || LogAll "Cannot gunzip $outdir/$incoming"
[925]205 fi
[1989]206 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
[925]207 counter=$(($counter+1))
208 if [ "$counter" -ge "5" ] ; then
209 counter=0
210 echo -en "."
211 fi
[747]212 fi
213 incoming=`ReadLine`
214 done
215}
216
217
218CountItemsIn() {
219 local r
220 r=0
221 for q in $1 ; do
222 r=$(($r+1))
223 done
224 echo $r
225}
226
227
[925]228# Last function called before exiting
229# Parameter is exit code value
[931]230MindiExit() {
[925]231 local my_partitions
[747]232
[2341]233 LogFile "Mindi $MINDI_VERSION is exiting"
234 LogFile "End date : `date`"
[1335]235 if [ _"$MONDO_SHARE" != _"" ] ; then
[1349]236 echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
[1315]237 cat $LOGFILE >> /var/log/mondoarchive.log
[1349]238 echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
[1315]239 fi
[747]240
[925]241 cd /
[1636]242 sync&
[747]243
[1636]244 # Unmount what could remain mounted
[925]245 my_partitions=`mount | grep -F $$ | cut -f1 -d' '`
246 [ "$my_partitions" != "" ] && umount $my_partitions
[940]247 # Clean temporary files only when standalone mindi
[948]248 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
[2153]249 rm -Rf $MINDI_TMP
[940]250 fi
[925]251 exit $1
252}
253
[747]254Die() {
[925]255 local i
[747]256 if [ "$1" = "" ] ; then
[2341]257 LogAll "FATAL ERROR"
[747]258 else
[2341]259 LogAll "FATAL ERROR. $1"
[747]260 fi
[2166]261 if [ _"$2" != _"" ]; then
262 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
263 fi
264 rm -f "$2"
[747]265
[2341]266 LogAll "Please e-mail a copy of $LOGFILE to the mailing list."
267 LogAll "See http://www.mondorescue.org for more information."
268 LogAll "WE CANNOT HELP unless you enclose that file.\n"
[925]269 MindiExit -1
[747]270}
271
272
273DropOptimizedLibraries() {
274 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
275 filelist=$1
276 outdir=$2
277
278 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
279 if [ "$list_of_optimized_libraries" = "" ] ; then
[859]280 return 0
[747]281 fi
282 echo -en "Dropping i686-optimized libraries if appropriate"
283 for optimized_lib_name in $list_of_optimized_libraries ; do
[859]284 echo -en "."
285 reason=""
[1483]286 vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
[859]287 echo "$vanilla_lib_name" >> $filelist
[2341]288 LogFile "Adding $vanilla_lib_name to filelist"
[859]289 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
290 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
[2168]291
292 # This may return multiple files
293 for resolved in `ReadAllLink $vanilla_lib_name`; do
[2341]294 LogFile "Adding as deps $resolved to filelist"
[2168]295 vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
296 mkdir -p $outdir$resolved> /dev/null 2> /dev/null
297 rmdir $outdir$resolved > /dev/null 2> /dev/null
298 ln -sf $vanilla_resolved_name $outdir$resolved
[2341]299 LogFile "Excluding deps $resolved"
[2168]300 grep -Fvx "$resolved" "$filelist" > $filelist.tmp
[2341]301 LogFile "Replacing it with $vanilla_resolved_name"
[2168]302 echo "$vanilla_resolved_name" >> $filelist.tmp
303 mv -f $filelist.tmp $filelist
304 done
[747]305 done
[925]306 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
[747]307 mv -f $filelist.tmp $filelist
308 echo -e "$DONE"
309}
310
311
312FindAndAddUserKeyboardMappingFile() {
313 local r res mapfile mappath included_item included_list keyfile mp locale
[2341]314 LogAll "Analyzing your keyboard's configuration."
[747]315 KEYDIR=/lib/kbd
316 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
317 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
318 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
[1713]319 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
320 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
[747]321 if [ ! -e "$KEYDIR" ] ; then
[2341]322 LogAll "Keyboard mapping directory not found. I shall use default map at boot-time."
[747]323 return 0
324 fi
325 if [ -e "/etc/sysconfig/keyboard" ] ; then
[2341]326 LogFile "Red Hat-style config detected."
[747]327 keyfile=/etc/sysconfig/keyboard
328 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
[2341]329 LogFile "Slackware-style config detected."
[747]330 keyfile=/etc/rc.d/rc.keymap
331 elif [ -e "/etc/rc.config" ] ; then
[2341]332 LogFile "Debian-style config detected."
[747]333 keyfile=/etc/rc.config
334 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
[2341]335 LogFile "Debian-style config detected."
[747]336 echo -en "Adding the following keyboard mapping tables: "
337 mkdir -p $bigdir/tmp
338 echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
339 KBDEPTH=0
340 mkdir -p $bigdir/etc/console
[963]341 cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
[747]342 echo -e "$DONE"
343 return 0
[1713]344 elif [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
[2341]345 LogFile "Ubuntu-style config detected."
[1713]346 echo -en "Adding the following keyboard mapping tables: "
347 mkdir -p $bigdir/tmp
348 echo "/etc/console-setup/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
349 KBDEPTH=0
350 mkdir -p $bigdir/etc/console-setup
351 cp /etc/console-setup/boottime.kmap.gz $bigdir/etc/console-setup 2>> $LOGFILE
352 echo -e "$DONE"
353 return 0
[1465]354 elif [ -e "/etc/conf.d/keymaps" ] ; then
[2341]355 LogFile "Gentoo-style config detected."
[1465]356 keyfile=/etc/conf.d/keymaps
[747]357 else
358 echo -en "Searching for rc.config ..."
359 keyfile=`find /etc -name rc.config | head -n1`
360 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
[2341]361 LogAll "Unknown config detected. Default keyboard map will be used."
[747]362 return
363 else
[2341]364 LogFile "Found $keyfile"
[747]365 fi
366 fi
367 if [ ! -e "$KEYDIR/keymaps" ] ; then
[2341]368 LogAll "Keyboard mapping directory not found. Default keyboard map will be used."
[747]369 return
370 fi
[2341]371 LogFile "keyfile=$keyfile"
[747]372 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
373 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
[1465]374 [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2` # Gentoo
[2341]375 LogFile "locale=$locale"
[1764]376 #
377 # Process the keymaps dir once for all
378 # AddKeyboardMappingFile will use it recursively
379 #
380 find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
381 mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
382 [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
[747]383 # If we have multiple keymaps then log it !!
384 echo "$mp" | grep -q " "
385 if [ $? -eq 0 ]; then
[2341]386 LogAll "WARNING: Multiple keymaps found: $mp"
387 LogFile "The following one will be used"
[747]388 fi
389 for i in $mp ; do
390 mappath=$i
391 [ -e "$i" ] && [ ! -d "$i" ] && break
392 done
393 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
[1854]394 mappath=$(find / -name "*/kbd/keymaps/*/$locale")
[747]395 fi
[2341]396 LogFile "mappath = $mappath"
[747]397 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
[2341]398 LogAll "Keyboard mapping file not found. Default keyboard map will be used."
[747]399 return
400 fi
401 echo -en "Adding the following keyboard mapping tables: "
402 mkdir -p $bigdir/tmp
403 echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
[2055]404 KBDEPTH=0
[747]405 AddKeyboardMappingFile $mappath
406 echo -e "$DONE"
[1764]407 rm -f $MINDI_TMP/keymaps.find
[747]408 return 0
409}
410
411
412FindIsolinuxBinary() {
413 ISOLINUX=/usr/lib/isolinux.bin
414 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
[1491]415 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
[747]416 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
417 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
[1491]418 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
[1854]419 [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
[747]420 [ ! -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'"
[2341]421 LogFile "Found isolinux.bin at $ISOLINUX"
[747]422}
423
424
425FindSpecificModuleInPath() {
426 local modpaths pwd line
427 pwd=`pwd`
428 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[940]429 cd $MINDI_TMP
[747]430 else
431 cd /
432 fi
433 if [ ! -e "$1" ] ; then
[2341]434 LogAll "WARNING - cannot search specific path '$1'"
[747]435 return 1
436 fi
437 modpaths=`find $1 -name $2.*o -type f`
[1815]438 #[ "$?" -ne "0" ] && Die "find $1 -name $2.o -type f --- failed"
[747]439 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f`
440 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f`
441 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f`
442 echo "$modpaths"
443 cd $pwd
444}
445
446
447GenerateGiantDependencyList() {
448 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
449
450 echo -en "Analyzing dependency requirements"
451 outfile=$1
[940]452 tempfile=$MINDI_TMP/$$.txt
[747]453 incoming=`ReadLine`
454
455 > $tempfile
456 progress=0
457 res=0
458 noof_lines=$2
459 while [ "$incoming" != "" ] ; do
[861]460 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
461 incoming=`ReadLine`
462 continue
463 fi
464 if [ "$incoming" = "LVMFILES:" ] ; then
465 break
466 fi
[747]467 filelist=`GenerateListForFile "$incoming"`
468 r=$?
[2341]469 [ "$r" -ne "0" ] && LogAll "$incoming not found"
[747]470 res=$(($res+$r))
[861]471# echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
[747]472 for fname in $filelist ; do
[861]473 [ "$fname" != "" ] && echo "$fname" >> $tempfile
[747]474 done
475 progress=$(($progress+1))
[2341]476 LogProgress $progress $noof_lines
[747]477 incoming=`ReadLine`
478 done
[861]479 if [ "$incoming" = "LVMFILES:" ] ; then
480 incoming=`ReadLine`
481 lvmversion=""
482 while [ "$incoming" != "" ] ; do
483 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
484 incoming=`ReadLine`
485 continue
486 fi
487 filelist=`GenerateListForFile "$incoming"`
488 for tool in $filelist ; do
489 lvmresolved=`readlink -f $tool`
[1342]490 if [ "$tool" = "$lvmresolved" ]; then
[861]491 echo "$tool" >> $tempfile
492 elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
493 if [ "$lvmversion" = "" ] ; then
494 lvmversion=`$lvmresolved`
495 echo "$lvmresolved" >> $tempfile
496 fi
497 toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
[1342]498 if [ "$lvmversion" = "200" ]; then
[861]499 # pvdata and lvmcreate_initrd don't exist in LVM2
500 case "$toolstripped" in
501 "pvdata")
502 continue
503 ;;
504 "lvmcreate_initrd")
505 continue
506 ;;
507 esac
508 fi
509 toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
510 if [ -e "$toolpath" ] ; then
511 echo "$toolpath" >> $tempfile
512 echo "$tool" >> $tempfile
513 else
514 toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
515 fi
516 if [ -e "$toolpath" ] ; then
517 echo "$toolpath" >> $tempfile
518 echo "$tool" >> $tempfile
519 else
520 echo "Where are your LVM-Tools? Couldn't find $tool"
521 fi
522 else
523 echo "$tool" >> $tempfile
524 fi
525 done
526 progress=$(($progress+1))
[2341]527 LogProgress $progress $noof_lines
[861]528 incoming=`ReadLine`
529 done
[747]530 fi
531 echo -en "$DONE\nMaking complete dependency list"
532
533 tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
534 mv -f $tempfile.new $tempfile
535 > $outfile.pre
536 progress=0
537 noof_lines=`cat $tempfile | wc -l`
[2341]538 LogFile "---------------------------------"
539 LogFile "List of dependencies: "
540 LogFile "---------------------------------"
[747]541 for fname in `cat $tempfile` ; do
[1876]542 echo "$fname" | tee -a $LOGFILE >> $outfile.pre
543 LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
[925]544 progress=$(($progress+1))
[2341]545 LogProgress $progress $noof_lines
[747]546 done
[1684]547 if [ _"$MONDO_SHARE" != _"" ]; then
[925]548 mkdir -p $bigdir/tmp
549 mkdir -p $bigdir/sbin
550 mkdir -p $bigdir/bin
[940]551 if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
[2341]552 LogAll "\nIncorporating post-nuke tarball"
[925]553 old_pwd=`pwd`
554 cd $bigdir
[2341]555 tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogAll "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
[925]556 cd $old_pwd
[747]557 fi
[963]558 if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
[925]559 LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
560 else
[2341]561 LogAll "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
562 LogAll "I bet you've got a spare copy of Mondo or Mindi floating around on your system."
563 LogAll "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."
[925]564 Die "Odd."
565 fi
[2341]566 cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogAll "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
[2382]567 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[2341]568 LogAll "\nIncorporating NFS-related settings"
[2382]569 for r in NETFS-* ISO-PREFIX ; do
[963]570 cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
[2341]571 LogFile "Copying $r to ramdisk"
[925]572 done
573 fi
[747]574 fi
[925]575 tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
[747]576 rm -f $tempfile $outfile.pre
577 [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
578 return $res
579}
580
581
582GenerateListForFile() {
583 local files_found loc fname incoming i res
584 incoming="$1"
585 files_found=""
586 res=0
587
588 for fname in $incoming ; do
589 files_found="$files_found `LocateFile $fname`"
590 done
591
592 echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
593}
594
595
596# Returns all disk devices which are part of a raid array
597GetAllRaidMembers() {
598 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
599}
600
601
602GetFileSizeList() {
603 local i
604 for i in `find $1 -type d -o -print` ; do
605 du -sk $i
606 done
607}
608
609
610GetHomeDir() {
611 local res loc
612 loc=`which $1 2>/dev/null`
613 res=`file $loc | $AWK '{print $NF;}'`
614 dirname $res
615}
616
617
[1230]618# Check kernel filesystem capabilites for accessing initrd image
619#
620# Interface definition:
621# param #1: absolute path to kernel image
622GetInitrdFilesystemToUse() {
623
624 # interface test: make sure we have one parameter
625 if [ $# -ne 1 ]; then
626 Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
627 fi
628
629 # interface parameters
630 local lvKernelImage=$1
631
632 # local constants (filesystem magic strings)
633 local lcMagicCramfs="<3>cramfs: wrong magic"
[2047]634 local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
[2391]635 local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
[2312]636 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
637initramfs"
[1230]638
639 # local variables
640 local lvOffset
641 local lvScanRes
642 local lvUseFilesystem
643
644 # say where we are.
[2341]645 LogFile " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage.\n"
[1230]646
647 # verify that file exists
648 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
649
[1566]650 # Kernel may be gzip compressed
[1730]651 file $lvKernelImage 2>&1 | grep -q gzip
[1566]652 if [ $? -eq 0 ]; then
[2391]653 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
[1566]654 else
[2395]655 # Since 2.6.30 kernel can use lzma and bzip2 in addition to gzip for initramfs compression
656 # get offet of gzip magic "1f8b0800" in file (or 1f8b9e ??)
[1566]657 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}'`
[2395]658 if [ $lvOffset -eq 0 ]; then
659 # get offet of bzip2 magic "425a" in file
660 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "425a")}'`
661 if [ $lvOffset -eq 0 ]; then
662 # get offet of lzma magic "5d00" in file
663 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "5d00")}'`
664 if [ $lvOffset -eq 0 ]; then
665 Die "No magic compression pattern found in file $lvKernelImage. Terminating."
666 else
667 comp="lzma"
668 fi
669 else
670 comp="bzip2"
671 fi
672 else
673 comp="gzip"
674 fi
675
[1566]676 lvOffset=`expr $lvOffset / 2`
[2395]677 LogFile " GetInitrdFilesystemToUse(): $comp magic found in $lvKernelImage at lvOffset $lvOffset.\n"
[1230]678
[1566]679 # scan kernel image for initrd filessystem support
[2395]680 lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | $comp -dc 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
[1566]681 fi
[1230]682
683 # determine which filesystem to use for initrd image: ext2fs, gzip'ed cpio (initramfs ) or cramfs
[1730]684 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
[1230]685 lvUseFilesystem="ext2fs"
[2391]686 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
687 lvUseFilesystem="ext3fs"
[1730]688 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
[1230]689 lvUseFilesystem="initramfs"
[1730]690 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
[1230]691 lvUseFilesystem="cramfs"
692 else
693 lvUseFilesystem="UNSUPPORTED"
694 fi
695
696 # say what we are using
[2341]697 LogFile " GetInitrdFilesystemToUse(): Filesytem to use for initrd is $lvUseFilesystem.\n"
[1230]698
699 # return file system to use
700 echo "$lvUseFilesystem"
701
702}
703
[747]704# Searches parent raid device of given disk device
705# $1: disk device (i.e. /dev/hda1)
706GetParentRaidDev() {
707 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
708}
709
710
711# Searches members of raid device
712# $1: raid device (/dev/md...)
713GetRaidDevMembers() {
714 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
715}
716
717
718HackPathsToFailsafe() {
[2293]719 local incoming newpath stub i pwd
[747]720 incoming=`ReadLine`
721 pwd=`pwd`
[940]722 cd $MINDI_TMP
[747]723 while [ "$incoming" != "" ] ; do
[925]724 stub=`basename $incoming`
725 newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
726 for i in $newpath ; do
727 echo "$i"
728 done
729 read incoming
[747]730 done
731 cd $pwd
732}
733
734
735ListAllPartitions() {
736 local res currline partition all_partitions ap_orig remaining i j
737
[2070]738 grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
[747]739 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
[1824]740 if [ -e "/vmfs/volumes" ]; then
741 # For VMWare ESX 3 get the device names of these volumes
742 vdf -P | grep -E '/vmfs/volumes' | awk '{print $1}'
743 fi
[747]744 return
745}
746
747
748ListImagesForUser() {
749 local path fname
[1983]750 path=$MINDI_CACHE
[747]751 echo -en "In the directory '$path' you will find the images:-\n"
752 for fname in `ls $path | grep -F mindi-` ; do
753 printf "%19s " $fname
754 done
755 echo " "
756}
757
758
759ListKernelModulePaths() {
760 local module_list module fname oss r kern
761 oss="/root/oss/modules"
[1399]762 module_list="$MODULES"
[1230]763 # Remove unwanted modules from list
764 for i in $DENY_MODS; do
765 module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
[1726]766 EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
[1230]767 done
[747]768###
769### Sq-Modification ... Use kernelname for module search path if specified
770###
771 if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
772 then
773 kern=${kernelname}
774 else
[2293]775 kern="$KERVERRUN"
[747]776 fi
[2293]777 export KERVER=$kern
[747]778###
779### Sq-Mod End
780###
781 for module in $module_list $EXTRA_MODS ; do
782 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
[2341]783 LogFile "module $module --> $r"
[747]784 [ "$r" ] && echo "$r"
785 [ -f "$oss" ] && find $oss | grep -F $module
786 done
787 find /lib/modules/$kern/modules.* -type f 2> /dev/null
788 [ -f "$oss" ] && find $oss.* 2> /dev/null
789}
790
[1784]791#
792# Critical function which computes all dependencies (dyn. lib.)
793# for a list of binaries
794#
[747]795LocateDeps() {
796 local incoming fname deps
[1724]797 incoming="$*"
[747]798 for fname in $incoming ; do
799 if [ ! -e "$fname" ] ; then
[2341]800 LogFile "WARNING - $fname does not exist; cannot be LDD'd."
[747]801 if echo $fname | grep lvm &> /dev/null ; then
[2341]802 LogFile "This warning only affects you if you are using LVM."
[1399]803 if echo "$MODULES" | grep lvm &> /dev/null ; then
[2341]804 LogFile "I think you are, so please take heed!"
[747]805 else
[2341]806 LogFile "I don't think you are, so don't worry about it."
[747]807 fi
808 fi
809 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
[2341]810 LogFile "$fname is softlink"
[747]811 else
[1526]812 ldd $fname 2> /dev/null | ProcessLDD
[747]813 fi
814 done
815}
816
[925]817
[860]818# Give all symlinks recursively of a full path name
819ReadAllLink() {
820 file="$1"
[747]821
[2174]822 echo $file | grep -q '\.\./'
[2175]823 if [ $? -eq 0 ]; then
[2174]824 # We need to normalise the path with .. in it
825 file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
826 fi
[1883]827 echo "$file"
[860]828 if [ ! -h $file ]; then
829 return 0
830 fi
[747]831
[1883]832 link=`readlink $file`
[862]833 d=`dirname $file`
[1883]834 fchar=`echo $link | cut -c1`
835 # If mother dir is a link print it
[1230]836 if [ -h "$d" ]; then
[1784]837 echo "$d"
[1883]838 d=`readlink $d`
839 fi
840 if [ "$fchar" != "/" ]; then
841 # Relative or local link
842 ReadAllLink "$d/$link"
[860]843 else
[1883]844 # Absolute path
845 ReadAllLink $link
[1230]846 fi
[860]847}
848
[925]849
[747]850LocateFile() {
851 local i path fname_to_find location output resolved tmp stub cache_id loclist
852 fname_to_find="$1"
[1526]853 # It's an absolute path
[747]854 if echo "$fname_to_find" | grep -x "/.*" ; then
[859]855 output="$fname_to_find"
[860]856 if [ -h "$output" ] ; then
857 output="`ReadAllLink $output` $output"
858 fi
[859]859 echo "$output"
860 return 0
[747]861 fi
[1526]862 # It's not an absolute path
[747]863 output=""
[1526]864 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
865 #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
866 [ -h "$path" ] && continue
867 [ ! -e "$path/$fname_to_find" ] && continue
868 output="$path/$fname_to_find $output"
869 if [ -h "$path/$fname_to_find" ] ; then
870 output="`ReadAllLink $path/$fname_to_find` $output"
871 fi
[747]872 done
873 if [ "$output" = "" ] ; then
[860]874 return 1
[747]875 fi
876 echo "$output"
877 return 0
878}
879
[2341]880LogProgress() {
881 local i progress modres noof_lines
882
883 progress=$1
884 noof_lines=$2
[747]885
[2341]886 echo -en "\r\t\t\t\t\t\t\t\t"
887 i=$(($progress*100))
888 i=$(($i/$noof_lines))
889 echo -en "$i"
890 echo -en "%"
891 modres=$(($progress%4))
892 [ "$modres" -eq "0" ] && echo -en "\t/"
893 [ "$modres" -eq "1" ] && echo -en "\t-"
894 [ "$modres" -eq "2" ] && echo -en "\t\\"
895 [ "$modres" -eq "3" ] && echo -en "\t|"
896}
897
898# Function to log on screen only
899LogScreen() {
[747]900 if [ -e /dev/stderr ] ; then
[925]901 echo -e "$1" >> /dev/stderr
[747]902 elif [ -e /usr/bin/logger ] ; then
[925]903 /usr/bin/logger -s $1
[747]904 fi
[2341]905}
906
907# Function to log in log file only
908LogFile() {
909
[965]910 echo -e "$1" >> $LOGFILE
[2166]911 if [ _"$2" != _"" ]; then
912 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
913 fi
914 rm -f "$2"
[747]915}
916
[2341]917# Function to log in both screen and logfile
918LogAll() {
919 LogScreen "$1"
920 LogFile "$1" "$2"
921}
[747]922
[2341]923
[747]924# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
925MakeMondoConfigFile() {
926 local outfile use_lzo use_comp use_star
927 outfile=$1
928 > $outfile
929 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
930 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
[1698]931 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
[747]932 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
933 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
934 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
935 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
[998]936 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
[2338]937 use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
[747]938 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
939 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
940 echo "use-lzo $use_lzo" >> $outfile
[2338]941 echo "use-lzma $use_lzma" >> $outfile
[747]942 echo "use-star $use_star" >> $outfile
943 echo "use-comp $use_comp" >> $outfile
944 echo "datestamp `date`" >> $outfile
945 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
[2382]946 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
947 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
948 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
949 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
950 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
951 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
952 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
953 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
954 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
[940]955 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
956 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
957 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
958 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
959 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
960 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
961 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
962 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
963 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
964 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
[949]965 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
966 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
[1948]967 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
[747]968}
969
970
971MakeMountlist() {
972 local scratchdir mountlist all_partitions current_partition \
973partition_size partition_format outstring partition_number \
974partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
[2013]975absolute_partition old_partition_fmt current_lvolume uname skip
[747]976
[2341]977 LogFile "Your raw fstab file looks like this:"
978 LogFile "------------------------------------"
[747]979 cat $MY_FSTAB >> $LOGFILE
[2341]980 LogAll "Your mountlist will look like this:"
981 LogAll "-----------------------------------"
[747]982
983# scratchdir, mountlist(OUT)
[940]984 scratchdir=$MINDI_TMP
[747]985 mountlist=$1
986
987# NB: partition = device
988# NB: mountpt = where the device is mounted
989
990 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
991
[1684]992 [ "$mountlist" != "" ] && rm -Rf $mountlist
[747]993 > $mountlist
994 all_partitions=""
995
996 if [ $LVM != "false" ]; then
[1885]997 echo -en "Analyzing LVM...\n"
[968]998 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
[971]999 if [ $? -ne 0 ]; then
[963]1000 LVM="false"
1001 fi
[968]1002 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-32`
[747]1003 fi
1004 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1005# echo "all partitions = $all_partitions" > /dev/stderr
1006 for i in $IMAGE_DEVS ; do
1007 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1008 done
1009 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
[1755]1010 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
[747]1011 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"
1012 for c_p in $all_partitions ; do
1013 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
1014 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1015 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]1016 current_partition=`readlink -f $c_p`
[747]1017 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1018 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1019 else
1020 current_partition="$c_p"
1021 fi
1022 [ "$c_p" = "none" ] && continue
[2193]1023 # Debian 5 does that
1024 [ "$c_p" = "proc" ] && continue
[747]1025 redhat_label=""
[1831]1026 label=""
[957]1027 uuid=""
[861]1028 absolute_partition=`readlink -f $c_p`
[747]1029 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1030
1031 # Detects noauto partitions not mounted and exclude them
1032 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1033 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1034 continue
1035 fi
1036
[1986]1037 # set default in case we dont't find it
1038 str_to_find_fmt_with=$current_partition
1039
[747]1040 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1041 # current_partition contains only first column of /etc/fstab
1042 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
[980]1043 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
[747]1044 actual_dev=""
[853]1045
1046 # 1st try, findfs - the RHEL way of finding labels and their partitions
1047 if [ -x "/sbin/findfs" ]; then
[855]1048 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
[853]1049 fi
[747]1050
[853]1051 # 2nd try : blkid, the good way for all LABEL except swap
1052 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[980]1053 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
[747]1054 # For LVM FS it will give a /dev/dm-# which should then be converted
[748]1055 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1056 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1057 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[747]1058 for dev in `ls /dev/mapper/*`; do
[963]1059 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1060 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[747]1061 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1062 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[747]1063 break
1064 fi
1065 done
1066 fi
1067 fi
1068
[853]1069 # 3rd try, which works on a standard partition (ext2/3), but not on swap
[747]1070 # For LVM gives a /dev/mapper entry
1071 if [ "x$actual_dev" = "x" ]; then
[980]1072 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
[747]1073 fi
1074
[853]1075 # 4th try, with vol_id
[747]1076 # SWAP only
1077 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[963]1078 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
[747]1079 for dev_swap in $list_swaps ; do
1080 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1081 if [ "x$dev_exists" != "x" ]; then
1082 actual_dev=$dev_swap
1083 break;
1084 fi
1085 done
1086 fi
1087
[853]1088 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
[789]1089 # LABEL=SW-cciss/c0d0p3 (RDP)
[853]1090 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
[747]1091 # SWAP only
[789]1092 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
[2013]1093 skip=""
[2293]1094 uname=$KERVERRUN
[2013]1095 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1096 # 2.6.12 needs 16 (FC3)
1097 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1098 # 2.6.19 and upper needs 1052
1099 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1100 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1101 if [ $skip = "" ]; then
1102 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1103 fi
[853]1104 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1105 do
1106 # Location of the swap label for kernel 2.6
[2013]1107 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
[853]1108 if [ "x$try_dev_label" = "x$redhat_label" ]; then
[855]1109 actual_dev=$try_dev
[853]1110 fi
1111 done
[747]1112 fi
[1008]1113
1114 # Check if one of all those tries has known success
1115 if [ "x$actual_dev" != "x" ]; then
1116 current_partition=$actual_dev
1117 else
[1885]1118 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 $MY_FSTAB or install findfs|blkid|vol_id"
[1008]1119 fi
[957]1120 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1121 # current_partition contains only first column of /etc/fstab
[1009]1122 elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
[980]1123 uuid=`echo "$current_partition" | cut -d'=' -f2`
[957]1124 actual_dev=""
1125
1126 # 1st try, findfs - the RHEL way of finding labels and their partitions
1127 if [ -x "/sbin/findfs" ]; then
1128 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1129 fi
1130
[1531]1131 # 2nd try : blkid, the good way for all UUID except swap
[957]1132 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[980]1133 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
[957]1134 # For LVM FS it will give a /dev/dm-# which should then be converted
1135 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1136 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1137 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[957]1138 for dev in `ls /dev/mapper/*`; do
[963]1139 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1140 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[957]1141 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1142 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[957]1143 break
1144 fi
1145 done
1146 fi
1147 fi
1148
1149 # 3th try, with vol_id
1150 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[963]1151 list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
[957]1152 for dev in $list_dev ; do
1153 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1154 if [ "x$dev_exists" != "x" ]; then
1155 actual_dev=$dev
1156 break;
1157 fi
1158 done
1159 fi
1160
[1531]1161 # 4th try, with dumpuuid (VMWare only ?) for swap
1162 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1163 list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1164 for dev in $list_dev ; do
1165 dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1166 if [ "x$dev_exists" != "x" ]; then
1167 actual_dev=$dev
1168 break;
1169 fi
1170 done
1171 fi
1172
[747]1173 # Check if one of all those tries has known success
1174 if [ "x$actual_dev" != "x" ]; then
1175 current_partition=$actual_dev
1176 else
[2069]1177 Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
[747]1178 fi
1179 else
[1863]1180 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1181 # they use symlinks in fstab unrelated to what is shown in mount !
1182 if [ _"$partition_mountpt" = _"" ]; then
[1986]1183 # set default in case we dont't find it
[1863]1184 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
[1864]1185 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
[1863]1186 str_to_find_fmt_with=$tmpp
[1865]1187 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
[1864]1188 break;
[1863]1189 fi
1190 done
1191 fi
[747]1192 fi
1193
1194 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1195 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1196 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1197 # the former is then a link to the latter, so we test whether
1198 # $current_partition is actually such a link or not and set
[755]1199 # $current_lvolume accordingly. On Debian you may find more than one answer
1200 # so we remove the one corresponding to /dev/.static
1201 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1202 # principle is the same and we need to find the link to it as well.
1203 # Note that $current_lvolume may well be an
[747]1204 # ordinary device. It is just to make sure that we feed the right value
1205 # into any of the LVM tools if possible.
1206
1207 current_lvolume="$current_partition"
[763]1208 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
[755]1209 # .static dir are a Debian specificity
[763]1210 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
[755]1211 echo $current_lvolume | grep -q ' '
[784]1212 if [ $? -eq 0 ]; then
[2341]1213 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
[755]1214 fi
[2072]1215 # if it's not found, it may well be a real device such as a multipath one
1216 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1217 if [ _"$current_lvolume" = _"" ]; then
1218 current_lvolume="$current_partition"
1219 fi
[747]1220 fi
1221 #
1222 # End of LVM device style variation code (other than $current_lvolume).
1223
[745]1224 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1225 # Size computed via LVM not directly
[747]1226 partition_size="lvm"
1227 else
1228 partition_size=`SizeOfPartition $current_partition`
1229 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1230 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1231 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1232 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1233 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1234 [ "$partition_format" != "swap" ] && partition_format="swap"
1235 if [ "$partition_size" = "" ] ; then
1236 totalsize=0
1237 items=0
1238 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1239 totalsize=$(($totalsize+$i))
1240 items=$(($items+1))
1241 done
1242 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1243 [ "$partition_size" -lt "125000" ] && partition_size=125000
[2341]1244 LogFile "I'm guessing $c_p is $(($partition_size/1024))MB"
[747]1245 fi
1246 fi
1247 fi
1248 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1249 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1250 if [ "$partition_mountpt" = "" ] ; then
1251 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1252 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1253 partition_mountpt="raid"
1254 partition_format="raid"
1255 else
1256 partition_mountpt="lvm"
1257 partition_format="lvm"
1258 fi
1259 fi
1260 fi
1261 psz=$partition_size
[2341]1262 LogFile "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
[747]1263 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1264 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1265 partition_mountpt="image"
1266 old_partition_fmt=$partition_format
1267 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1268 partition_size=$(($partition_size+1)); # just in case
1269 if [ "$partition_format" = "Linux" ] ; then
[2341]1270 LogFile "Are you imaging a mounted swap partition? Silly..."
1271 LogFile "Reverting format from $old_partition_fmt to $partition_format"
[747]1272 partition_format=$old_partition_fmt
1273 fi
1274 fi
1275 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
[2341]1276 LogFile "Excluding $current_partition from mountlist"
[747]1277 continue
1278 fi
1279 if [ ! "$partition_mountpt" ] ; then
[2341]1280 LogFile "------- $FDISK -l $qq log ------------"
[1883]1281 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
[747]1282 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1283 [ "$partition_format" ] && break
1284 done
[2341]1285 LogFile "------- $FDISK log end ------------"
[747]1286 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1287 partition_format="compaq"
1288 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
[2341]1289 LogAll "Unable to find mountpoint of $current_partition - ignoring"
[747]1290 continue
1291 fi
1292 fi
[1755]1293 if [ "$redhat_label" ]; then
1294 label="$redhat_label"
[1756]1295 elif [ "$uuid" ]; then
[1755]1296 label="$uuid"
1297 fi
[747]1298 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
[963]1299 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
[1755]1300 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
[747]1301 if [ "$current_partition" = "" ] ; then
[2341]1302 LogFile "Unknown partition (outstring = $unofficial_outstring)"
[747]1303 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1304 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1305 partition_mountpt=raid
1306 partition_format=raid
[1755]1307 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1308 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1309 else
[2341]1310 LogFile "Unknown mountpoint (outstring = $unofficial_outstring)"
[747]1311 fi
1312 elif [ "$partition_format" = "" ] ; then
[2341]1313 LogFile "Unknown format (outstring = $unofficial_outstring)"
[747]1314 elif [ "$partition_size" = "" ] ; then
[2341]1315 LogFile "Unknown partition size (outstring = $unofficial_outstring)"
[747]1316 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1317 continue
1318 else
1319 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
[2341]1320 LogFile "Stupid bastard..."
[747]1321 partition_format="vfat"
1322 fi
[1755]1323 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1324 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1325 fi
1326 done
1327}
1328
1329
1330MakeSureNumberIsInteger() {
1331 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1332 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1333 echo "result = '$res'"
1334 Die "$1 should be an integer"
1335 fi
1336}
1337
1338
1339OfferToMakeBootableISO() {
1340 local i old_pwd
[1684]1341 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[966]1342 echo -en "Shall I make a bootable CD image? (y/[n]) "
[747]1343 read i
1344 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1345 fi
[940]1346 rm -Rf $MINDI_TMP/iso
[1983]1347 mkdir -p $MINDI_TMP/iso/{images,archives}
[2341]1348 cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogAll "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1349 LogFile "mindi_lib = $MINDI_LIB"
[747]1350 for i in memdisk memtest.bin memtest.img ; do
[953]1351 j=$MINDI_LIB/$i
[1983]1352 k=$MINDI_TMP/iso
[953]1353 if [ -e "$j" ] ; then
[2341]1354 LogAll "Copying $j to $k"
[2092]1355 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1356 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1885]1357 if [ _"$MONDO_SHARE" != _"" ]; then
1358 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1359 fi
[953]1360 fi
[747]1361 done
[1983]1362 MakeMessageFile > $MINDI_TMP/iso/message.txt
1363 cp $kernelpath $MINDI_TMP/iso/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/iso/vmlinuz). Did you run out of disk space?"
1364 cp $MINDI_TMP/initrd.img $MINDI_TMP/iso/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MINDI_TMP/iso/initrd.img. Did you run out of disk space?"
[1885]1365 if [ _"$MONDO_SHARE" != _"" ]; then
[1929]1366 cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
[1983]1367 cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
[1885]1368 fi
[2073]1369 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
[747]1370 if [ "$ARCH" != "ia64" ] ; then
[2092]1371 cp $ISOLINUX $MINDI_TMP/iso/isolinux.bin 2>> $LOGFILE || Die "Cannot copy isolinux.bin ($ISOLINUX) to $MINDI_TMP/iso - did you run out of disk space?"
[747]1372 fi
[1983]1373 old_pwd=`pwd`
[940]1374 cd $MINDI_TMP/iso
[747]1375 if [ "$ARCH" != "ia64" ] ; then
[1885]1376 if [ _"$MONDO_SHARE" != _"" ]; then
[2092]1377 cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
[1983]1378 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
[1885]1379 fi
[1983]1380 $ISO_CMD -U $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b isolinux.bin -c boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table . > /dev/null 2> $MINDI_TMP/mkisofs.log
[747]1381 else
[1983]1382 $ISO_CMD $ISO_OPT -V Mindi_Image -o $MINDI_CACHE/mindi.iso -b images/mindi-bootroot.$BOOT_SIZE.img -c images/boot.cat -no-emul-boot . > /dev/null 2> $MINDI_TMP/mkisofs.log
[1950]1383 rm -f images/mindi-bootroot.$BOOT_SIZE.img
[747]1384 fi
1385 if [ "$?" -ne "0" ] ; then
[2341]1386 LogFile "----------- $ISO_CMD's errors --------------"
[940]1387 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
[1885]1388 echo "$ISO_CMD returned the following errors:-"
[940]1389 cat $MINDI_TMP/mkisofs.log
[2341]1390 LogAll "Failed to create ISO image."
[747]1391 else
[2341]1392 LogAll "Created bootable ISO image at $MINDI_CACHE/mindi.iso"
[747]1393 fi
[940]1394 rm -f $MINDI_TMP/mkisofs.log
[747]1395 cd $old_pwd
1396}
1397
1398
[1684]1399OfferToMakeBootableUSB() {
[2041]1400 local i
[1684]1401 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[1786]1402 echo -n "Shall I make a bootable USB image ? (y/[n]) "
[1764]1403 read i
1404 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1405 if [ "$USBDEVICE" = "" ]; then
1406 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1407 read dev
1408 USBDEVICE=$dev
[1722]1409 fi
[1764]1410 echo "WARNING: This will erase all content on $USBDEVICE"
1411 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
[2040]1412 read i
1413 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
[1684]1414 fi
1415 rm -Rf $MINDI_TMP/usb
1416 mkdir -p $MINDI_TMP/usb
1417 USBPART="${USBDEVICE}1"
1418
1419 echo -en "Transforming $USBDEVICE in a Bootable device "
1420 echo -en "."
[2341]1421 LogFile "Transforming $USBDEVICE in a Bootable device"
1422 LogFile "Checking $USBDEVICE"
[1857]1423 $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
[1684]1424 if [ $? -ne 0 ]; then
[2341]1425 LogAll "Unable to access $USBDEVICE"
1426 LogAll "Make sure your USB device is pluged in"
[1684]1427 exit -1
1428 fi
1429 echo -en "."
[2341]1430 LogFile "Unmounting $USBDEVICE just in case"
[1721]1431 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
[2057]1432 # If your key has no MBR it may cause an issue
1433 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
[2341]1434 LogFile "Preparing $USBDEVICE"
[1721]1435 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
[2057]1436d
1437d
1438d
1439d
[1684]1440n
1441p
14421
1443
1444
1445t
1446b
1447a
14481
1449w
1450EOF
1451 if [ $? -ne 0 ]; then
[2341]1452 LogAll "Unable to create a vfat Filesystem on $USBDEVICE"
1453 LogAll "Make sure your USB device is pluged in"
[1684]1454 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1455 MindiExit -1
1456 fi
[2341]1457 LogFile "The USB device $USBDEVICE now looks like this:"
[2190]1458 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
[1684]1459 echo -en "."
[2341]1460 LogFile "Creating a vfat filesystem on $USBPART"
[1688]1461 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
[1684]1462 if [ $? -ne 0 ]; then
[2341]1463 LogAll "Unable to create a vfat filesystem on $USBPART"
1464 LogAll "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)"
[1684]1465 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1466 MindiExit -1
1467 fi
1468 echo -en "."
[2341]1469 LogFile "Mounting $USBPART on $MINDI_TMP/usb"
[1684]1470 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1471 if [ $? -ne 0 ]; then
[2341]1472 LogAll "Unable to mount $USBPART on $MINDI_TMP/usb"
1473 LogAll "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)"
[1684]1474 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1475 MindiExit -1
1476 fi
1477 echo -en "."
[1691]1478 mkdir -p $MINDI_TMP/usb/images
[2341]1479 cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogAll "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
[1684]1480 echo -en "."
[2341]1481 LogFile "mindi_lib = $MINDI_LIB"
[1684]1482 for i in memdisk memtest.bin memtest.img ; do
1483 j=$MINDI_LIB/$i
1484 k=$MINDI_TMP/usb
1485 if [ -e "$j" ] ; then
[2341]1486 LogAll "Copying $j to $k"
[2092]1487 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1488 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1684]1489 fi
1490 done
1491 echo -en "."
[1983]1492 MakeMessageFile > $MINDI_TMP/usb/message.txt
[1684]1493 echo -en "."
[2092]1494 cp $kernelpath $MINDI_TMP/usb/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mindi tmp ($MINDI_TMP/usb/vmlinuz). Did you run out of disk space?"
[1684]1495 echo -en "."
[1983]1496 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
[1684]1497 echo -en "."
[2041]1498 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
[1684]1499 echo -en "."
[1721]1500 umount $MINDI_TMP/usb
[1684]1501 if [ "$ARCH" != "ia64" ] ; then
[2056]1502 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
[1684]1503 if [ "$?" -ne "0" ] ; then
[2341]1504 LogAll "----------- syslinux's errors --------------" |tee -a $LOGFILE
[1684]1505 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
[2341]1506 LogAll "Failed to create USB image."
[1684]1507 else
1508 echo -e "$DONE"
[2341]1509 LogFile "Created bootable USB image on $USBDEVICE"
[1684]1510 fi
1511 rm -f $MINDI_TMP/syslinux.log
1512 else
[2341]1513 echo "No USB boot support for ia64"
[1684]1514 MindiExit -1
1515 fi
1516}
1517
1518
[747]1519MakeMessageFile() {
[2293]1520
1521 if [ -x "/bin/lsb_release" ]; then
1522 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1523 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1524 # For pb >= 0.9.8
1525 DESC=`/usr/bin/pbdistrocheck -d`
[747]1526 else
[2293]1527 iss="/dev/null"
1528 [ -r /etc/issue.net ] && iss="/etc/issue.net"
1529 [ -r /etc/issue ] && iss="/etc/issue"
1530 DESC=`head -1 $iss`
[747]1531 fi
[2293]1532 sed "s/ZZZZZ/$MINDI_VERSION/" $MINDI_LIB/msg-txt | sed "s/KKKKK/Kernel $KERVER/" | sed "s/AAAAA/on a $ARCH architecture/" | sed "s/TTTTT/`LC_TIME=C date`/" | sed "s/MMMMM/`hostname`/" | sed "s/DDDDD/$DESC/"
[1885]1533 if [ _"$MONDO_SHARE" != _"" ]; then
1534 if [ "$CDRECOVERY" != "yes" ] ; then
[2382]1535 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1885]1536 echo -en "Press <enter> to continue.\n"
1537 elif [ ! "$MINDI_TMP" ] ; then
1538 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
[1983]1539 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1540 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1541 fi
[1885]1542 else
1543 echo -en "$BOOT_MEDIA_MESSAGE"
[747]1544 fi
[1983]1545 else
1546 echo -en "\
[747]1547To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1548CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
[1983]1549 fi
[747]1550 fi
1551 echo -en "\n\n\n"
1552}
1553
1554
[1983]1555MakeBootConfFile() {
[1885]1556 local options i ooo
[747]1557 options=""
[1983]1558 # Type of boot file (elilo or syslinux/isolinux)
1559 type=$1
1560 if [ "$type" = "elilo" ]; then
1561 sep="="
1562 else
1563 sep=" "
1564 fi
[925]1565
[1983]1566 # Generic header for conf file
1567 if [ "$type" != "elilo" ] ; then
1568 echo -en "prompt 1\ndisplay message.txt\n"
1569 else
1570 echo -en "prompt\n"
[925]1571 fi
[1983]1572
1573 # Compute which default option to boot from
[747]1574 if [ "$CDRECOVERY" = "yes" ] ; then
[1983]1575 echo -en "default${sep}RESTORE\n"
1576 # In case it's mondoarchive
[1885]1577 elif [ _"$MONDO_SHARE" != _"" ]; then
[2382]1578 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1983]1579 echo -en "default${sep}iso\n"
[747]1580 else
[1983]1581 echo -en "default${sep}interactive\n"
[747]1582 fi
1583 else
[1983]1584 echo -en "default${sep}expert\n"
[747]1585 fi
1586
[1983]1587 # Handle timeout
[747]1588 if [ "$CDRECOVERY" != "yes" ] ; then
[1983]1589 echo -en "timeout${sep}300\n"
1590 else
1591 echo -en "timeout${sep}10000\n"
[747]1592 fi
1593 echo -en "\n"
[1983]1594
[2124]1595 # prepare which labels will be generated
[747]1596 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1597 options="RESTORE expert"
[1885]1598 else
1599 if [ _"$MONDO_SHARE" != _"" ]; then
[2345]1600 options="interactive expert compare iso nuke isonuke"
[747]1601 else
1602 options="expert"
[925]1603 fi
[747]1604 fi
[1983]1605
1606 # Generate rest of conf file
[747]1607 for i in $options ; do
[925]1608 ooo=$i
1609 [ "$ooo" = "RESTORE" ] && ooo="nuke"
[1983]1610 if [ "$type" = "elilo" ]; then
[2126]1611 outstr="image=/vmlinuz\n\tlabel=$i\n\tinitrd=/initrd.img\n\troot=/dev/ram0 append=\" rw ramdisk_size=$ramdisk_size $ooo $ADDITIONAL_BOOT_PARAMS \"\n"
[925]1612 else
[2073]1613 ps="/"
1614 if [ "$type" = "syslinux" ]; then
1615 ps=""
1616 fi
[2126]1617 outstr="label $i\n\tkernel ${ps}vmlinuz\n\tappend initrd=${ps}initrd.img root=/dev/ram0 rw ramdisk_size=$ramdisk_size ${ooo} $ADDITIONAL_BOOT_PARAMS\n"
[925]1618 fi
[1885]1619 echo -en "$outstr"
[747]1620 done
[1983]1621
1622 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1623 if [ "$type" = "elilo" ]; then
1624 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
[2073]1625 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
[1983]1626 else
[2073]1627 ps="/"
1628 if [ "$type" = "syslinux" ]; then
1629 ps=""
1630 fi
1631 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1632 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
[1983]1633 fi
1634 fi
[747]1635}
1636
1637
1638PrepareBootDiskImage_LILO() {
[1983]1639 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1640 imagesdir=$MINDI_CACHE
1641 kernelpath=$1
[747]1642
1643 retval=0
1644 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
[1885]1645 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1646 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
[747]1647 echo -en "..."
[1885]1648 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
[940]1649 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1650 mkdir -p $mountpoint
[1885]1651 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[1983]1652 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
[2341]1653 mount -t vfat -o loop $imagefile $mountpoint || LogAll "Cannot mount (PBDI)"
[964]1654 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]1655 mkdir -p $mountpoint/etc
[1983]1656 liloconf=$mountpoint/elilo.conf
[747]1657
[1983]1658 MakeBootConfFile elilo > $liloconf
[747]1659
[1230]1660 # Copy it so that CD-ROM menu entry is satisfied
[1983]1661 mountefi=0
1662 df -T | grep /boot/efi | grep -q vfat
1663 if [ $? -ne 0 ]; then
1664 mount /boot/efi
[1230]1665 if [ $? -ne 0 ]; then
[1983]1666 echo "You have to mount your EFI partition when using mindi"
1667 MindiExit -1
[1230]1668 fi
[1983]1669 mountefi=1
[1230]1670 fi
[1983]1671 el=`find /boot/efi -name elilo.efi`
1672 cp $el $mountpoint
1673 cp $liloconf $mountpoint
1674 if [ $mountefi -eq 1 ]; then
1675 umount /boot/efi 2>&1 > /dev/null
1676 fi
[1230]1677
[2341]1678 LogFile "Copying $MINDI_TMP/initrd.img to $mountpoint..."
[1983]1679 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
[747]1680 if [ "$?" -ne "0" ] ; then
[2341]1681 LogAll "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1682 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2341]1683 LogAll "Please unload some of your modules and try again."
[940]1684 rm -f $MINDI_TMP/mtpt.$$
[2341]1685 LogAll "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1686 retval=$(($retval+1))
1687 fi
[1983]1688 MakeMessageFile > $mountpoint/message.txt
[747]1689
1690 mkdir -p $mountpoint/tmp
[1983]1691 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1692 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
[747]1693 fi
1694
[925]1695 # copy the kernel across
[1230]1696 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1697 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1698 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2092]1699 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
[1885]1700 if [ "$?" -ne "0" ] ; then
[2341]1701 LogFile "Files at mountpoint ($mountpoint) :-"
[925]1702 du -sk $mountpoint/* >> $LOGFILE
[2341]1703 LogFile "--- end of list of files ---"
[925]1704 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
[1885]1705Sorry, your kernel is too big for your image.\n" >> $LOGFILE
[1998]1706 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[925]1707 cd $old_pwd
[747]1708 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[2341]1709 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
[925]1710 # losetup /dev/loop0 -d
[1998]1711 [ "$imagefile" != "" ] && rm -f $imagefile
[1885]1712 return 0
[747]1713 fi
[1796]1714 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[747]1715 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[2341]1716 LogFile "Free space left on image = $free_space KB"
1717 LogFile "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
[1794]1718 # make it bootable
[1998]1719 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[963]1720 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[1983]1721 if [ "$KERN_DISK_MADE" ] ; then
[2341]1722 LogFile "Not running LILO. It's not that kind of disk."
[747]1723 fi
[925]1724
[1983]1725 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
[747]1726 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1727 echo -en "..."
[2341]1728 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
[747]1729 if [ "$retval" -eq "0" ] ; then
[1885]1730 echo -en "...$DONE\n"
[747]1731 if [ "$KERN_DISK_MADE" ] ; then
[2341]1732 LogAll "$BOOT_SIZE KB boot disks were created OK\n"
[747]1733 fi
1734 else
[1885]1735 echo -en "...failed\n"
[2341]1736 LogAll $BOOT_SIZE"KB boot disk was NOT created\n"
[1998]1737 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1738 fi
[2341]1739 [ "$retval" -ne "0" ] && LogAll "PrepareBootDiskImage() is returning nonzero"
[747]1740 return $retval
1741}
1742
1743
[2073]1744PrepareBootDiskImage_ISOLINUX() {
[1983]1745 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1746 imagesdir=$MINDI_CACHE
1747 kernelpath=$1
[747]1748 do_boot_root_thingy=""
1749 local retval old_pwd
1750 retval=0
[925]1751
[747]1752 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
[1885]1753 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1754 TurnTgzIntoRdz $MINDI_LIB/rootfs $MINDI_TMP/initrd.img `du -sk $kernelpath | cut -f1` || Die "Could not turn rootfs into initrd.img; are you SURE your kernel supports loopfs?"
[747]1755 echo -en "..."
[2067]1756 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
[940]1757 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1758 mkdir -p $mountpoint
[1885]1759 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[2341]1760 LogFile "Creating vfat filesystem on $imagefile"
[1885]1761 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
[2067]1762 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
[1885]1763 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1764
[2067]1765 # Only move it now to its final destination abd use it now
1766 mv $imagefile $imagesdir
1767 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1768
[2341]1769 mount -t vfat -o loop $imagefile $mountpoint || LogAll "Cannot mount (PBDI)"
[925]1770
1771 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[1983]1772 MakeMessageFile > $mountpoint/message.txt
[2073]1773 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
[2341]1774 LogFile "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
[1983]1775 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
[747]1776 if [ "$?" -ne "0" ] ; then
[2341]1777 LogAll "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1778 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2341]1779 LogAll "Please unload some of your modules and try again."
[940]1780 rm -f $MINDI_TMP/mtpt.$$
[2341]1781 LogAll "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1782 retval=$(($retval+1))
1783 fi
1784
1785 mkdir -p $mountpoint/tmp
[1983]1786 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1787 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1788 fi
[747]1789
[925]1790 # copy the kernel across
[1230]1791 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1792 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1793 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[747]1794 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
[1885]1795 if [ "$?" -ne "0" ] ; then
[2341]1796 LogFile "Files at mountpoint ($mountpoint) :-"
[747]1797 du -sk $mountpoint/* >> $LOGFILE
[2341]1798 LogFile "--- end of list of files ---"
[747]1799 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
[1885]1800Sorry, your kernel is too big for your image.\n" >> $LOGFILE
[1998]1801 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[747]1802 cd $old_pwd
1803 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[2341]1804 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
[747]1805
[1998]1806 [ "$imagefile" != "" ] && rm -f $imagefile
[1885]1807 return 0
[747]1808 fi
[1796]1809 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[747]1810 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[2341]1811 LogFile "Free space left on image = $free_space KB"
1812 LogFile "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
[925]1813
1814 # make it bootable
[1998]1815 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[747]1816 mkdir -p $mountpoint/etc
[963]1817 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]1818 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1819 echo -en "..."
[2341]1820 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
[747]1821
1822 if [ "$retval" -eq "0" ] ; then
[1885]1823 echo -en "...$DONE\n"
[747]1824 if [ "$KERN_DISK_MADE" ] ; then
[1998]1825 [ "$imagefile" != "" ] && rm -f $imagefile
[2341]1826 LogAll "$BOOT_SIZE KB boot disks were created OK\n"
[747]1827 fi
1828 else
[1885]1829 echo -en "...failed\n"
[2341]1830 LogAll $BOOT_SIZE"KB boot disk was NOT created\n"
[1998]1831 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1832 fi
[2341]1833 [ "$retval" -ne "0" ] && LogAll "PrepareBootDiskImage() is returning nonzero"
[747]1834 return $retval
1835}
1836
1837
[2006]1838ParseModprobeForIncludes() {
1839local MODPROBE_CONF mpincfile includes include
1840
1841MODPROBE_CONF=/etc/modprobe.conf
1842mpincfile=$1
1843touch $mpincfile
1844if [ -a $MODPROBE_CONF ]; then
[2058]1845 includes=$(awk '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
[2006]1846 if [ -n "$includes" ]; then
1847 for include in $includes
1848 do
1849 if [ -a "$include" ]; then
1850 echo $include >> $mpincfile
1851 fi
1852 done
1853 fi
1854fi
1855}
1856
1857
[747]1858PrepareDataDiskImages() {
[2006]1859 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
[747]1860
[1983]1861 imagesdir=$MINDI_CACHE
[1902]1862 rm -f $imagesdir/mindi.iso
[940]1863 needlist=$MINDI_TMP/what-we-need.txt
1864 bigdir=$MINDI_TMP/bigdir
[747]1865 mkdir -p $bigdir/usr/bin
[1983]1866 mkdir -p $bigdir/usr/sbin
[2006]1867 includefile=$MINDI_TMP/$$.includefile.txt
[747]1868
[1885]1869 lfiles="$DEPLIST_FILE"
1870 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
[2006]1871 ParseModprobeForIncludes $includefile
[2019]1872 lines=$(($lines+`cat $includefile | wc -l`))
[2006]1873 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
[747]1874 res=$?
[2006]1875 rm -f $includefile
[747]1876 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]1877 pwd=`pwd`
[940]1878 cd $MINDI_TMP
[747]1879 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[2166]1880 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
[747]1881 done
[925]1882 for i in $EXTRA_MODS ; do
[1810]1883 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
[2341]1884 [ ! "$j" ] && LogFile "WARNING - cannot find failsafe module $i.o.gz"
[925]1885 for k in $j ; do
[2341]1886 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogAll "ERROR on module $k" $MINDI_TMP/$$.log
1887 LogFile "Added failsafe module $k to ramdisk"
[925]1888 done
1889 done
1890 cd $pwd
[747]1891 else
[925]1892 ListKernelModulePaths >> $needlist
[747]1893 fi
1894 if [ "$res" -ne "0" ] ; then
[1902]1895 Die "You have $res files present in dependency list\nbut absent from filesystem."
[747]1896 fi
1897 FindAndAddUserKeyboardMappingFile
1898 mkdir -p $bigdir/tmp
[1885]1899 if [ _"$MONDO_SHARE" != _"" ]; then
[940]1900 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1901 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]1902 fi
1903 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1904 DropOptimizedLibraries $needlist $bigdir
1905 echo -en "Assembling dependency files"
1906 CopyDependenciesToDirectory < $needlist $bigdir
1907
[925]1908 # also copy io.sys and msdos.sys, if we can find them
[747]1909 for i in `mount | cut -d' ' -f3` ; do
[925]1910 for j in io.sys msdos.sys ; do
[963]1911 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
[925]1912 done
[747]1913 done
1914
[925]1915 # master boot record, too
[940]1916 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]1917 if [ "$i" ] ; then
[2341]1918 LogAll "Backing up $i's MBR"
[925]1919 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1920 sleep 1
1921 sync
1922 j=$i
1923 [ -h "$j" ] && j=`readlink -f $j`
[2341]1924 LogAll "Creating /dev/boot_device ($j)"
[925]1925 mkdir -p $bigdir/dev
[2089]1926 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
[747]1927 fi
1928
1929 old_pwd=`pwd`
1930 cd $bigdir
1931
[1983]1932 # Get terminfo content
1933 ti="usr/share/terminfo/l"
1934 if [ -d /$ti ]; then
1935 mkdir -p $ti
[2341]1936 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "WARNING - error occurred while copying terminfo"
[747]1937 fi
[1764]1938 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
[747]1939 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
[1335]1940 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
[747]1941 fi
[2291]1942 if [ -d "/lib/dev-state" ]; then
[2341]1943 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
[2291]1944 fi
[747]1945 cd $old_pwd
1946 echo -e "$DONE"
1947 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
[940]1948 MakeMountlist $MINDI_TMP/mountlist.txt
[1902]1949 mkdir -p $bigdir/tmp
[2092]1950 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
[1885]1951 if [ _"$MONDO_SHARE" != _"" ]; then
[1902]1952 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
[1885]1953 fi
[2032]1954 if [ $LVM != "false" ]; then
1955 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1956 if [ "$?" -ne "0" ]; then
1957 LVM="false"
1958 rm -f $bigdir/tmp/i-want-my-lvm
1959 fi
1960 fi
[1902]1961 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
[2092]1962 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1963 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
[1902]1964 if [ _"$MONDO_SHARE" != _"" ]; then
1965 for q in filelist.full.gz biggielist.txt ; do
1966 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1967 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1968 done
1969 fi
1970
1971 echo -en "Tarring and zipping the data content..."
1972 size_of_all_tools=`du -sk $bigdir | cut -f1`
[2341]1973 (cd $bigdir ; tar -b 4096 -cf - . 2>> $MINDI_TMP/$$.log | gzip -9 > $imagesdir/all.tar.gz || LogAll "Problem creating all.tar.gz" $MINDI_TMP/$$.log)
[1902]1974 du -sk $imagesdir/*gz >> $LOGFILE
1975 echo -e "$DONE"
1976
[747]1977 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[1902]1978 rm -rf $bigdir
[747]1979 rm -f $needlist
1980}
1981
1982
1983ProcessLDD() {
[1784]1984 local incoming f d nd bd bnd
[747]1985 read incoming
[1784]1986 while [ "$incoming" != "" ]; do
[859]1987 # We take the full path name of the dyn. lib. we want
[1526]1988 incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1989 for f in $incoming ; do
[1784]1990 # echo modified file name if one of the parent dir is a link
1991 # by replacing the original dirname by the destination of the link
1992 d="`dirname $f`"
1993 found="false"
1994 while [ "$d" != "/" ]; do
1995 if [ -h "$d" ]; then
1996 nd=`readlink -f $d`
1997 bd=`basename $d`
1998 bnd=`basename $nd`
1999 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2000 echo $d
2001 fi
2002 d="`dirname $d`"
2003 done
2004
[1721]2005 echo "$f"
2006 echo "`ReadAllLink $f`"
[747]2007 done
2008 read incoming
2009 done
2010}
2011
2012
2013Prompt() {
2014 echo -en "$1"
2015 read line
2016}
2017
2018
2019ReadLine() {
2020 local i incoming
2021 read incoming
2022 i=0
2023 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2024 i=$(($i+1))
2025 read incoming
[747]2026 done
2027 echo "$incoming"
2028}
2029
2030
2031SizeOfPartition() {
2032 local devpath drive res stub
2033 device=$1
2034 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2035 res=`SizeOfRaidPartition $device`
2036 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2037 echo "$res"
2038 return 0
[747]2039 fi
[925]2040 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[960]2041 res=`$FDISK -s $device 2>> $LOGFILE`
[925]2042 # end patch
[1796]2043 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
[747]2044 [ "$res" = "" ] && res="-1"
2045 echo $res
2046 return 0
2047}
2048
2049
2050SizeOfRaidPartition() {
2051 local real_dev smallest_size silly tmp
2052
2053 silly=999999999
2054 smallest_size=$silly
2055
2056 for real_dev in `GetRaidDevMembers $1` ; do
[925]2057 tmp=`SizeOfPartition $real_dev`
2058 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2059 done
2060
2061 if [ "$smallest_size" = "$silly" ] ; then
[925]2062 echo "-1"
2063 return 1
[747]2064 else
[925]2065 echo "$smallest_size"
2066 return 0
[747]2067 fi
2068}
2069
2070
2071StripComments()
2072{
2073 local tempfile
[925]2074
[940]2075 tempfile=$MINDI_TMP/$$.strip.txt
[963]2076 cp -f $1 $tempfile 2>> $LOGFILE
[747]2077 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2078 rm -f $tempfile
[2341]2079 LogFile "Stripped comments from $2"
[747]2080}
2081
2082
[925]2083
[747]2084StripExecutable()
2085{
2086 local tmpfile
[925]2087
[940]2088 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2089 [ -d "$1" ] || [ -h "$1" ] && return
[963]2090 cp -f $1 $tmpfile 2>> $LOGFILE
[747]2091 strip $tmpfile 2> /dev/null
2092 if [ "$?" -eq "0" ] ; then
[963]2093 cp -f $tmpfile $1 2>> $LOGFILE
[2341]2094 LogFile "Stripped binary $2"
[747]2095 fi
2096 rm -f $tmpfile
2097}
2098
[2293]2099KernelVer() {
2100 local fkern_ver fname
[747]2101
[2293]2102 fname=$1
2103 file $fname | grep -q gzip
2104 if [ "$?" -eq "0" ] ; then
2105 # Used by ia64
2106 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2107 else
2108 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2109 fi
2110 echo "$fkern_ver"
2111}
2112
2113
[747]2114TryToFindKernelPath() {
2115 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
[925]2116
[2293]2117 we_want_version=$KERVERRUN
[747]2118 possible_kernels=""
2119 duff_kernels=""
2120
2121 if [ "$ARCH" = "ia64" ] ; then
2122 root="/boot/efi/efi"
2123 else
2124 root="/"
2125 fi
[1466]2126 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
[925]2127 [ ! -e "$fname" ] && continue
[747]2128 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[2293]2129 fkern_ver=`KernelVer $fname`
[747]2130 [ "$fkern_ver" = "" ] && continue
2131 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2132 [ -f "$fname" ] || continue
2133 [ -h "$fname" ] && continue
2134 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2135 file $fname | grep -q gzip
2136 if [ "$?" -eq "0" ] ; then
2137 # Used by ia64
2138 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2341]2139 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2140 duff_kernels="$fname $duff_kernels"
2141 else
[747]2142 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2143 possible_kernels="$fname $possible_kernels"
[925]2144 fi
[747]2145 else
[925]2146 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2341]2147 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2148 duff_kernels="$fname $duff_kernels"
2149 else
[747]2150 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2151 possible_kernels="$fname $possible_kernels"
[925]2152 fi
[747]2153 fi
2154 done
2155 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2156 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2157 fi
2158 if [ ! "$possible_kernels" ] ; then
[2341]2159 LogAll "No kernel matches exactly. Are there any duff kernels?"
[747]2160 possible_kernels="$duff_kernels"
2161 if [ ! "$possible_kernels" ] ; then
[2341]2162 LogAll "Sorry, no duff kernels either"
[747]2163 else
[2341]2164 LogAll "I bet you're running Debian or Gentoo, aren't you?"
2165 LogAll "Your kernel doesn't have a sane builddate. Oh well..."
[747]2166 fi
2167 fi
2168 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2169 noof_kernels=`CountItemsIn "$possible_kernels"`
2170 if [ "$noof_kernels" -eq "0" ] ; then
[2341]2171 LogAll "Could not find your kernel."
[925]2172 if [ -e "/boot/vmlinuz" ] ; then
[2341]2173 LogAll "Using /boot/vmlinuz as a last resort."
[925]2174 output=/boot/vmlinuz
[747]2175 else
[925]2176 output=""
2177 fi
[747]2178 elif [ "$noof_kernels" -eq "1" ] ; then
2179 kernelpath=`echo "$possible_kernels" | sed s/' '//`
[2341]2180 LogFile "Your kernel is $kernelpath (v$KERVERRUN)"
[747]2181 output="$kernelpath"
2182 else
2183 for i in $possible_kernels ; do
[2293]2184 if echo $i | grep "$KERVERRUN" ; then
[2341]2185 LogAll "OK, I used my initiative and found that "
2186 LogAll "$i is probably your kernel. "
[925]2187 output="$i"
2188 return
2189 fi
[747]2190 done
[925]2191 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2192 output=/boot/vmlinuz
[2341]2193 LogFile "Schlomo, this one's for you."
[925]2194 else
[2341]2195 LogAll "Two or more possible kernels found. You may specify any one of them and the "
2196 LogAll "boot disks will still work, probably. If one does not work, try another."
2197 LogAll "$possible_kernels"
[747]2198 echo ""
[925]2199 fi
[747]2200 fi
2201 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2202}
2203
2204
2205TurnTgzIntoRdz() {
[1983]2206 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
[925]2207
[747]2208 tgz_dir_fname=$1
2209 rdz_fname=$2
[1983]2210 kernelsize=$3
[1885]2211 maxsize=$(($BOOT_SIZE-$kernelsize))
[747]2212 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2213 tempfile=$MINDI_TMP/temp.rd
2214 mountpoint=$MINDI_TMP/mnt1
[747]2215 res=0
2216 echo -en "..."
2217 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2218 echo -en "..."
[2341]2219 LogFile "Creating ext2 filesystem on $tempfile"
[1764]2220 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
[747]2221 echo -en "..."
2222 mkdir -p $mountpoint
2223 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."
2224 echo -en "..."
2225 old_pwd=`pwd`
2226 cd $mountpoint
[2034]2227
2228 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
[2042]2229 if [ -h "/lib64" ]; then
[2341]2230 mkdir -p lib || LogAll "Unable to create lib in $mountpoint."
2231 ln -s lib lib64 || LogAll "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
[2042]2232 fi
[2034]2233
[959]2234 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
[747]2235 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
[1914]2236
[747]2237 cd dev || Die "Can't cd to dev"
2238 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2239 rm -f dev-entries.tgz
2240 cd ..
2241
2242 for w in insmod.static insmod.static.old ; do
[925]2243 s=`which $w 2> /dev/null`
2244 if [ -e "$s" ] ; then
[2156]2245 tar cf - -C / $s 2> /dev/null | tar xf -
[925]2246 fi
[747]2247 done
2248
2249 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
[1724]2250
[1882]2251 # Handle the case where busybox and mount are dynamically linked
[1786]2252 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2253 if [ $? -eq 0 ]; then
[1927]2254 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2255 rm -f bin/mount $MINDI_TMP/busy.lis
2256 mountlis=`grep mount $DEPLIST_FILE`
2257 for f in $MINDI_LIB/rootfs/bin/busybox $mountlis ; do
2258 if [ -f $f ]; then
2259 LocateDeps $f >> $MINDI_TMP/busy.lis
2260 fi
2261 done
[2341]2262 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in mount analysis" $MINDI_TMP/$$.log
[1786]2263 rm -f $MINDI_TMP/busy.lis
2264 fi
2265
[2039]2266 # Copy of files mandatory for ld.so
[2042]2267 cp -rp /etc/ld.so.c* $mountpoint/etc
[2039]2268
[2164]2269 # Avoid an issue on some distro (RHEL5)
2270 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2271
[1914]2272 mkdir -p $mountpoint/tmp
[1724]2273 # Management of udev (which includes modprobe in rules)
[1759]2274 ps auxww | grep -v grep | grep -qw udevd
[1716]2275 if [ $? -eq 0 ]; then
[1914]2276 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
[2341]2277 LogAll "udev device manager found"
2278 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
[1790]2279 # This avoids NIC remapping if on another machine at restore time on Debian at least
[2145]2280 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2281 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2282 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
[2341]2283 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
[1720]2284 if [ -x /sbin/udevd ]; then
[1781]2285 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2286 lis=""
2287 # Get only the files which exist in that list
[1815]2288 # and potentially their symlink structure
[1781]2289 for i in $lis2; do
[1815]2290 if [ -h $i ]; then
2291 j=$i
2292 while [ -h $j ]; do
2293 lis="$lis $j"
2294 j=`readlink $j`
2295 done
2296 lis="$lis $j"
2297 elif [ -f $i ]; then
[1781]2298 lis="$lis $i"
2299 fi
2300 done
2301 # And their deps
[1759]2302 LocateDeps $lis > $MINDI_TMP/udev.lis
2303 for i in $lis; do
2304 if [ "`echo $i | cut -c1`" = "/" ]; then
2305 j=`echo $i | cut -c2-`
[1998]2306 [ "$j" != "" ] && rm -f $j
[1759]2307 fi
2308 done
[2341]2309 tar cf - -C / $lis `sort -u $MINDI_TMP/udev.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in udev.lis analysis" $MINDI_TMP/$$.log
[1721]2310 rm -f $MINDI_TMP/udev.lis
[1720]2311 else
[2341]2312 LogAll "udevd daemon not in standard place (/sbin)"
2313 LogAll "mindi will use static devices which may cause problems"
[1914]2314 rm -f $mountpoint/tmp/USE-UDEV
[1720]2315 fi
[1716]2316 fi
[1786]2317
[1761]2318 # Management of potential HW info (Proliant only at the moment)
[1880]2319 rm -rf $MINDI_CACHE/bkphw
2320 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2321 if [ -d $MINDI_CACHE/bkphw ]; then
[2341]2322 LogAll "Hardware Information found and saved ..."
[1880]2323 cp -rp $MINDI_CACHE/bkphw .
2324 if [ -f $MINDI_CACHE/tools.files ]; then
2325 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
[1863]2326 LocateDeps $lis > $MINDI_TMP/tools.lis
[2341]2327 tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in tools.lis analysis" $MINDI_TMP/$$.log
[1863]2328 fi
[1880]2329 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2330 mv -f $MINDI_CACHE/mindi-rsthw .
[1761]2331 chmod 755 ./mindi-rsthw
2332 fi
[1880]2333 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
[1761]2334 fi
2335
[2183]2336 # Management of perl scripts delivered needed at restore time
2337 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
[2341]2338 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in perl scripts analysis" $MINDI_TMP/$$.log
[2183]2339
[1885]2340 for w in cdrom groovy-stuff ; do
[747]2341 mkdir -p mnt/$w
2342 done
2343
[2341]2344 tar cf - -C / /dev/fd0*[1,2][4,7,8]* 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in fd dev analysis" $MINDI_TMP/$$.log
[1721]2345
[747]2346 cd $old_pwd
2347 echo -en "..."
2348 old_pwd=`pwd`
2349 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[940]2350 cd $MINDI_TMP
[1885]2351 needed_modules_path=lib/modules/$FAILSAFE_KVER
[747]2352 else
2353 cd /
2354 if [ "${kernelname}" != "" ]
2355 then
[1885]2356 needed_modules_path=lib/modules/${kernelname}
[747]2357 else
[2293]2358 needed_modules_path=lib/modules/$KERVERRUN
[747]2359 fi
2360 fi
[1885]2361
2362 needed_modules=""
[1993]2363 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
[1885]2364
[2382]2365 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[747]2366 # For PXE boot
2367 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2368 fi
[1715]2369 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2370 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2371 fi
[1727]2372 for i in $DENY_MODS; do
[2341]2373 LogFile "Removing $i from the list of modules to load"
[1727]2374 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2375 done
2376
[2341]2377 [ -e "$needed_modules_path" ] || LogAll "path $needed_modules_path does not exist.\n If you're not using a modular kernel then you're NUTS."
[747]2378 for i in $list_of_groovy_mods ; do
[1885]2379 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
[747]2380 done
[1914]2381
[1885]2382 for i in $needed_modules ; do
[747]2383 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2384 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[2341]2385 LogFile "Adding $i ($s KB) to the rootfs"
2386 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogAll "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
[1914]2387 # Uncompress modules if not using udev and native modprobe
[1815]2388 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2389 if [ "`echo "$i" | grep -F ".gz"`" ]; then
[2341]2390 LogFile "Uncompressing $i"
[1727]2391 gunzip -f $mountpoint/$i
[1815]2392 fi
[1727]2393 fi
[747]2394 done
[1815]2395
2396 # Also copy modules.dep in case of udev so that normal modprobe works
[2341]2397 tar cf - -C / /$needed_modules_path/modules.dep 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogAll "Unable to copy modules.dep to $mountpoint" $MINDI_TMP/$$.log
[1815]2398
[1885]2399 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
[2341]2400 LogFile "Deleting devfsd daemon from ramdisk"
2401 [ ! -e "/sbin/devfsd" ] && LogFile "...because /sbin/devfsd not found"
2402 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "...because kernel is failsafe"
[747]2403 rm -f $mountpoint/sbin/devfsd
2404 fi
2405 cd $old_pwd
2406 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2407 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2408 rm -f $mountpoint/zero
[1885]2409 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2410 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[2092]2411 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2412 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
[747]2413 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2414 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2415 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2416 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[2338]2417 [ "$USE_LZMA" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-LZMA
[747]2418 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2419 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2420 fi
2421 mkdir -p $mountpoint/proc
[1885]2422 echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
[1230]2423 # Determine what filesystem to use for initrd image
[2341]2424 LogFile "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
[1230]2425 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2426 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
[2391]2427 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
[1230]2428 # say what will be used
[2391]2429 LogFile "Creating an $gvFileSystem initrd image..."
[1230]2430 # kernel expects linuxrc in ext2 filesystem
2431 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2432 # unmount loop filesystem and create image file using the standard approach
2433 umount $mountpoint || Die "Cannot unmount $tempfile"
[1764]2434 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
[1794]2435 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
[1764]2436 ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
[1799]2437 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
[1764]2438 rm -f ${rdz_fname}.tmp
[1230]2439 # log that we are done
[2341]2440 LogFile "...done."
[2391]2441 elif [ "$gvFileSystem" = "initramfs" ]; then
[1230]2442 # say what will be used
[2341]2443 LogFile "Creating a gzip'ed cpio (AKA initramfs) initrd image..."
[1230]2444 # make sure that cpio is there
2445 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2446 # go into filesystem
2447 cd $mountpoint
2448 # kernel expects init in cpio filesystem
2449 ln -sf sbin/init init
2450 # create cpio image file and unmount loop filesystem
[1929]2451 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
[1230]2452 cd $old_pwd
2453 umount $mountpoint || Die "Cannot unmount $tempfile"
2454 # log that we are done
[2341]2455 LogFile "...done."
[2391]2456 else
[1230]2457 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
[2391]2458 fi
2459
[747]2460 if [ "$res" -eq "0" ] ; then
2461 echo -en "..."
2462 else
2463 echo -en "\rMade an rdz WITH ERRORS. \n"
2464 fi
2465 return 0
2466}
2467
2468
2469##############################################################################
[1021]2470#----------------------------------- Main -----------------------------------#
[747]2471##############################################################################
2472
[1885]2473# Now we can create what we need
2474mkdir -p $MINDI_TMP
[747]2475
[1885]2476# Purge from potential old run
2477if [ _"$MINDI_CACHE" = _"" ]; then
2478 Die "MINDI_CACHE undefined"
2479fi
2480
2481if [ "$1" = "--printvar" ] ; then
2482 shift
2483 if [ _"$1" != _"" ] ; then
2484 set | grep -Ew "^$1" | cut -d= -f2
2485 fi
[2183]2486 exit 0
[1885]2487fi
2488
[747]2489> $LOGFILE
[2341]2490LogFile "mindi v$MINDI_VERSION"
2491LogFile "$ARCH architecture detected"
2492LogFile "mindi called with the following arguments:"
2493LogFile "$@"
2494LogFile "Start date : `date`"
2495LogFile "-----------------------------"
[747]2496
2497[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2498
[1010]2499# Log some capital variables
2500[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
[2341]2501LogFile "MONDO_SHARE = $MONDO_SHARE"
2502LogFile "MINDI_LIB = $MINDI_LIB"
2503LogFile "MINDI_SBIN = $MINDI_SBIN"
[1010]2504[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
[2341]2505LogFile "MINDI_CONF = $MINDI_CONF"
[1885]2506if [ -f $MINDI_CONFIG ]; then
[2341]2507 LogFile "-----------------------------"
2508 LogFile " Mindi configuration file "
2509 LogFile "-----------------------------"
[1885]2510 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
[2341]2511 LogFile "-----------------------------"
[1885]2512fi
[1010]2513
[1885]2514
[747]2515trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]2516
2517# Sanity checks
2518which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2519which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2520which 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."
2521which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2522if which awk &> /dev/null ; then
2523 if ! which gawk &> /dev/null ; then
[2341]2524 LogAll "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"
[1010]2525 fi
2526fi
2527which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
[2222]2528[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
[1010]2529
[2293]2530[ "`echo $KERVERRUN | 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"
[1010]2531
2532# Update the PATH variable if incomplete
2533if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2534 PATH=$PATH:/sbin:/usr/sbin
2535 export PATH
[2341]2536 LogFile "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2537 LogFile "However, you may wish to ask your vendor to provide a permanent fix..."
2538 LogFile " Or you might like to call 'su -' instead of 'su', for example."
[1010]2539fi
2540
[1885]2541# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2542if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2543 source $MINDI_LIB/FindDistroFailsafe
2544 # Log kernel image
[2341]2545 LogAll "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
[1885]2546else
2547 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2548fi
[1010]2549
[1737]2550if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
[1010]2551 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2552fi
2553
[925]2554### BERLIOS
[747]2555### Fix as it's not mandatory on ia64
2556if [ "$ARCH" = "ia64" ] ; then
[1010]2557 if which elilo &> /dev/null ; then
2558 LILO_EXE=elilo
2559 else
[2024]2560 LILO_EXE=`which false 2> /dev/null`
[1010]2561 fi
[747]2562else
2563 FindIsolinuxBinary
2564fi
2565trap "Aborted" SIGTERM
2566DONE="\r\t\t\t\t\t\t\t\tDone. "
2567kernelpath=""
[1010]2568MONDO_ROOT=/var/cache/mondo
[747]2569mkdir -p $MONDO_ROOT
2570
2571if [ -d "/proc/lvm" ]; then
2572 # LVM v1
2573 LVMCMD=""
2574 LVM="v1"
2575elif [ -d "/dev/mapper" ]; then
2576 # LVM v2
2577 LVMCMD="lvm"
2578 LVM="v2"
2579else
2580 LVM="false"
2581fi
[2329]2582
2583if [ -e "/proc/cmdline" ]; then
2584 CMDLINE="/proc/cmdline"
2585elif [ -e "/tmp/cmdline" ]; then
2586 CMDLINE="/tmp/cmdline"
2587else
2588 CMDLINE="/dev/null"
2589fi
2590
[2341]2591LogFile "LVM set to $LVM"
2592LogFile "----------"
2593LogFile "mount result:"
2594LogFile "-------------"
[1230]2595mount >> $LOGFILE
[2341]2596LogFile "-------------"
[1315]2597if [ -e /etc/raidtab ]; then
[2341]2598 LogFile "-------------"
2599 LogFile "/etc/raidtab content:"
2600 LogFile "-------------"
[1315]2601 cat /etc/raidtab >> $LOGFILE
2602fi
[2341]2603LogFile "-------------"
2604LogFile "cat $CMDLINE"
2605LogFile "-------------"
[2329]2606cat $CMDLINE >> $LOGFILE
[2341]2607LogFile "-------------"
2608LogFile "cat /proc/swaps:"
2609LogFile "-------------"
[2014]2610cat /proc/swaps >> $LOGFILE
[2341]2611LogFile "-------------"
2612LogFile "cat /proc/partitions:"
2613LogFile "-------------"
[2015]2614cat /proc/partitions >> $LOGFILE
[2341]2615LogFile "-------------"
2616LogFile "cat /proc/filesystems:"
2617LogFile "-------------"
[2015]2618cat /proc/filesystems >> $LOGFILE
[2341]2619LogFile "-------------"
2620LogFile "lsmod result:"
2621LogFile "-------------"
[1021]2622lsmod >> $LOGFILE
[1399]2623MODULES="`cat /proc/modules | awk '{print $1}'`"
[1531]2624if [ -x /usr/sbin/esxcfg-module ]; then
[2341]2625 LogFile "-------------"
2626 LogFile "VMWare ESX server detected - Enabling dedicated support"
2627 LogFile "-------------"
2628 LogFile "VMWare modules"
2629 LogFile "-------------"
[1531]2630 /usr/sbin/esxcfg-module -l >> $LOGFILE
[1764]2631 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | awk '{print $1}'`"
[1497]2632fi
[2341]2633LogFile "FORCE_MODS:"
2634LogFile "-------------"
2635LogFile $FORCE_MODS
2636LogFile "-------------"
2637LogFile "DENY_MODS:"
2638LogFile "-------------"
2639LogFile $DENY_MODS
2640LogFile "-------------"
2641LogFile "df result:"
2642LogFile "----------"
[1796]2643df -T >> $LOGFILE
[2341]2644LogFile "-------------"
2645LogFile "Liste of extra modules is:"
2646LogFile "$EXTRA_MODS"
2647LogFile "-------------"
[747]2648
[1723]2649# Compute libata version
[1797]2650laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
[1723]2651# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]2652if [ "`echo $MODULES | grep libata`" ]; then
[1727]2653 if [ "$laver" = "2" ]; then
[1726]2654 DENY_MODS="$DENY_MODS ide-generic"
[2341]2655 LogFile "ide-generic removed from module list as your system uses libata v2+"
2656 LogFile "-------------"
[1726]2657 fi
[1723]2658fi
2659
[747]2660FLOPPY_WAS_MOUNTED=""
2661for mtpt in /media/floppy /mnt/floppy /floppy ; do
2662 if mount | grep -w $mtpt &> /dev/null ; then
2663 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2664 umount $mtpt
2665 fi
2666done
2667
[1684]2668#
2669# If we have a USB device we need to store info
2670# and remove it from the parameters line
2671#
[747]2672if [ "$#" -ne "0" ] ; then
[1684]2673 if [ "$1" = "--usb" ] ; then
2674 shift
2675 USBDEVICE=$1
2676 if [ _"$USBDEVICE" = _"" ]; then
2677 Die "No USB device specified"
2678 fi
2679 shift
2680 fi
2681fi
2682
2683if [ "$#" -ne "0" ] ; then
[747]2684 if [ "$1" = "--findkernel" ] ; then
2685 res=`TryToFindKernelPath`
[1336]2686 # Avoids logfile content for mondo
2687 export MONDO_SHARE=""
[747]2688 if [ "$res" = "" ] ; then
[925]2689 MindiExit -1
[747]2690 else
2691 echo "$res"
[925]2692 MindiExit 0
[747]2693 fi
[1720]2694 elif [ "$1" = "--locatedeps" ] ; then
2695 [ ! "$2" ] && Die "Please specify the binary to look at"
2696 LocateDeps $2
2697 # Avoids logfile content for mondo
2698 export MONDO_SHARE=""
2699 MindiExit $?
[1815]2700 elif [ "$1" = "--readalllink" ] ; then
2701 [ ! "$2" ] && Die "Please specify the binary to look at"
2702 ReadAllLink $2
2703 # Avoids logfile content for mondo
2704 export MONDO_SHARE=""
2705 MindiExit $?
[747]2706 elif [ "$1" = "--makemountlist" ] ; then
2707 [ ! "$2" ] && Die "Please specify the output file"
2708 MakeMountlist $2
[1336]2709 # Avoids logfile content for mondo
2710 export MONDO_SHARE=""
[925]2711 MindiExit $?
2712 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2713 echo "Mindi v$MINDI_VERSION"
[1336]2714 # Avoids logfile content for mondo
2715 export MONDO_SHARE=""
[925]2716 MindiExit 0
[747]2717 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]2718 MONDO_TMP=$2
2719 # Change MINDI_TMP for the one provided by mondo
2720 # So that it can get back the built files
[2153]2721 if [ _"$MONDO_TMP" = _"" ]; then
2722 Die "MONDO_TMP is empty, aborting"
2723 fi
2724 if [ _"$MONDO_TMP" = _"/" ]; then
2725 Die "MONDO_TMP is /, aborting"
2726 fi
[2092]2727 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
[1010]2728 rmdir $MINDI_TMP
[1486]2729 export MINDI_TMP=$MONDO_TMP
[953]2730 mkdir -p $MINDI_TMP
[2238]2731
[1696]2732 # This is the scratch dir in mondo - subdir images
[1880]2733 MINDI_CACHE=$3
[2238]2734
[925]2735 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[747]2736###
2737### Sq-Modification...
2738### Attempt to locate kernel specific module path
2739### if module path is found then use it other wise use uname -r to set it...
2740###
2741 kernelname=`echo $kernelpath | cut -d'-' -f2-`
[2341]2742 LogAll "kernelname = $kernelname"
2743 LogAll "kernelpath = $kernelpath"
[747]2744 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2745 then
[2341]2746 LogAll "Module path for ${kernelpath} not found..."
2747 LogAll "using running kernel\'s modules."
[2293]2748 kernelname=$KERVERRUN
[747]2749 else
[2341]2750 LogAll "Using modules for kernel: ${kernelname}"
[747]2751 fi
2752###
2753### end of Sq-Modification
2754###
[925]2755 TAPEDEV=$5
2756 TAPESIZE=$6
2757 FILES_IN_FILELIST=$7
2758 USE_LZO=$8
2759 CDRECOVERY=$9
[747]2760 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2761 IMAGE_DEVS=""
2762 else
2763 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2764 fi
[925]2765 if [ "${11}" ] ; then
2766 LILO_OPTIONS=""
[2341]2767 # LogAll "LILO will use conservative settings, to be compatible with older BIOSes."
[925]2768 fi
2769 LAST_FILELIST_NUMBER=${12}
[747]2770 ESTIMATED_TOTAL_NOOF_SLICES=${13}
2771 EXCLUDE_DEVS="${14}"
2772 USE_COMP="${15}"
2773 USE_LILO="${16}"
[925]2774 USE_STAR="${17}"
2775 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]2776 DIFFERENTIAL="${19}"
[998]2777 USE_GZIP="${20}"
[2338]2778 USE_LZMA="${21}"
2779 NOT_BOOT="${22}"
[747]2780 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]2781 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[2338]2782 [ "$USE_LZMA" = "" ] && USE_LZMA=no
[747]2783 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[2341]2784 [ "$TAPEDEV" ] && LogAll "This is a tape-based backup. Fine."
[925]2785 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
[747]2786 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2787 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2788 then
[2341]2789 LogAll "Module path for ${kernelpath} not found..."
2790 LogAll "using running kernel\'s modules."
[2293]2791 kernelname=$KERVERRUN
[747]2792 else
[2341]2793 LogAll "Using modules for kernel: ${kernelname}"
[747]2794 fi
[1696]2795 # MONDO_ROOT is the real scratchdir
[1880]2796 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
[938]2797 if [ _"$MONDO_ROOT" != _"" ]; then
2798 mkdir -p $MONDO_ROOT
2799 else
2800 Die "MONDO_ROOT is undefined"
2801 fi
[747]2802 else
[2341]2803 LogScreen "Syntax: mindi (--custom ....)"
[925]2804 MindiExit -1
[747]2805 fi
2806fi
[2238]2807
2808if [ _"$MINDI_CACHE" != _"" ]; then
2809 rm -rf $MINDI_CACHE/* 2> /dev/null
2810 mkdir -p $MINDI_CACHE
2811fi
2812
[747]2813[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2814
[1684]2815if [ _"$MONDO_SHARE" = _"" ]; then
[2341]2816 LogAll "Mindi Linux mini-distro generator v$MINDI_VERSION"
2817 LogAll "Latest Mindi is available from http://www.mondorescue.org"
2818 LogAll "BusyBox sources are available from http://www.busybox.net"
2819 LogAll "------------------------------------------------------------------------------"
[747]2820else
[2341]2821 LogFile "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
[747]2822fi
[1005]2823if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
[2341]2824 LogAll "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
[1005]2825else
[2341]2826 LogAll "Unable to find mindi-busybox, please install it"
[1005]2827 MindiExit -1
2828fi
[747]2829
2830# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
[2293]2831insmod /lib/modules/$KERVERRUN/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
[747]2832for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2833 insmod $i >> $LOGFILE 2>> $LOGFILE
2834done
2835
2836KERN_DISK_MADE=""
2837
[2341]2838LogFile "DIFFERENTIAL = $DIFFERENTIAL"
2839LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
2840LogFile "NOT_BOOT = '$NOT_BOOT'"
[747]2841if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[2341]2842 LogAll "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]2843 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2844 MakeMountlist $MINDI_TMP/mountlist.txt
2845 mkdir -p $MINDI_TMP/small-all/tmp
2846 cd $MINDI_TMP/small-all
[2092]2847 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
[2166]2848 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
[747]2849 sleep 2
[2341]2850 LogAll "Done. Exiting."
[925]2851 MindiExit 0
[747]2852fi
2853
[1690]2854if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[2341]2855 LogAll "Including the generation of a Bootable USB device on $USBDEVICE"
[1684]2856fi
2857
[747]2858if [ "$kernelpath" = "" ] ; then
[1335]2859 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]2860 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2861 read ch
2862 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2863 USE_OWN_KERNEL="yes"
[1809]2864 else
2865 USE_OWN_KERNEL="no"
[747]2866 fi
2867 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]2868 YOUR_KERNEL_SUCKS=""
2869 kernelpath=`TryToFindKernelPath`
2870 if [ "$kernelpath" = "" ] ; then
2871 echo -n "Please enter kernel path : "
2872 read kernelpath
2873 fi
[747]2874 else
[925]2875 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]2876 fi
2877fi
2878if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
[1885]2879 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2880 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2881 source $MINDI_LIB/FindDistroFailsafe
2882 # Log kernel image
[2341]2883 LogAll "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
[1885]2884 kernelpath="$FAILSAFE_KBIN"
[2341]2885 LogAll "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2886 LogAll "The failsafe kernel is $kernelpath.\n"
2887 LogAll "However, you are still running your kernel. If Mindi fails to create your\n"
2888 LogAll "disks then it may still be a result of a problem with your kernel.\n"
[1885]2889 pwd=`pwd`
2890 cd $MINDI_TMP
2891 mkdir -p lib/modules
2892 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2893 cd $pwd
2894 else
2895 kernelpath=$MINDI_LIB/vmlinuz
[2341]2896 LogAll "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2897 LogAll "However, you are still running your kernel. If Mindi fails to create your"
2898 LogAll "disks then it may still be a result of a problem with your kernel."
[1885]2899 pwd=`pwd`
2900 cd $MINDI_TMP
2901 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2902 cd $pwd
2903 fi
[747]2904 YOUR_KERNEL_SUCKS="Your kernel sucks"
2905fi
[2341]2906LogFile "Mindi's temp dir=$MINDI_TMP"
2907LogFile "Mindi's output dir=$MINDI_CACHE"
2908[ "$(($RANDOM%64))" -eq "0" ] && LogAll "Dude, I've looked inside your computer and it's really dusty..."
[747]2909
[965]2910[ "$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]2911
[1983]2912PrepareDataDiskImages
2913
[747]2914ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2915rds=$(($ramdisk_size-$((ramdisk_size%4096))))
[1983]2916export ramdisk_size=$rds
[747]2917
[2341]2918LogFile "Ramdisk will be $ramdisk_size KB"
[1567]2919if [ "$ARCH" = "ia64" ] ; then
[1983]2920 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
[1567]2921else
[2073]2922 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
[747]2923fi
2924
2925[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2926...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2927
[1684]2928if [ _"$MONDO_SHARE" = _"" ]; then
[1983]2929 ListImagesForUser
2930 OfferToMakeBootableISO
[1684]2931 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
[1983]2932 OfferToMakeBootableUSB
[1684]2933 fi
[2341]2934 LogAll "Finished."
[747]2935elif [ "$TAPEDEV" ] ; then
[2078]2936 if [ "$ARCH" != "ia64" ] ; then
2937 # We need to keep the img file as boot file for ia64 platform
2938 rm -f $MINDI_CACHE/{*img,*iso}
2939 else
2940 rm -f $MINDI_CACHE/*iso
2941 fi
[1898]2942 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]2943 OfferToMakeBootableUSB
[1898]2944 fi
[1983]2945 OfferToMakeBootableISO
[1880]2946 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2947 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]2948 else
[925]2949 Die "Cannot find all.tar.gz, to be written to tape"
[747]2950 fi
[1695]2951elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]2952 OfferToMakeBootableUSB
[747]2953else
[1983]2954 OfferToMakeBootableISO
[747]2955fi
2956# cleanup
[2341]2957LogAll "$FRIENDLY_OUTSTRING"
[747]2958for mtpt in $FLOPPY_WAS_MOUNTED ; do
2959 mount $mtpt
2960done
[925]2961MindiExit 0
Note: See TracBrowser for help on using the repository browser.