source: MondoRescue/branches/3.0/mindi/mindi@ 3160

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