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

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