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

Last change on this file since 2382 was 2382, checked in by Bruno Cornec, 15 years ago
  • Change NFS support into a NetFS support to allow for multiple protocol in addition to NFS (NEEDS TESTING)

(Backport from 2.2.9)

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