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

Last change on this file since 3154 was 3154, checked in by Bruno Cornec, 11 years ago
  • Remove the introduction of LogProgress in ListKernelModulePaths which should stay quiet
  • Remove a remaining support of max-noof-media in confidure.in now gone.
  • Fix #640 by cleaning up fully the managemnt of tmpdir and scratchdir (one function for the creation, one point of removal at end, intermediate removal if needed, clean naming conventions, unify mkdtemp usage, remove sensibly_set_tmpdir_and_scratchdir function). Consequence is that default dir for scratchdir if nothing else specified is /tmp using CLI and the largest partition using the GUI.
  • Fix a bug introduced in process_the_s_switch with intermediate variables which weren't initialized correctly.
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 123.6 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 3154 2013-06-22 22:34:33Z 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
[2963]880 LogFile "INFO: $fname is softlink"
[747]881 else
[1526]882 ldd $fname 2> /dev/null | ProcessLDD
[747]883 fi
884 done
885}
886
[925]887
[860]888# Give all symlinks recursively of a full path name
889ReadAllLink() {
890 file="$1"
[747]891
[3111]892 while [ `echo $file | grep -Ec '\.\./'` -ne 0 ]; do
[2174]893 # We need to normalise the path with .. in it
[3111]894 file=`echo $file | perl -pi -e 's|([^/]*)/([^/]+)/\.\./([^/]+)|$1/$3|g'`
895 done
[1883]896 echo "$file"
[860]897 if [ ! -h $file ]; then
898 return 0
899 fi
[747]900
[1883]901 link=`readlink $file`
[862]902 d=`dirname $file`
[1883]903 fchar=`echo $link | cut -c1`
904 # If mother dir is a link print it
[1230]905 if [ -h "$d" ]; then
[1784]906 echo "$d"
[1883]907 d=`readlink $d`
908 fi
909 if [ "$fchar" != "/" ]; then
910 # Relative or local link
911 ReadAllLink "$d/$link"
[860]912 else
[1883]913 # Absolute path
914 ReadAllLink $link
[1230]915 fi
[860]916}
917
[925]918
[747]919LocateFile() {
920 local i path fname_to_find location output resolved tmp stub cache_id loclist
921 fname_to_find="$1"
[1526]922 # It's an absolute path
[747]923 if echo "$fname_to_find" | grep -x "/.*" ; then
[859]924 output="$fname_to_find"
[860]925 if [ -h "$output" ] ; then
926 output="`ReadAllLink $output` $output"
927 fi
[859]928 echo "$output"
929 return 0
[747]930 fi
[1526]931 # It's not an absolute path
[747]932 output=""
[1526]933 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
934 #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
935 [ -h "$path" ] && continue
936 [ ! -e "$path/$fname_to_find" ] && continue
937 output="$path/$fname_to_find $output"
938 if [ -h "$path/$fname_to_find" ] ; then
939 output="`ReadAllLink $path/$fname_to_find` $output"
940 fi
[747]941 done
942 if [ "$output" = "" ] ; then
[860]943 return 1
[747]944 fi
945 echo "$output"
946 return 0
947}
948
[3149]949LogProgress() {
950 local i progress modres noof_lines
951
952 progress=$1
953 noof_lines=$2
[747]954
[3149]955 echo -en "\r\t\t\t\t\t\t\t\t"
956 i=$(($progress*100))
957 if [ $noof_lines -ne 0 ]; then
958 i=$(($i/$noof_lines))
959 else
960 i=0
961 fi
962 echo -en "$i"
963 echo -en "%"
964 modres=$(($progress%4))
965 [ "$modres" -eq "0" ] && echo -en "\t/"
966 [ "$modres" -eq "1" ] && echo -en "\t-"
967 [ "$modres" -eq "2" ] && echo -en "\t\\"
968 [ "$modres" -eq "3" ] && echo -en "\t|"
969}
970
[747]971# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
972MakeMondoConfigFile() {
973 local outfile use_lzo use_comp use_star
974 outfile=$1
975 > $outfile
976 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
977 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
[1698]978 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
[747]979 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
980 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
981 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
982 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
[998]983 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
[3149]984 use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
[747]985 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
986 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
987 echo "use-lzo $use_lzo" >> $outfile
[998]988 echo "use-gzip $use_gzip" >> $outfile
[747]989 echo "use-star $use_star" >> $outfile
[3149]990 echo "use-lzma $use_lzma" >> $outfile
[747]991 echo "use-comp $use_comp" >> $outfile
992 echo "datestamp `date`" >> $outfile
993 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
[3149]994 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
995 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
[2380]996 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
997 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
998 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
[2887]999 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-HWADDR netfs-client-hwaddr $outfile
[2380]1000 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
1001 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
[2847]1002 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-USER netfs-server-user $outfile
[2380]1003 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
1004 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
[940]1005 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
1006 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
1007 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
1008 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
1009 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1010 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
[2985]1011 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.VER bootloader.ver $outfile
[940]1012 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1013 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1014 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1015 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
[949]1016 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
1017 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
[1948]1018 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
[747]1019}
1020
[2618]1021# Get PV's for an LV
1022GetPVsForLV() {
1023 if [ -n "$1" ]; then
1024 vg=`$LVMCMD lvdisplay $1 2>/dev/null |awk '/VG Name/{print $NF;exit}'`
1025 if [ -z "$vg" ]; then
1026 return
1027 fi
1028 $LVMCMD vgdisplay -v $vg 2>/dev/null | awk '/PV Name/{print $NF}'
1029 fi
1030}
[747]1031
[2618]1032
[747]1033MakeMountlist() {
[2907]1034 local mountlist all_partitions current_partition \
[747]1035partition_size partition_format outstring partition_number \
1036partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
[2013]1037absolute_partition old_partition_fmt current_lvolume uname skip
[747]1038
[3149]1039 LogFile "------------------------------------"
[2963]1040 LogFile "Your raw fstab file looks like this:"
1041 LogFile "------------------------------------"
[747]1042 cat $MY_FSTAB >> $LOGFILE
[3149]1043 LogAll "-----------------------------------"
[2963]1044 LogAll "Your mountlist will look like this:"
[3149]1045 LogAll "-----------------------------------"
[747]1046
[2907]1047# mountlist(OUT)
[747]1048 mountlist=$1
1049
1050# NB: partition = device
1051# NB: mountpt = where the device is mounted
1052
1053 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1054
[1684]1055 [ "$mountlist" != "" ] && rm -Rf $mountlist
[747]1056 > $mountlist
1057 all_partitions=""
1058
1059 if [ $LVM != "false" ]; then
[3149]1060 LogAll "INFO: Analyzing LVM..."
[968]1061 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
[971]1062 if [ $? -ne 0 ]; then
[963]1063 LVM="false"
1064 fi
[2536]1065 # Excluded LVs and GVs are not reported here
[2424]1066 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
[747]1067 fi
1068 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1069 for i in $IMAGE_DEVS ; do
1070 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1071 done
1072 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
[3149]1073 printf "%-15s %-15s %-15s %-13s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE MB" LABEL/UUID | tee -a $LOGFILE
1074 printf "%-15s %-15s %-15s %-13s %-15s\n" ------ ---------- ------ ------- ---------- | tee -a $LOGFILE
[3028]1075 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]1076 for c_p in $all_partitions ; do
[2917]1077 # Skip fd/cd devices, network FS, cifs
[2452]1078 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
[747]1079 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1080 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]1081 current_partition=`readlink -f $c_p`
[3046]1082 if [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ]; then
1083 current_partition="$c_p"
1084 elif [ "`echo $current_partition | grep -E '^/dev/dm-'`" ]; then
[3059]1085 # For SLES 11 type of distro, do not use dm devices as they are unable to be handled by lvm commands
[3066]1086 current_partition=`$MINDI_LIB/analyze-my-lvm --givevglvofdm $current_partition`
[3046]1087 fi
[747]1088 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1089 else
1090 current_partition="$c_p"
1091 fi
1092 [ "$c_p" = "none" ] && continue
1093 redhat_label=""
[1831]1094 label=""
[957]1095 uuid=""
[861]1096 absolute_partition=`readlink -f $c_p`
[2965]1097 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
[747]1098
[1986]1099 # set default in case we dont't find it
1100 str_to_find_fmt_with=$current_partition
1101
[747]1102 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1103 # current_partition contains only first column of /etc/fstab
[2965]1104 if [ "`echo "$current_partition" | grep -i "LABEL="`" != "" ]; then
[980]1105 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
[747]1106 actual_dev=""
[853]1107
1108 # 1st try, findfs - the RHEL way of finding labels and their partitions
1109 if [ -x "/sbin/findfs" ]; then
[2847]1110 actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
[853]1111 fi
[747]1112
[853]1113 # 2nd try : blkid, the good way for all LABEL except swap
1114 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[2965]1115 actual_dev=`/sbin/blkid | grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
[747]1116 # For LVM FS it will give a /dev/dm-# which should then be converted
[748]1117 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1118 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1119 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[747]1120 for dev in `ls /dev/mapper/*`; do
[963]1121 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1122 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[747]1123 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1124 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[747]1125 break
1126 fi
1127 done
1128 fi
1129 fi
1130
[853]1131 # 3rd try, which works on a standard partition (ext2/3), but not on swap
[747]1132 # For LVM gives a /dev/mapper entry
1133 if [ "x$actual_dev" = "x" ]; then
[2965]1134 actual_dev=`/bin/mount -l | grep "\[$redhat_label\]" | cut -d' ' -f1`
[747]1135 fi
1136
[853]1137 # 4th try, with vol_id
[747]1138 # SWAP only
1139 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[2965]1140 list_swaps=`cat /proc/swaps | grep "/dev/" | $AWK '{ print $1 }' `
[747]1141 for dev_swap in $list_swaps ; do
[2965]1142 dev_exists=`/sbin/vol_id $dev_swap | grep "$redhat_label"`
[747]1143 if [ "x$dev_exists" != "x" ]; then
1144 actual_dev=$dev_swap
1145 break;
1146 fi
1147 done
1148 fi
1149
[853]1150 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
[789]1151 # LABEL=SW-cciss/c0d0p3 (RDP)
[853]1152 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
[747]1153 # SWAP only
[2965]1154 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
[2013]1155 skip=""
[2292]1156 uname=$KERVERRUN
[2013]1157 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1158 # 2.6.12 needs 16 (FC3)
1159 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1160 # 2.6.19 and upper needs 1052
1161 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1162 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
[2892]1163 [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
[2013]1164 if [ $skip = "" ]; then
1165 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1166 fi
[853]1167 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1168 do
1169 # Location of the swap label for kernel 2.6
[2013]1170 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
[853]1171 if [ "x$try_dev_label" = "x$redhat_label" ]; then
[855]1172 actual_dev=$try_dev
[853]1173 fi
1174 done
[747]1175 fi
[1008]1176
1177 # Check if one of all those tries has known success
1178 if [ "x$actual_dev" != "x" ]; then
1179 current_partition=$actual_dev
1180 else
[1885]1181 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]1182 fi
[957]1183 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1184 # current_partition contains only first column of /etc/fstab
[2965]1185 elif [ "`echo "$current_partition" | grep -i "UUID="`" != "" ]; then
[980]1186 uuid=`echo "$current_partition" | cut -d'=' -f2`
[957]1187 actual_dev=""
1188
1189 # 1st try, findfs - the RHEL way of finding labels and their partitions
1190 if [ -x "/sbin/findfs" ]; then
1191 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1192 fi
1193
[1531]1194 # 2nd try : blkid, the good way for all UUID except swap
[957]1195 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[2965]1196 actual_dev=`/sbin/blkid | grep "$uuid" | grep UUID= | cut -d':' -f1`
[957]1197 # For LVM FS it will give a /dev/dm-# which should then be converted
1198 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1199 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1200 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[957]1201 for dev in `ls /dev/mapper/*`; do
[963]1202 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1203 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[957]1204 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1205 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[957]1206 break
1207 fi
1208 done
1209 fi
1210 fi
1211
1212 # 3th try, with vol_id
1213 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[2965]1214 list_dev=`mount | grep -E '^/' | $AWK '{ print $1 }' `
[957]1215 for dev in $list_dev ; do
[2965]1216 dev_exists=`/sbin/vol_id $dev | grep "$uuid"`
[957]1217 if [ "x$dev_exists" != "x" ]; then
1218 actual_dev=$dev
1219 break;
1220 fi
1221 done
1222 fi
1223
[1531]1224 # 4th try, with dumpuuid (VMWare only ?) for swap
1225 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
[2965]1226 list_dev=`cat /proc/swaps | grep -E '^/' | $AWK '{ print $1 }' `
[1531]1227 for dev in $list_dev ; do
[2965]1228 dev_exists=`/sbin/dumpuuid $dev | grep "$uuid"`
[1531]1229 if [ "x$dev_exists" != "x" ]; then
1230 actual_dev=$dev
1231 break;
1232 fi
1233 done
1234 fi
1235
[747]1236 # Check if one of all those tries has known success
1237 if [ "x$actual_dev" != "x" ]; then
1238 current_partition=$actual_dev
1239 else
[2069]1240 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]1241 fi
1242 else
[1863]1243 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1244 # they use symlinks in fstab unrelated to what is shown in mount !
1245 if [ _"$partition_mountpt" = _"" ]; then
[1986]1246 # set default in case we dont't find it
[2965]1247 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | grep -Ev "^#" | $AWK '{print $1}'`; do
[3084]1248 if [ _"`readlink -f $tmpp`" = _"`readlink -f $current_partition`" ]; then
[1863]1249 str_to_find_fmt_with=$tmpp
[2965]1250 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$tmpp" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
[1864]1251 break;
[1863]1252 fi
1253 done
1254 fi
[747]1255 fi
1256
[3084]1257 # Detects noauto partitions not mounted and exclude them
1258 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$str_to_find_fmt_with" | grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1259 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1260 LogFile "INFO: Excluding $current_partition from mountlist (due to noauto option in fstab)"
1261 continue
1262 fi
1263 # Detects bind partitions and exclude them
1264 if [ "`echo "$partition_option" | grep -iw bind`" != "" ]; then
1265 LogFile "INFO: Excluding $current_partition from mountlist (due to bind option in fstab)"
1266 continue
1267 fi
1268
[2566]1269 # Look for devices which have to be excluded
1270 skip=0
1271 if [ "$MINDI_EXCLUDE_DEVS" ] ; then
[2568]1272 l=""
1273 list_of_devices="`ReadAllLink $current_partition`"
1274 for d in $list_of_devices; do
[2579]1275 l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
[2568]1276 done
[2618]1277
1278 # Remove PVs from LVs excluded
1279 l="$l `GetPVsForLV $current_partition`"
1280
1281 # We want a single unique list
[2568]1282 list_of_devices="`echo $l | sort -u`"
[2618]1283
[2854]1284 for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
[2568]1285 if [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
[2963]1286 LogFile "INFO: Excluding $current_partition from mountlist (due to excluded device $d)"
[2566]1287 skip=1
1288 continue
1289 fi
1290 done
1291 fi
1292 if [ $skip -eq 1 ]; then
1293 continue
1294 fi
1295
[747]1296 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
[3028]1297 # Detects iso9660 ISO images and exclude them
1298 if [ "`echo "$partition_format" | grep -iw iso9660`" != "" ]; then
[3064]1299 LogFile "INFO: Excluding $current_partition from mountlist (due to iso9660 format in fstab)"
[3028]1300 continue
1301 fi
[747]1302 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1303 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1304 # the former is then a link to the latter, so we test whether
1305 # $current_partition is actually such a link or not and set
[755]1306 # $current_lvolume accordingly. On Debian you may find more than one answer
1307 # so we remove the one corresponding to /dev/.static
1308 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1309 # principle is the same and we need to find the link to it as well.
1310 # Note that $current_lvolume may well be an
[747]1311 # ordinary device. It is just to make sure that we feed the right value
1312 # into any of the LVM tools if possible.
1313
[3064]1314 current_lvolume="$current_partition"
[763]1315 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
[755]1316 # .static dir are a Debian specificity
[763]1317 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
[755]1318 echo $current_lvolume | grep -q ' '
[784]1319 if [ $? -eq 0 ]; then
[2963]1320 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
[755]1321 fi
[2072]1322 # if it's not found, it may well be a real device such as a multipath one
1323 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1324 if [ _"$current_lvolume" = _"" ]; then
1325 current_lvolume="$current_partition"
1326 fi
[747]1327 fi
1328 #
1329 # End of LVM device style variation code (other than $current_lvolume).
1330
[745]1331 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1332 # Size computed via LVM not directly
[747]1333 partition_size="lvm"
1334 else
1335 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1336 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1337 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
[2947]1338 # Skip swap files
1339 [ "`echo "$current_partition" | grep -E "^/dev"`" = "" ] && continue
[2919]1340 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition " | $AWK '{print $3}'`
[747]1341 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1342 [ "$partition_format" != "swap" ] && partition_format="swap"
1343 if [ "$partition_size" = "" ] ; then
1344 totalsize=0
1345 items=0
1346 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1347 totalsize=$(($totalsize+$i))
1348 items=$(($items+1))
1349 done
1350 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1351 [ "$partition_size" -lt "125000" ] && partition_size=125000
[2963]1352 LogFile "INFO: I'm guessing $c_p is $(($partition_size/1024))MB"
[747]1353 fi
[2947]1354 else
1355 partition_size=`SizeOfPartition $current_partition`
[747]1356 fi
1357 fi
1358 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1359 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1360 if [ "$partition_mountpt" = "" ] ; then
1361 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1362 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1363 partition_mountpt="raid"
1364 partition_format="raid"
1365 else
1366 partition_mountpt="lvm"
1367 partition_format="lvm"
1368 fi
1369 fi
1370 fi
1371 psz=$partition_size
[2963]1372 LogFile "INFO: Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
[747]1373 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1374 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1375 partition_mountpt="image"
1376 old_partition_fmt=$partition_format
1377 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1378 partition_size=$(($partition_size+1)); # just in case
1379 if [ "$partition_format" = "Linux" ] ; then
[2963]1380 LogFile "WARNING: Are you imaging a mounted swap partition? Silly..."
1381 LogFile "WARNING: Reverting format from $old_partition_fmt to $partition_format"
[747]1382 partition_format=$old_partition_fmt
1383 fi
1384 fi
[2566]1385
[747]1386 if [ ! "$partition_mountpt" ] ; then
[2963]1387 LogFile "------- $FDISK -l $qq log ------------"
[1883]1388 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
[747]1389 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1390 [ "$partition_format" ] && break
1391 done
[2963]1392 LogFile "------- $FDISK log end ------------"
[747]1393 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1394 partition_format="compaq"
1395 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
[3149]1396 LogAll "WARNING: Unable to find mountpoint of $current_partition - ignoring"
[747]1397 continue
1398 fi
1399 fi
[1755]1400 if [ "$redhat_label" ]; then
1401 label="$redhat_label"
[1756]1402 elif [ "$uuid" ]; then
[1755]1403 label="$uuid"
1404 fi
[747]1405 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
[963]1406 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
[3149]1407 unofficial_outstring=`printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
[747]1408 if [ "$current_partition" = "" ] ; then
[2963]1409 LogFile "WARNING: Unknown partition (outstring = $unofficial_outstring)"
[747]1410 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1411 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1412 partition_mountpt=raid
1413 partition_format=raid
[3149]1414 printf "%-15s %-15s %-15s %7s %15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
[1755]1415 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1416 else
[2963]1417 LogFile "WARNING: Unknown mountpoint (outstring = $unofficial_outstring)"
[747]1418 fi
1419 elif [ "$partition_format" = "" ] ; then
[2963]1420 LogFile "WARNING: Unknown format (outstring = $unofficial_outstring)"
[747]1421 elif [ "$partition_size" = "" ] ; then
[2963]1422 LogFile "WARNING: Unknown partition size (outstring = $unofficial_outstring)"
[747]1423 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1424 continue
1425 else
1426 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
[2963]1427 LogFile "WARNING: vfat should be used instead of dos/msdos as a partition format"
[747]1428 partition_format="vfat"
1429 fi
[3149]1430 printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
[1755]1431 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1432 fi
1433 done
[3149]1434 LogAll "-----------------------------------"
[747]1435}
1436
[2432]1437CheckMountlist() {
1438 local file=$1
1439 # Coherency verification
[2529]1440 ML01=`cat $file | wc -l`
[2995]1441 ML02=`grep -vE ' lvm | raid | swap ' $file | wc -l`
[2432]1442 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
[3024]1443 ML2=`grep -vE ' lvm | raid | swap ' $file | $AWK '{print $2}' | sort -u | wc -l`
[2529]1444 if [ "$ML01" -ne "$ML1" ]; then
[2963]1445 LogFile "--------------------------------------------"
[3081]1446 LogAll "WARNING: Duplicate device entry in mountlist"
[2963]1447 LogFile "--------------------------------------------"
[2432]1448 fi
[2529]1449 if [ "$ML02" -ne "$ML2" ]; then
[2963]1450 LogFile "--------------------------------------------"
1451 LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1452 LogFile "------------------------------------------------"
[2432]1453 fi
1454}
[747]1455
1456OfferToMakeBootableISO() {
1457 local i old_pwd
[2457]1458 if [ -z "$ISO_CMD" ]; then
[3149]1459 LogAll "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
[2457]1460 return
1461 fi
[1684]1462 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[966]1463 echo -en "Shall I make a bootable CD image? (y/[n]) "
[747]1464 read i
1465 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1466 fi
[940]1467 rm -Rf $MINDI_TMP/iso
[1983]1468 mkdir -p $MINDI_TMP/iso/{images,archives}
[2963]1469 LogFile "INFO: mindi_lib = $MINDI_LIB"
[3149]1470 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]1471 for i in memdisk memtest.bin memtest.img ; do
[953]1472 j=$MINDI_LIB/$i
[1983]1473 k=$MINDI_TMP/iso
[953]1474 if [ -e "$j" ] ; then
[3149]1475 LogAll "INFO: Copying $j to $k"
[2092]1476 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1477 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1885]1478 if [ _"$MONDO_SHARE" != _"" ]; then
1479 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1480 fi
[953]1481 fi
[747]1482 done
[2948]1483 MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
[2629]1484 if [ $KERNEL_IS_XEN = "yes" ]; then
1485 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?"
1486 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?"
1487 fi
[2681]1488 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?"
1489 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]1490
[1885]1491 if [ _"$MONDO_SHARE" != _"" ]; then
[2681]1492 if [ $KERNEL_IS_XEN = "yes" ]; then
1493 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?"
1494 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?"
1495 fi
[1929]1496 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]1497 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]1498 fi
[2073]1499 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
[747]1500 if [ "$ARCH" != "ia64" ] ; then
[2092]1501 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]1502 fi
[1983]1503 old_pwd=`pwd`
[2712]1504 cd "$MINDI_TMP/iso"
[747]1505 if [ "$ARCH" != "ia64" ] ; then
[1885]1506 if [ _"$MONDO_SHARE" != _"" ]; then
[2681]1507 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?"
1508 if [ $KERNEL_IS_XEN = "yes" ]; then
1509 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]1510 fi
[1983]1511 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
[1885]1512 fi
[1983]1513 $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]1514 else
[1983]1515 $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]1516 fi
1517 if [ "$?" -ne "0" ] ; then
[2963]1518 LogFile "----------- $ISO_CMD's errors --------------"
1519 LogAll "$ISO_CMD returned the following errors:"
1520 cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
[3149]1521 LogAll "ERROR: Failed to create ISO image."
[747]1522 else
[2963]1523 LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
[747]1524 fi
[940]1525 rm -f $MINDI_TMP/mkisofs.log
[2712]1526 cd "$old_pwd"
[747]1527}
1528
1529
[1684]1530OfferToMakeBootableUSB() {
[2041]1531 local i
[1684]1532 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[2621]1533 echo -n "Shall I make a bootable USB device ? (y/[n]) "
[1764]1534 read i
1535 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1536 if [ "$USBDEVICE" = "" ]; then
1537 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1538 read dev
1539 USBDEVICE=$dev
[1722]1540 fi
[1764]1541 echo "WARNING: This will erase all content on $USBDEVICE"
1542 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
[2040]1543 read i
1544 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
[1684]1545 fi
1546 rm -Rf $MINDI_TMP/usb
1547 mkdir -p $MINDI_TMP/usb
1548 USBPART="${USBDEVICE}1"
1549
1550 echo -en "Transforming $USBDEVICE in a Bootable device "
1551 echo -en "."
[2963]1552 LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1553 LogFile "INFO: Checking $USBDEVICE"
[2924]1554 $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
[1684]1555 if [ $? -ne 0 ]; then
[2963]1556 LogAll "ERROR: Unable to access $USBDEVICE"
[3086]1557 LogAll " Make sure your USB device is plugged in"
[2963]1558 MindiExit -1
[1684]1559 fi
1560 echo -en "."
[3149]1561 # Some distro do auto mount at that point (Ubuntu)
[2963]1562 LogFile "INFO: Unmounting $USBPART just in case"
[1721]1563 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
[2057]1564 # If your key has no MBR it may cause an issue
1565 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
[2855]1566 if [ -r $MBRFILE ]; then
[2963]1567 LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
[2855]1568 dd if=$MBRFILE of=$USBDEVICE
1569 else
[2963]1570 LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1571 LogAll " on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
[2855]1572 fi
[2963]1573 LogFile "INFO: Preparing $USBDEVICE"
[2851]1574 cat > $MINDI_TMP/fdisk.txt << EOF
[2057]1575d
1576d
1577d
1578d
[1684]1579n
1580p
15811
1582
1583
1584t
1585b
1586a
15871
1588w
1589EOF
[2851]1590 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
[1684]1591 if [ $? -ne 0 ]; then
[2963]1592 LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
[3086]1593 LogAll " Make sure your USB device is plugged in"
[1684]1594 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1595 MindiExit -1
1596 fi
[2963]1597 LogFile "fdisk build file"
1598 LogFile "----------------"
[2851]1599 cat $MINDI_TMP/fdisk.txt >> $LOGFILE
[2963]1600 LogFile "----------------"
[2924]1601 rm -f $MINDI_TMP/fdisk.txt
[2963]1602 LogFile "INFO: The USB device $USBDEVICE now looks like this:"
[2190]1603 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
[1684]1604 echo -en "."
[3006]1605 # Calling kpartx in case devices were not created
[3033]1606 if [ -x "/sbin/kpartx" ]; then
[3027]1607 /sbin/kpartx -a $USBDEVICE
1608 fi
[2461]1609 # Some distro do auto mount at that point (Ubuntu)
[2963]1610 LogFile "INFO: Unmounting $USBPART just in case again"
[2461]1611 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1612 echo -en "."
[3086]1613 # Some distro have a dmsetup conf at that point so removing it Cf: http://trac.mondorescue.org/ticket/651
1614 if [ "`which dmsetup`" != "" ]; then
1615 block_id="`echo $USBPART | sed 's|/dev/||g'`"
1616 if [[ "`dmsetup ls | awk '{print $1}' | grep $block_id`" != "" ]]; then
1617 LogFile "INFO: Removing $block_id from device mapper."
1618 sleep 1
1619 dmsetup remove $block_id
1620 fi
1621 fi
1622 echo -en "."
[2963]1623 LogFile "INFO: Creating a vfat filesystem on $USBPART"
[1688]1624 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
[1684]1625 if [ $? -ne 0 ]; then
[2963]1626 LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
[3086]1627 LogAll " Make sure your USB device is plugged in and partitioned ($USBPART must exist on it)"
[1684]1628 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1629 MindiExit -1
1630 fi
1631 echo -en "."
[2963]1632 LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
[1684]1633 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1634 if [ $? -ne 0 ]; then
[2963]1635 LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
[3086]1636 LogAll " Make sure your USB device is plugged in, partitioned and formated ($USBPART must exist on it)"
[1684]1637 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1638 MindiExit -1
1639 fi
1640 echo -en "."
[1691]1641 mkdir -p $MINDI_TMP/usb/images
[3149]1642 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]1643 echo -en "."
[2963]1644 LogFile "INFO: mindi_lib = $MINDI_LIB"
[1684]1645 for i in memdisk memtest.bin memtest.img ; do
1646 j=$MINDI_LIB/$i
1647 k=$MINDI_TMP/usb
1648 if [ -e "$j" ] ; then
[2963]1649 LogIt "INFO: Copying $j to $k"
[2092]1650 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1651 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1684]1652 fi
1653 done
1654 echo -en "."
[2948]1655 MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
[1684]1656 echo -en "."
[2092]1657 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]1658 echo -en "."
[1983]1659 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
[1684]1660 echo -en "."
[2041]1661 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
[1684]1662 echo -en "."
[2963]1663 LogAll "----------- syslinux's conf --------------"
[2476]1664 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
[2963]1665 LogAll "------------------------------------------"
[1721]1666 umount $MINDI_TMP/usb
[1684]1667 if [ "$ARCH" != "ia64" ] ; then
[2939]1668 syslinux -v 2>&1 | grep -q 4.02
1669 if [ $? -eq 0 ]; then
1670 # This buggy version of syslinux requires a call to --stupid and not -s
1671 syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1672 res=$?
1673 else
1674 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1675 res=$?
1676 fi
1677 if [ $res -ne 0 ] ; then
[2963]1678 LogAll "----------- syslinux's errors --------------"
[1684]1679 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
[2963]1680 LogAll "------------------------------------------"
1681 LogIt "ERROR: Failed to create USB image."
[1684]1682 else
1683 echo -e "$DONE"
[2963]1684 LogFile "INFO: Created bootable USB image on $USBDEVICE"
[1684]1685 fi
1686 rm -f $MINDI_TMP/syslinux.log
1687 else
[2963]1688 LogAll "ERROR: No USB boot support for ia64"
[1684]1689 MindiExit -1
1690 fi
1691}
1692
1693
[747]1694MakeMessageFile() {
[2292]1695
1696 if [ -x "/bin/lsb_release" ]; then
1697 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
[2754]1698 elif [ -r /etc/arch-release ]; then # this code must be written before /etc/issue test to avoid errors
1699 DESC="Arch Linux"
1700 if [ -r /var/log/pacman.log ]; then
1701 # there are no releases but we can get the last system upgrade
1702 # Output example: Arch Linux [2011-03-03 01:39]
1703 DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"
1704 fi
[2732]1705 elif [ -r /etc/issue.net ]; then
[2731]1706 DESC=`head -1 /etc/issue.net`
[2732]1707 elif [ -r /etc/issue ]; then
[2731]1708 DESC=`head -1 /etc/issue`
[2292]1709 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1710 # For pb >= 0.9.8
[2731]1711 DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
[747]1712 else
[2731]1713 DESC="Unknown desc"
[747]1714 fi
[2292]1715 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]1716 if [ _"$MONDO_SHARE" != _"" ]; then
1717 if [ "$CDRECOVERY" != "yes" ] ; then
[2380]1718 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1885]1719 echo -en "Press <enter> to continue.\n"
1720 elif [ ! "$MINDI_TMP" ] ; then
1721 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
[1983]1722 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1723 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1724 fi
[1885]1725 else
1726 echo -en "$BOOT_MEDIA_MESSAGE"
[747]1727 fi
[1983]1728 else
1729 echo -en "\
[747]1730To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1731CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
[1983]1732 fi
[747]1733 fi
1734 echo -en "\n\n\n"
1735}
1736
1737
[1983]1738MakeBootConfFile() {
[1885]1739 local options i ooo
[747]1740 options=""
[1983]1741 # Type of boot file (elilo or syslinux/isolinux)
1742 type=$1
1743 if [ "$type" = "elilo" ]; then
1744 sep="="
1745 else
1746 sep=" "
1747 fi
[925]1748
[1983]1749 # Generic header for conf file
1750 if [ "$type" != "elilo" ] ; then
1751 echo -en "prompt 1\ndisplay message.txt\n"
1752 else
1753 echo -en "prompt\n"
[925]1754 fi
[1983]1755
1756 # Compute which default option to boot from
[747]1757 if [ "$CDRECOVERY" = "yes" ] ; then
[1983]1758 echo -en "default${sep}RESTORE\n"
1759 # In case it's mondoarchive
[1885]1760 elif [ _"$MONDO_SHARE" != _"" ]; then
[2380]1761 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1983]1762 echo -en "default${sep}iso\n"
[747]1763 else
[3053]1764 echo -en "default${sep}${MINDI_DEFAULT_BOOT_OPTION}\n"
[747]1765 fi
1766 else
[1983]1767 echo -en "default${sep}expert\n"
[747]1768 fi
1769
[1983]1770 # Handle timeout
[747]1771 if [ "$CDRECOVERY" != "yes" ] ; then
[3053]1772 echo -en "timeout${sep}${MINDI_BOOT_TIMEOUT}\n"
[1983]1773 else
1774 echo -en "timeout${sep}10000\n"
[747]1775 fi
1776 echo -en "\n"
[1983]1777
[2124]1778 # prepare which labels will be generated
[747]1779 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1780 options="RESTORE expert"
[1885]1781 else
1782 if [ _"$MONDO_SHARE" != _"" ]; then
[2344]1783 options="interactive expert compare iso nuke isonuke"
[747]1784 else
1785 options="expert"
[925]1786 fi
[747]1787 fi
[1983]1788
1789 # Generate rest of conf file
[747]1790 for i in $options ; do
[925]1791 ooo=$i
[3111]1792 [ "$ooo" = "RESTORE" ] && ooo="RESTORE nuke"
[1983]1793 if [ "$type" = "elilo" ]; then
[2564]1794 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]1795 else
[2073]1796 ps="/"
1797 if [ "$type" = "syslinux" ]; then
1798 ps=""
1799 fi
[2629]1800 if [ $KERNEL_IS_XEN = "no" ]; then
1801 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"
1802 else
1803 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"
1804 fi
[925]1805 fi
[1885]1806 echo -en "$outstr"
[747]1807 done
[1983]1808 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1809 if [ "$type" = "elilo" ]; then
1810 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
[2073]1811 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
[1983]1812 else
[2073]1813 ps="/"
1814 if [ "$type" = "syslinux" ]; then
1815 ps=""
1816 fi
1817 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1818 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
[1983]1819 fi
1820 fi
[747]1821}
1822
1823
1824PrepareBootDiskImage_LILO() {
[1983]1825 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1826 imagesdir=$MINDI_CACHE
1827 kernelpath=$1
[747]1828
1829 retval=0
[3149]1830
[2690]1831 [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
[1885]1832 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1833 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]1834 echo -en "..."
[1885]1835 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
[940]1836 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1837 mkdir -p $mountpoint
[1885]1838 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[3149]1839 LogFile "Creating vfat filesystem on $imagefile"
[1983]1840 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
[3149]1841 mount -t vfat -o loop $imagefile $mountpoint || LogAll "ERROR: Cannot mount (PBDI)"
1842
[964]1843 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]1844 mkdir -p $mountpoint/etc
[1983]1845 liloconf=$mountpoint/elilo.conf
[747]1846
[1983]1847 MakeBootConfFile elilo > $liloconf
[747]1848
[1230]1849 # Copy it so that CD-ROM menu entry is satisfied
[1983]1850 mountefi=0
1851 df -T | grep /boot/efi | grep -q vfat
1852 if [ $? -ne 0 ]; then
1853 mount /boot/efi
[1230]1854 if [ $? -ne 0 ]; then
[1983]1855 echo "You have to mount your EFI partition when using mindi"
1856 MindiExit -1
[1230]1857 fi
[1983]1858 mountefi=1
[1230]1859 fi
[1983]1860 el=`find /boot/efi -name elilo.efi`
1861 cp $el $mountpoint
1862 cp $liloconf $mountpoint
1863 if [ $mountefi -eq 1 ]; then
1864 umount /boot/efi 2>&1 > /dev/null
1865 fi
[1230]1866
[2963]1867 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
[1983]1868 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
[747]1869 if [ "$?" -ne "0" ] ; then
[2963]1870 LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1871 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2963]1872 LogIt " Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[940]1873 rm -f $MINDI_TMP/mtpt.$$
[2963]1874 LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1875 retval=$(($retval+1))
1876 fi
[2948]1877 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
[747]1878
1879 mkdir -p $mountpoint/tmp
[1983]1880 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1881 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
[747]1882 fi
1883
[925]1884 # copy the kernel across
[1230]1885 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1886 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1887 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2092]1888 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
[1885]1889 if [ "$?" -ne "0" ] ; then
[2963]1890 LogFile "INFO: Files at mountpoint ($mountpoint) :"
[925]1891 du -sk $mountpoint/* >> $LOGFILE
[2963]1892 LogFile "--- end of list of files ---"
[2691]1893 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
[1998]1894 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[2712]1895 cd "$old_pwd"
[747]1896 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[2963]1897 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
[925]1898 # losetup /dev/loop0 -d
[1998]1899 [ "$imagefile" != "" ] && rm -f $imagefile
[2963]1900 LogIt "ERROR: Sorry, your kernel is too big for your image"
[2773]1901 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[1885]1902 return 0
[747]1903 fi
1904 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[2963]1905 LogFile "INFO: Free space left on image = $free_space KB"
1906 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
[1794]1907 # make it bootable
[1998]1908 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[963]1909 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[1983]1910 if [ "$KERN_DISK_MADE" ] ; then
[2963]1911 LogFile "INFO: Not running LILO. It's not that kind of disk."
[747]1912 fi
[925]1913
[1983]1914 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
[747]1915 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1916 echo -en "..."
[2963]1917 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
[747]1918 if [ "$retval" -eq "0" ] ; then
[1885]1919 echo -en "...$DONE\n"
[747]1920 if [ "$KERN_DISK_MADE" ] ; then
[2963]1921 LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
[747]1922 fi
1923 else
[1885]1924 echo -en "...failed\n"
[2963]1925 LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
[1998]1926 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1927 fi
[2963]1928 [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
[747]1929 return $retval
1930}
1931
1932
[2073]1933PrepareBootDiskImage_ISOLINUX() {
[1983]1934 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1935 imagesdir=$MINDI_CACHE
1936 kernelpath=$1
[747]1937 do_boot_root_thingy=""
1938 local retval old_pwd
1939 retval=0
[925]1940
[2690]1941 [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
[1885]1942 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1943 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]1944 echo -en "..."
[2067]1945 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
[940]1946 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1947 mkdir -p $mountpoint
[1885]1948 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[2963]1949 LogFile "INFO: Creating vfat filesystem on $imagefile"
[1885]1950 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
[2067]1951 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
[1885]1952 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1953
[2625]1954 # Only move it now to its final destination and use it now
[2067]1955 mv $imagefile $imagesdir
1956 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1957
[2963]1958 mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
[925]1959
1960 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[2948]1961 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
[2073]1962 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
[2963]1963 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
[1983]1964 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
[747]1965 if [ "$?" -ne "0" ] ; then
[2963]1966 LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1967 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2963]1968 LogAll " Please unload some of your modules and try again."
[940]1969 rm -f $MINDI_TMP/mtpt.$$
[2963]1970 LogAll " Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1971 LogAll " Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[747]1972 retval=$(($retval+1))
1973 fi
1974
1975 mkdir -p $mountpoint/tmp
[1983]1976 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1977 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1978 fi
[747]1979
[925]1980 # copy the kernel across
[1230]1981 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1982 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1983 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2629]1984
1985 retval=0
[2681]1986 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1987 retval=$?
1988 if [ $KERNEL_IS_XEN = "yes" ]; then
[2629]1989 cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
1990 let retval+=$?
1991 fi
1992
1993 if [ "$retval" -ne "0" ] ; then
[2963]1994 LogFile "INFO: Files at mountpoint ($mountpoint) :"
[747]1995 du -sk $mountpoint/* >> $LOGFILE
[2963]1996 LogFile "--- end of list of files ---"
[2691]1997 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
[1998]1998 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[2712]1999 cd "$old_pwd"
[747]2000 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[3149]2001 rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
[747]2002
[2963]2003 LogIt "ERROR: Sorry, your kernel is too big for your image"
[2773]2004 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[747]2005 fi
2006 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[2963]2007 LogFile "INFO: Free space left on image = $free_space KB"
2008 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
[925]2009
2010 # make it bootable
[1998]2011 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[747]2012 mkdir -p $mountpoint/etc
[963]2013 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]2014 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2015 echo -en "..."
[3149]2016 rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
[747]2017
2018 if [ "$retval" -eq "0" ] ; then
[1885]2019 echo -en "...$DONE\n"
[747]2020 if [ "$KERN_DISK_MADE" ] ; then
[1998]2021 [ "$imagefile" != "" ] && rm -f $imagefile
[3149]2022 LogAll "INFO: $BOOT_SIZE KB boot disks were created OK\n"
[747]2023 fi
2024 else
[1885]2025 echo -en "...failed\n"
[3149]2026 LogAll "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
[1998]2027 [ "$imagefile" != "" ] && rm -f $imagefile
[747]2028 fi
[3149]2029 [ "$retval" -ne "0" ] && LogAll "ERROR: PrepareBootDiskImage() is returning nonzero"
[747]2030 return $retval
2031}
2032
2033
[2006]2034ParseModprobeForIncludes() {
2035local MODPROBE_CONF mpincfile includes include
2036
2037MODPROBE_CONF=/etc/modprobe.conf
2038mpincfile=$1
2039touch $mpincfile
2040if [ -a $MODPROBE_CONF ]; then
[2431]2041 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
[2006]2042 if [ -n "$includes" ]; then
2043 for include in $includes
2044 do
2045 if [ -a "$include" ]; then
2046 echo $include >> $mpincfile
2047 fi
2048 done
2049 fi
2050fi
2051}
2052
2053
[747]2054PrepareDataDiskImages() {
[2006]2055 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
[747]2056
[1983]2057 imagesdir=$MINDI_CACHE
[1902]2058 rm -f $imagesdir/mindi.iso
[940]2059 needlist=$MINDI_TMP/what-we-need.txt
2060 bigdir=$MINDI_TMP/bigdir
[747]2061 mkdir -p $bigdir/usr/bin
[1983]2062 mkdir -p $bigdir/usr/sbin
[2006]2063 includefile=$MINDI_TMP/$$.includefile.txt
[747]2064
[3149]2065 lfiles=`ls $DEPLIST_DIR/* | grep -v /minimal`
[2409]2066 if [ -e "$DEPLIST_FILE" ]; then
[3149]2067 lfiles="$DEPLIST_FILE $lfiles"
[2409]2068 fi
[1885]2069 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
[2006]2070 ParseModprobeForIncludes $includefile
[2019]2071 lines=$(($lines+`cat $includefile | wc -l`))
[2006]2072 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
[747]2073 res=$?
[2006]2074 rm -f $includefile
[747]2075 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]2076 pwd=`pwd`
[2712]2077 cd "$MINDI_TMP"
[747]2078 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[2712]2079 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
[747]2080 done
[925]2081 for i in $EXTRA_MODS ; do
[1810]2082 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
[2995]2083 [ ! "$j" ] && LogFile "WARNING: cannot find failsafe module $i.o.gz"
[925]2084 for k in $j ; do
[2963]2085 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2086 LogFile "INFO: Added failsafe module $k to ramdisk"
[925]2087 done
2088 done
[2712]2089 cd "$pwd"
[747]2090 else
[925]2091 ListKernelModulePaths >> $needlist
[747]2092 fi
2093 if [ "$res" -ne "0" ] ; then
[1902]2094 Die "You have $res files present in dependency list\nbut absent from filesystem."
[747]2095 fi
2096 FindAndAddUserKeyboardMappingFile
2097 mkdir -p $bigdir/tmp
[1885]2098 if [ _"$MONDO_SHARE" != _"" ]; then
[940]2099 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2100 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]2101 fi
2102 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2103 DropOptimizedLibraries $needlist $bigdir
2104 echo -en "Assembling dependency files"
2105
[3149]2106 CopyDependenciesToDirectory < $needlist $bigdir `wc -l $needlist`
2107
[925]2108 # also copy io.sys and msdos.sys, if we can find them
[747]2109 for i in `mount | cut -d' ' -f3` ; do
[925]2110 for j in io.sys msdos.sys ; do
[963]2111 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
[925]2112 done
[747]2113 done
2114
[925]2115 # master boot record, too
[940]2116 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]2117 if [ "$i" ] ; then
[3149]2118 LogAll "INFO: Backing up $i's MBR"
[925]2119 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2120 sleep 1
2121 sync
2122 j=$i
2123 [ -h "$j" ] && j=`readlink -f $j`
[3149]2124 LogAll "INFO: Creating /dev/boot_device ($j)"
[925]2125 mkdir -p $bigdir/dev
[2089]2126 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
[747]2127 fi
2128
2129 old_pwd=`pwd`
[2712]2130 cd "$bigdir"
[747]2131
[1983]2132 # Get terminfo content
2133 ti="usr/share/terminfo/l"
2134 if [ -d /$ti ]; then
2135 mkdir -p $ti
[3149]2136 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "ERROR: issue copying terminfo"
[747]2137 fi
[1764]2138 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
[747]2139 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
[1335]2140 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
[747]2141 fi
[2290]2142 if [ -d "/lib/dev-state" ]; then
[3149]2143 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
[2290]2144 fi
[2712]2145 cd "$old_pwd"
[747]2146 echo -e "$DONE"
2147 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
[940]2148 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]2149 CheckMountlist $MINDI_TMP/mountlist.txt
[1902]2150 mkdir -p $bigdir/tmp
[2092]2151 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
[1885]2152 if [ _"$MONDO_SHARE" != _"" ]; then
[1902]2153 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
[1885]2154 fi
[2032]2155 if [ $LVM != "false" ]; then
2156 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2157 if [ "$?" -ne "0" ]; then
2158 LVM="false"
2159 rm -f $bigdir/tmp/i-want-my-lvm
[2552]2160 else
[2963]2161 LogFile "Your i-want-my-lvm file content is:"
2162 LogFile "-----------------------------------"
[2552]2163 cat $bigdir/tmp/i-want-my-lvm >> $LOGFILE
[2963]2164 LogFile "-----------------------------------"
[2032]2165 fi
2166 fi
[2963]2167 LogFile "Your mountlist.txt file content is:"
2168 LogFile "-----------------------------------"
[1902]2169 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
[2963]2170 LogFile "-----------------------------------"
[2432]2171
[2092]2172 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2173 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
[1902]2174 if [ _"$MONDO_SHARE" != _"" ]; then
2175 for q in filelist.full.gz biggielist.txt ; do
2176 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2177 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2178 done
2179 fi
2180
2181 echo -en "Tarring and zipping the data content..."
2182 size_of_all_tools=`du -sk $bigdir | cut -f1`
[3149]2183 (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)
2184 LogFile "Size of the data content"
2185 LogFile "------------------------"
[1902]2186 du -sk $imagesdir/*gz >> $LOGFILE
[3149]2187 LogFile "------------------------"
[1902]2188 echo -e "$DONE"
2189
[747]2190 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[1902]2191 rm -rf $bigdir
[747]2192 rm -f $needlist
2193}
2194
2195
2196ProcessLDD() {
[1784]2197 local incoming f d nd bd bnd
[747]2198 read incoming
[1784]2199 while [ "$incoming" != "" ]; do
[859]2200 # We take the full path name of the dyn. lib. we want
[2431]2201 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
[1526]2202 for f in $incoming ; do
[1784]2203 # echo modified file name if one of the parent dir is a link
2204 # by replacing the original dirname by the destination of the link
2205 d="`dirname $f`"
2206 found="false"
2207 while [ "$d" != "/" ]; do
2208 if [ -h "$d" ]; then
2209 nd=`readlink -f $d`
2210 bd=`basename $d`
2211 bnd=`basename $nd`
2212 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2213 echo $d
2214 fi
2215 d="`dirname $d`"
2216 done
2217
[1721]2218 echo "$f"
2219 echo "`ReadAllLink $f`"
[747]2220 done
2221 read incoming
2222 done
2223}
2224
2225
2226Prompt() {
2227 echo -en "$1"
2228 read line
2229}
2230
2231
2232ReadLine() {
2233 local i incoming
2234 read incoming
2235 i=0
2236 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2237 i=$(($i+1))
2238 read incoming
[747]2239 done
2240 echo "$incoming"
2241}
2242
2243
2244SizeOfPartition() {
2245 local devpath drive res stub
2246 device=$1
[2917]2247 if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2248 Die "Cannot find $device's size - is your /etc/fstab sane?"
2249 fi
[747]2250 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2251 res=`SizeOfRaidPartition $device`
2252 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2253 echo "$res"
2254 return 0
[747]2255 fi
[925]2256 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[960]2257 res=`$FDISK -s $device 2>> $LOGFILE`
[925]2258 # end patch
[2448]2259 # take only the first in case of multiple mount (cifs, nfs, ...)
2260 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
[747]2261 [ "$res" = "" ] && res="-1"
2262 echo $res
2263 return 0
2264}
2265
2266
2267SizeOfRaidPartition() {
2268 local real_dev smallest_size silly tmp
2269
2270 silly=999999999
2271 smallest_size=$silly
2272
2273 for real_dev in `GetRaidDevMembers $1` ; do
[925]2274 tmp=`SizeOfPartition $real_dev`
2275 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2276 done
2277
2278 if [ "$smallest_size" = "$silly" ] ; then
[925]2279 echo "-1"
2280 return 1
[747]2281 else
[925]2282 echo "$smallest_size"
2283 return 0
[747]2284 fi
2285}
2286
2287
2288StripExecutable()
2289{
2290 local tmpfile
[925]2291
[940]2292 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2293 [ -d "$1" ] || [ -h "$1" ] && return
[963]2294 cp -f $1 $tmpfile 2>> $LOGFILE
[747]2295 strip $tmpfile 2> /dev/null
2296 if [ "$?" -eq "0" ] ; then
[963]2297 cp -f $tmpfile $1 2>> $LOGFILE
[2963]2298 LogFile "INFO: Stripped binary $2"
[747]2299 fi
2300 rm -f $tmpfile
2301}
2302
[2292]2303KernelVer() {
2304 local fkern_ver fname
[747]2305
[2292]2306 fname=$1
2307 file $fname | grep -q gzip
2308 if [ "$?" -eq "0" ] ; then
2309 # Used by ia64
2310 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2311 else
2312 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2313 fi
2314 echo "$fkern_ver"
2315}
2316
2317
[2880]2318# WARNING: This function should just echo the final result !!!
2319#
[747]2320TryToFindKernelPath() {
[2880]2321 local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
[925]2322
[2292]2323 we_want_version=$KERVERRUN
[747]2324 possible_kernels=""
2325 duff_kernels=""
[2880]2326 output=""
[747]2327
2328 if [ "$ARCH" = "ia64" ] ; then
2329 root="/boot/efi/efi"
2330 else
2331 root="/"
2332 fi
[2681]2333 # See if we're booted from a Xen kernel
[2889]2334 # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2335 if [ -f /proc/xen/capabilities ]; then
[2681]2336 # It's a Xen kernel
2337 KERNEL_IS_XEN="yes"
[2963]2338 LogFile "INFO: It's a Xen kernel..."
[2681]2339 fi
2340
[3122]2341 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]2342 [ ! -e "$fname" ] && continue
[747]2343 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[2292]2344 fkern_ver=`KernelVer $fname`
[747]2345 [ "$fkern_ver" = "" ] && continue
2346 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2347 [ -f "$fname" ] || continue
2348 [ -h "$fname" ] && continue
2349 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2350 file $fname | grep -q gzip
2351 if [ "$?" -eq "0" ] ; then
2352 # Used by ia64
2353 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2880]2354 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2355 duff_kernels="$fname $duff_kernels"
2356 else
[747]2357 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2358 possible_kernels="$fname $possible_kernels"
[925]2359 fi
[747]2360 else
[925]2361 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2880]2362 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2363 duff_kernels="$fname $duff_kernels"
2364 else
[747]2365 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2366 possible_kernels="$fname $possible_kernels"
[925]2367 fi
[747]2368 fi
2369 done
2370 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2371 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2372 fi
2373 if [ ! "$possible_kernels" ] ; then
[3149]2374 LogAll "INFO: No kernel matches exactly. Are there any duff kernels?"
[747]2375 possible_kernels="$duff_kernels"
2376 if [ ! "$possible_kernels" ] ; then
[3149]2377 LogAll "INFO: Sorry, no duff kernels either"
[747]2378 else
[3149]2379 LogAll "INFO: I bet you're running Debian or Gentoo, aren't you?"
2380 LogAll "INFO: Your kernel doesn't have a sane builddate. Oh well..."
[747]2381 fi
2382 fi
[2681]2383 if [ $KERNEL_IS_XEN = "yes" ]; then
2384 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2385 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2386 FindMboot32Binary
2387 fi
[2829]2388 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2389 noof_kernels=`CountItemsIn "$possible_kernels"`
[747]2390 if [ "$noof_kernels" -eq "0" ] ; then
[3149]2391 LogAll "Could not find your kernel."
[925]2392 if [ -e "/boot/vmlinuz" ] ; then
[3149]2393 LogAll "INFO: Using /boot/vmlinuz as a last resort."
[925]2394 output=/boot/vmlinuz
[747]2395 else
[925]2396 output=""
2397 fi
[747]2398 elif [ "$noof_kernels" -eq "1" ] ; then
[2880]2399 kp=`echo "$possible_kernels" | sed s/' '//`
[2963]2400 LogFile "INFO: Your kernel is $kp (v$KERVERRUN)"
[2880]2401 output="$kp"
[747]2402 else
2403 for i in $possible_kernels ; do
[2880]2404 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
[3149]2405 LogAll "INFO: OK, I used my initiative and found that "
2406 LogAll "INFO: $i is probably your kernel. "
[925]2407 output="$i"
[2858]2408 break
[925]2409 fi
[747]2410 done
[2858]2411 if [ ! -n "$output" ]; then
[2880]2412 if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
[2681]2413 output=/boot/vmlinuz
[2963]2414 LogFile "INFO: Schlomo, this one's for you."
[2681]2415 else
[2963]2416 LogFile "INFO: Two or more possible kernels found. You may specify any one of them and the "
2417 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2418 LogFile "INFO: $possible_kernels"
[2880]2419 output=""
[2681]2420 fi
2421 fi
2422 fi
2423 if [ $KERNEL_IS_XEN = "yes" ]; then
2424 if [ "$noof_xenkernels" -eq "0" ]; then
2425 xenkernelpath=""
2426 elif [ "$noof_xenkernels" -eq "1" ]; then
2427 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
[2963]2428 LogFile "INFO: Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
[925]2429 else
[2681]2430 for i in $possible_xenkernels ; do
[2880]2431 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
[2963]2432 LogFile "INFO: OK, I used my initiative and found that "
2433 LogFile "INFO: $i is probably your Xen kernel. "
[2681]2434 xenkernelpath="$i"
[2858]2435 break
[2681]2436 fi
2437 done
[2858]2438 if [ ! -n "$xenkernelpath" ]; then
[2681]2439 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2440 if [ ! -n "$new_possible_xenkernels" ]; then
2441 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
[2963]2442 LogFile "INFO: Using $xenkernelpath"
[2681]2443 else
[2963]2444 LogFile "INFO: Two or more possible Xen kernels found. You may specify any one of them and the "
2445 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2446 LogFile "INFO: $possible_xenkernels"
[2880]2447 output=""
[2681]2448 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
[2963]2449 LogFile "INFO: Using $xenkernelpath"
[2681]2450 fi
2451 fi
[925]2452 fi
[2681]2453 if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2454 Die "Cannot find Xen kernel $xenkernelpath, aborting"
2455 fi
[747]2456 fi
[2880]2457 LogAll "TryToFindKernelPath found $output"
[2681]2458 echo "$output"
[747]2459}
2460
2461
2462TurnTgzIntoRdz() {
[1983]2463 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]2464
[747]2465 tgz_dir_fname=$1
2466 rdz_fname=$2
[1983]2467 kernelsize=$3
[1885]2468 maxsize=$(($BOOT_SIZE-$kernelsize))
[747]2469 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2470 tempfile=$MINDI_TMP/temp.rd
2471 mountpoint=$MINDI_TMP/mnt1
[747]2472 res=0
2473 echo -en "..."
2474 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2475 echo -en "..."
[2963]2476 LogFile "INFO: Creating ext2 filesystem on $tempfile"
[1764]2477 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
[747]2478 echo -en "..."
2479 mkdir -p $mountpoint
2480 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."
2481 echo -en "..."
2482 old_pwd=`pwd`
[2712]2483 cd "$mountpoint"
[2034]2484
[3061]2485 # AL04Oct08: Check whether /lib64 or /lib is a link and if so explicitly create one in rootfs
[2042]2486 if [ -h "/lib64" ]; then
[2963]2487 mkdir -p lib || LogIt "ERROR: Unable to create lib in $mountpoint."
2488 ln -s lib lib64 || LogIt "ERROR: /lib64 is a symbolic link, but I couldn't create it in $mountpoint."
[2042]2489 fi
[3061]2490 if [ -h "/lib" ]; then
2491 mkdir -p usr/lib || LogIt "ERROR: Unable to create usr/lib in $mountpoint."
2492 mv lib/* usr/lib
[3070]2493 rmdir lib
[3061]2494 fi
[3041]2495 # Check whether /sbin and /bin are a link and if so explicitly create one in rootfs (Fedora 17 crazyness)
2496 if [ -h "/sbin" ]; then
[3070]2497 mkdir -p usr/sbin || LogIt "ERROR: Unable to create usr/sbin in $mountpoint."
[3041]2498 mv sbin/* usr/sbin
[3070]2499 rmdir sbin
[3041]2500 fi
2501 if [ -h "/bin" ]; then
[3070]2502 mkdir -p usr/bin || LogIt "ERROR: Unable to create usr/bin in $mountpoint."
[3041]2503 mv bin/* usr/bin
[3070]2504 rmdir bin
[3041]2505 fi
[2034]2506
[2963]2507 # Check files before copying to discover configuration issues or McAfee preventing mindi reading these files
2508 for f in $tgz_dir_fname/*; do
2509 if [ ! -r $f ]; then
2510 Die "ERROR: Unable to copy $f to the target dir. Check your installation or McAfee presence"
2511 else
2512 cp -Rdf $f . 2>&1 >> $LOGFILE
2513 fi
2514 done
[747]2515 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
[1914]2516
[747]2517 cd dev || Die "Can't cd to dev"
2518 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2519 rm -f dev-entries.tgz
2520 cd ..
2521
2522 for w in insmod.static insmod.static.old ; do
[925]2523 s=`which $w 2> /dev/null`
2524 if [ -e "$s" ] ; then
[2156]2525 tar cf - -C / $s 2> /dev/null | tar xf -
[925]2526 fi
[747]2527 done
2528
2529 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
[2951]2530
[2438]2531 # Copy of files mandatory for ssh to automate mount if sshfs is used
2532 mkdir $mountpoint/.ssh
[2875]2533 cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
[2438]2534 echo > $mountpoint/tmp/myssh << EOF
2535ssh -o StrictHostKeyChecking=no $*
2536EOF
2537 chmod 755 $mountpoint/tmp/myssh
2538
[2039]2539 # Copy of files mandatory for ld.so
[2042]2540 cp -rp /etc/ld.so.c* $mountpoint/etc
[2039]2541
[2951]2542 # Handle the case where busybox and mount are dynamically linked
2543 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2544 if [ $? -eq 0 ]; then
2545 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2546 rm -f bin/mount
2547 fi
2548
2549 # Copy of files from the minimal env needed as per the deplist.d/minimal.conf file (which includes all busybox deps)
[3081]2550 rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2551 for f in `grep -v " *#.*" $DEPLIST_DIR/minimal.conf | sort -u`; do
2552 if [ -r $f ]; then
2553 echo $f >> $MINDI_TMP/minimal.lis
2554 LocateDeps $f >> $MINDI_TMP/minimal2.lis
2555 fi
[2951]2556 done
[3081]2557 for f in `cat $MINDI_TMP/minimal.lis` `sort -u $MINDI_TMP/minimal2.lis`; do
2558 ReadAllLink $f >> $MINDI_TMP/minimal.lis
[2951]2559 done
2560 # Initial / are trucated by tar
[3014]2561 finallist=""
2562 # Remove directories from the list, as tar will create them anyway
2563 # and it may hurt if /lib is in it as on Debian/Ubuntu
2564 for f in `sort -u $MINDI_TMP/minimal.lis`; do
2565 if [ ! -d $f ]; then
2566 finallist="$finallist $f"
2567 fi
2568 done
[3111]2569 tar cf - $finallist 2>> $MINDI_TMP/$$.log | tar xUf - || LogIt "WARNING: Problem in minimal analysis" $MINDI_TMP/$$.log
[3000]2570
2571 # To improve support for distribution scripts, we now prefer to use bash as the std shell. Also fixes #600
[3039]2572 ln -sf /bin/bash bin/sh
2573 LogIt "INFO: Using bash as default shell"
[3081]2574 rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
[2951]2575
2576 # Avoids an issue on some distro (RHEL5)
[2164]2577 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2578
[1914]2579 mkdir -p $mountpoint/tmp
[1724]2580 # Management of udev (which includes modprobe in rules)
[1759]2581 ps auxww | grep -v grep | grep -qw udevd
[1716]2582 if [ $? -eq 0 ]; then
[1914]2583 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
[2963]2584 LogIt "INFO: udev device manager found"
2585 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
[1790]2586 # This avoids NIC remapping if on another machine at restore time on Debian at least
[2145]2587 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2588 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2589 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
[2894]2590 # Do not do it if it's a link (Ubuntu 64 bits #503)
[2895]2591 if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [ ! -h "/lib64/udev" ]; then
[2963]2592 tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
[2894]2593 fi
[2895]2594 if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [ ! -h "/lib32/udev" ]; then
[2963]2595 tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
[2895]2596 fi
2597 if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [ ! -h "/lib/udev" ]; then
[2963]2598 tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
[2895]2599 fi
[2965]2600 if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
[2964]2601 lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
[1781]2602 lis=""
2603 # Get only the files which exist in that list
[1815]2604 # and potentially their symlink structure
[1781]2605 for i in $lis2; do
[1815]2606 if [ -h $i ]; then
2607 j=$i
2608 while [ -h $j ]; do
2609 lis="$lis $j"
2610 j=`readlink $j`
2611 done
2612 lis="$lis $j"
2613 elif [ -f $i ]; then
[1781]2614 lis="$lis $i"
2615 fi
2616 done
2617 # And their deps
[1759]2618 LocateDeps $lis > $MINDI_TMP/udev.lis
2619 for i in $lis; do
2620 if [ "`echo $i | cut -c1`" = "/" ]; then
2621 j=`echo $i | cut -c2-`
[1998]2622 [ "$j" != "" ] && rm -f $j
[1759]2623 fi
2624 done
[2963]2625 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]2626 rm -f $MINDI_TMP/udev.lis
[1720]2627 else
[2965]2628 LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
[2963]2629 LogAll " mindi will use static devices which may cause problems"
[1914]2630 rm -f $mountpoint/tmp/USE-UDEV
[1720]2631 fi
[1716]2632 fi
[1786]2633
[2882]2634 # Management of potential HW info (ProLiant only at the moment)
[1880]2635 rm -rf $MINDI_CACHE/bkphw
2636 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2637 if [ -d $MINDI_CACHE/bkphw ]; then
[2963]2638 LogIt "INFO: Hardware Information found and saved ..."
[1880]2639 cp -rp $MINDI_CACHE/bkphw .
2640 if [ -f $MINDI_CACHE/tools.files ]; then
2641 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
[1863]2642 LocateDeps $lis > $MINDI_TMP/tools.lis
[2963]2643 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]2644 fi
[1880]2645 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2646 mv -f $MINDI_CACHE/mindi-rsthw .
[1761]2647 chmod 755 ./mindi-rsthw
2648 fi
[1880]2649 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
[1761]2650 fi
2651
[2183]2652 # Management of perl scripts delivered needed at restore time
2653 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
[2963]2654 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
[2183]2655
[1885]2656 for w in cdrom groovy-stuff ; do
[747]2657 mkdir -p mnt/$w
2658 done
2659
[2963]2660 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]2661
[2712]2662 cd "$old_pwd"
[747]2663 echo -en "..."
2664 old_pwd=`pwd`
2665 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[2712]2666 cd "$MINDI_TMP"
[1885]2667 needed_modules_path=lib/modules/$FAILSAFE_KVER
[747]2668 else
2669 cd /
2670 if [ "${kernelname}" != "" ]
2671 then
[1885]2672 needed_modules_path=lib/modules/${kernelname}
[747]2673 else
[2292]2674 needed_modules_path=lib/modules/$KERVERRUN
[747]2675 fi
2676 fi
[1885]2677
2678 needed_modules=""
[1993]2679 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
[1885]2680
[2380]2681 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[747]2682 # For PXE boot
2683 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2684 fi
[1715]2685 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2686 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2687 fi
[1727]2688 for i in $DENY_MODS; do
[2963]2689 LogFile "INFO: Removing $i from the list of modules to load"
[1727]2690 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2691 done
2692
[2963]2693 [ -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]2694 for i in $list_of_groovy_mods ; do
[1885]2695 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
[747]2696 done
[1914]2697
[2600]2698 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
[747]2699 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2700 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[2963]2701 LogFile "INFO: Adding $i ($s KB) to the rootfs"
[3011]2702 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
[1914]2703 # Uncompress modules if not using udev and native modprobe
[1815]2704 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2705 if [ "`echo "$i" | grep -F ".gz"`" ]; then
[2963]2706 LogFile "INFO: Uncompressing $i"
[1727]2707 gunzip -f $mountpoint/$i
[1815]2708 fi
[1727]2709 fi
[3011]2710 if [ -L $mountpoint/$i ] && [ `echo "$i" | grep "\.ko$"` ]; then
2711 echo "Replacing module symlink ($i) with actual file"
2712 rm -f $mountpoint/$i
2713 cp -Lf $i $mountpoint/$i
2714 ls -l $mountpoint/$i
2715 fi
[747]2716 done
[1815]2717
[2964]2718 # Also copy modules.* in case of udev so that normal modprobe works
2719 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]2720
[2680]2721 # Copy FW in case some drivers needs it
2722 if [ -d "/lib/firmware" ]; then
2723 cp -rp /lib/firmware $mountpoint/lib
2724 fi
2725
[2913]2726 # Copy an additional ProLiant tool for OBDR support
2727 if [ -f $MINDI_TMP/OBDR ]; then
[3117]2728 found=0
[2913]2729 if [ -x /usr/bin/hpsa_obdr_mode ]; then
2730 mkdir -p $mountpoint/usr/bin
2731 cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
[3117]2732 LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved Smart Array OBDR support"
2733 found=1
2734 fi
2735 if [ -x /usr/bin/sg_wr_mode ]; then
2736 mkdir -p $mountpoint/usr/bin
[3135]2737 lis="/usr/bin/sg_map /usr/bin/sg_inq /usr/bin/sg_reset /usr/bin/rev"
[3118]2738 LocateDeps $lis > $MINDI_TMP/obdr.lis
2739 (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)
2740 LogIt "INFO: Copying /usr/bin/sg_reset to ramdisk for improved SCSI OBDR support"
[3117]2741 found=1
2742 fi
2743 if [ $found -eq 0 ]; then
2744 LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode nor the /usr/bin/sg_wr_mode tool"
[2913]2745 LogAll " This may lead to a tape not going back to sequential mode after OBDR boot"
2746 fi
2747 fi
2748
[1885]2749 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
[2963]2750 LogFile "INFO: Deleting devfsd daemon from ramdisk"
[2995]2751 [ ! -e "/sbin/devfsd" ] && LogFile " ...because /sbin/devfsd not found"
2752 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile " ...because kernel is failsafe"
[747]2753 rm -f $mountpoint/sbin/devfsd
2754 fi
[2712]2755 cd "$old_pwd"
[747]2756 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
[1885]2757 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2758 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[2092]2759 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2760 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
[747]2761 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2762 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2763 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2764 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[747]2765 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2766 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2767 fi
2768 mkdir -p $mountpoint/proc
[2963]2769 LogFile "---------------------------"
2770 LogFile "Content of initial ramdisk:"
2771 LogFile "---------------------------"
[2712]2772 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
[2963]2773 LogFile "---------------------------"
[2438]2774
[1230]2775 # Determine what filesystem to use for initrd image
[2963]2776 LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
[1230]2777 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2778 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
[3008]2779 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ] || [ "$gvFileSystem" = "ext4fs" ]; then
[1230]2780 # say what will be used
[2963]2781 LogFile "INFO: Creating an $gvFileSystem initrd image..."
[1230]2782 # kernel expects linuxrc in ext2 filesystem
[2712]2783 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
[1230]2784 # unmount loop filesystem and create image file using the standard approach
2785 umount $mountpoint || Die "Cannot unmount $tempfile"
[1764]2786 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
[3008]2787 if [ "$gvFileSystem" = "ext4fs" ] && [ -x "/sbin/tune4fs" ]; then
2788 bs=`/sbin/tune4fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2789 else
2790 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2791 fi
[2564]2792 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
[1799]2793 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
[1764]2794 rm -f ${rdz_fname}.tmp
[1230]2795 # log that we are done
[2995]2796 LogFile " ...done."
[2390]2797 elif [ "$gvFileSystem" = "initramfs" ]; then
[1230]2798 # say what will be used
[2963]2799 LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
[1230]2800 # make sure that cpio is there
2801 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2802 # go into filesystem
[2712]2803 cd "$mountpoint"
[1230]2804 # kernel expects init in cpio filesystem
2805 ln -sf sbin/init init
2806 # create cpio image file and unmount loop filesystem
[1929]2807 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
[2712]2808 cd "$old_pwd"
[1230]2809 umount $mountpoint || Die "Cannot unmount $tempfile"
2810 # log that we are done
[2995]2811 LogFile " ...done."
[2390]2812 else
[1230]2813 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
[2390]2814 fi
2815
[747]2816 if [ "$res" -eq "0" ] ; then
2817 echo -en "..."
2818 else
2819 echo -en "\rMade an rdz WITH ERRORS. \n"
2820 fi
2821 return 0
2822}
2823
2824
2825##############################################################################
[1021]2826#----------------------------------- Main -----------------------------------#
[747]2827##############################################################################
2828
[1885]2829# Now we can create what we need
2830mkdir -p $MINDI_TMP
[747]2831
[1885]2832# Purge from potential old run
2833if [ _"$MINDI_CACHE" = _"" ]; then
2834 Die "MINDI_CACHE undefined"
2835fi
2836
[2995]2837# --nolog needs to be first, and is used in analyze-my-lvm
2838if [ "$1" = "--nolog" ] ; then
2839 shift
2840 LOGFILE=/dev/stderr
2841else
2842 > $LOGFILE
2843fi
[1885]2844if [ "$1" = "--printvar" ] ; then
2845 shift
2846 if [ _"$1" != _"" ] ; then
2847 set | grep -Ew "^$1" | cut -d= -f2
2848 fi
[2183]2849 exit 0
[1885]2850fi
2851
[2963]2852LogFile "mindi v$MINDI_VERSION"
2853LogFile "$ARCH architecture detected"
2854LogFile "mindi called with the following arguments:"
[2978]2855echo "$@">> $LOGFILE
[2963]2856LogFile "Start date : `date`"
2857LogFile "-----------------------------"
[747]2858
[3149]2859[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && LogAll "/sbin/mkfs.vfat is missing!"
[747]2860
[1010]2861# Log some capital variables
2862[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
[3149]2863[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
[2963]2864LogFile "MONDO_SHARE = $MONDO_SHARE"
2865LogFile "MINDI_LIB = $MINDI_LIB"
2866LogFile "MINDI_SBIN = $MINDI_SBIN"
2867LogFile "MINDI_CONF = $MINDI_CONF"
[1885]2868if [ -f $MINDI_CONFIG ]; then
[2963]2869 LogFile "-----------------------------"
2870 LogFile " Mindi configuration file "
2871 LogFile "-----------------------------"
[1885]2872 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
[2963]2873 LogFile "-----------------------------"
[1885]2874fi
[2995]2875LogFile "In Mindi"
2876LogFile "--------"
2877LogFile "EXTRA_SPACE = $EXTRA_SPACE"
2878LogFile "BOOT_SIZE = $BOOT_SIZE"
2879LogFile "--------"
[1010]2880
[747]2881trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]2882
2883# Sanity checks
2884which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2885which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2886which 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."
2887which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2888if which awk &> /dev/null ; then
2889 if ! which gawk &> /dev/null ; then
[2963]2890 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]2891 fi
2892fi
2893which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
[2222]2894[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
[1010]2895
[3005]2896[ "`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]2897
2898# Update the PATH variable if incomplete
2899if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2900 PATH=$PATH:/sbin:/usr/sbin
2901 export PATH
[2963]2902 LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2903 LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2904 LogFile "INFO: Or you might like to call 'su -' instead of 'su', for example."
[1010]2905fi
2906
[1885]2907# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2908if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2909 source $MINDI_LIB/FindDistroFailsafe
2910 # Log kernel image
[2963]2911 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
[1885]2912else
2913 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2914fi
[1010]2915
[1737]2916if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
[1010]2917 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2918fi
2919
[3149]2920### TODO
[747]2921### Fix as it's not mandatory on ia64
2922if [ "$ARCH" = "ia64" ] ; then
[1010]2923 if which elilo &> /dev/null ; then
2924 LILO_EXE=elilo
2925 else
[2024]2926 LILO_EXE=`which false 2> /dev/null`
[1010]2927 fi
[747]2928else
2929 FindIsolinuxBinary
2930fi
2931trap "Aborted" SIGTERM
2932DONE="\r\t\t\t\t\t\t\t\tDone. "
2933kernelpath=""
[1010]2934MONDO_ROOT=/var/cache/mondo
[747]2935mkdir -p $MONDO_ROOT
2936
2937if [ -d "/proc/lvm" ]; then
2938 # LVM v1
2939 LVMCMD=""
2940 LVM="v1"
2941elif [ -d "/dev/mapper" ]; then
2942 # LVM v2
2943 LVMCMD="lvm"
2944 LVM="v2"
2945else
2946 LVM="false"
2947fi
[3149]2948
2949if [ -e "/proc/cmdline" ]; then
2950 CMDLINE="/proc/cmdline"
2951elif [ -e "/tmp/cmdline" ]; then
2952 CMDLINE="/tmp/cmdline"
2953else
2954 CMDLINE="/dev/null"
2955fi
2956
[2963]2957LogFile "INFO: LVM set to $LVM"
2958LogFile "----------"
2959LogFile "mount result:"
2960LogFile "-------------"
[1230]2961mount >> $LOGFILE
[1315]2962if [ -e /etc/raidtab ]; then
[2963]2963 LogFile "-------------"
2964 LogFile "/etc/raidtab content:"
2965 LogFile "-------------"
[1315]2966 cat /etc/raidtab >> $LOGFILE
[3077]2967else
[3073]2968 LogFile "No file /etc/raidtab"
[1315]2969fi
[2981]2970if [ -e /etc/mdadm.conf ]; then
2971 LogFile "-------------"
2972 LogFile "/etc/mdadm.conf content:"
2973 LogFile "-------------"
2974 cat /etc/mdadm.conf >> $LOGFILE
[3077]2975else
[3149]2976 LogFile "-------------"
[3073]2977 LogFile "No file /etc/mdadm.conf"
[2981]2978fi
[2963]2979LogFile "-------------"
[3149]2980LogFile "cat $CMDLINE"
[2963]2981LogFile "-------------"
[3149]2982cat $CMDLINE >> $LOGFILE
[2963]2983LogFile "-------------"
2984LogFile "cat /proc/swaps:"
2985LogFile "-------------"
[2014]2986cat /proc/swaps >> $LOGFILE
[2963]2987LogFile "-------------"
[3073]2988if [ -e /proc/mdstat ]; then
2989 LogFile "cat /proc/mdstat:"
2990 LogFile "-------------"
2991 cat /proc/mdstat >> $LOGFILE
[3077]2992else
[3073]2993 LogFile "No pseudo file /proc/mdstat"
2994fi
[2981]2995LogFile "-------------"
[2963]2996LogFile "cat /proc/partitions:"
2997LogFile "-------------"
[2015]2998cat /proc/partitions >> $LOGFILE
[2963]2999LogFile "-------------"
3000LogFile "cat /proc/filesystems:"
3001LogFile "-------------"
[2015]3002cat /proc/filesystems >> $LOGFILE
[2963]3003LogFile "-------------"
3004LogFile "lsmod result:"
3005LogFile "-------------"
[1021]3006lsmod >> $LOGFILE
[2431]3007MODULES="`cat /proc/modules | $AWK '{print $1}'`"
[1531]3008if [ -x /usr/sbin/esxcfg-module ]; then
[2963]3009 LogFile "-------------"
3010 LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
3011 LogFile "-------------"
3012 LogFile "VMWare modules"
3013 LogFile "-------------"
[1531]3014 /usr/sbin/esxcfg-module -l >> $LOGFILE
[2431]3015 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
[1497]3016fi
[3149]3017LogFile "Liste of extra modules is:"
3018LogFile "-------------"
3019LogFile "$EXTRA_MODS"
3020LogFile "-------------"
[2963]3021LogFile "FORCE_MODS:"
3022LogFile "-------------"
[3065]3023LogFile "$FORCE_MODS"
[2963]3024LogFile "-------------"
3025LogFile "DENY_MODS:"
3026LogFile "-------------"
[3065]3027LogFile "$DENY_MODS"
[2963]3028LogFile "-------------"
3029LogFile "df result:"
3030LogFile "----------"
[3117]3031df -aT >> $LOGFILE
[2963]3032LogFile "-------------"
[3117]3033LogFile "df -i result:"
3034LogFile "----------"
3035df -i >> $LOGFILE
3036LogFile "-------------"
3037if [ -r /boot/grub/menu.lst ]; then
3038 LogFile "-------------"
3039 LogFile "INFO: /boot/grub/menu.lst content"
3040 LogFile "-------------"
3041 cat /boot/grub/menu.lst >> $LOGFILE
[3123]3042 LogFile "-------------"
[3117]3043fi
[3123]3044if [ -r /boot/grub/grub.conf ]; then
[3117]3045 LogFile "-------------"
[3123]3046 LogFile "INFO: /boot/grub/grub.conf content"
3047 LogFile "-------------"
3048 cat /boot/grub/grub.conf >> $LOGFILE
3049 LogFile "-------------"
3050fi
3051if [ -r /boot/grub/grub.cfg ]; then
3052 LogFile "-------------"
3053 LogFile "INFO: /boot/grub/grub.cfg content"
3054 LogFile "-------------"
3055 cat /boot/grub/grub.cfg >> $LOGFILE
3056 LogFile "-------------"
3057fi
3058if [ -r /boot/grub/device.map ]; then
3059 LogFile "-------------"
[3117]3060 LogFile "INFO: /boot/grub/device.map content"
3061 LogFile "-------------"
[3123]3062 cat /boot/grub/device.map >> $LOGFILE
3063 LogFile "-------------"
[3117]3064fi
3065if [ -r /etc/lilo.conf ]; then
3066 LogFile "-------------"
3067 LogFile "INFO: /etc/lilo.conf content"
3068 LogFile "-------------"
3069 cat /etc/lilo.conf >> $LOGFILE
3070fi
[3146]3071LogFile "Full fdisk info"
3072LogFile "---------------"
3073$FDISK -l >> $LOGFILE
3074LogFile "----------------"
[2995]3075LogFile "List of extra modules is:"
[2963]3076LogFile "$EXTRA_MODS"
3077LogFile "-------------"
[747]3078
[1723]3079# Compute libata version
[2649]3080laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
[1723]3081# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]3082if [ "`echo $MODULES | grep libata`" ]; then
[1727]3083 if [ "$laver" = "2" ]; then
[1726]3084 DENY_MODS="$DENY_MODS ide-generic"
[2963]3085 LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
3086 LogFile "-------------"
[1726]3087 fi
[1723]3088fi
3089
[2963]3090# Check for McAfee which disturbs the access to some files (tgz in articular)
[2976]3091if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
[2963]3092 LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
3093 LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
3094 LogFile "WARNING: You have two options:"
3095 LogFile "WARNING: - Exclude all directories with special files (check McAfee System Events Log)"
3096 LogFile "WARNING: - Disable the scanner during the backup"
3097fi
3098
[2457]3099# Check for ISO_CMD command
3100if [ ! -x $ISO_CMD ]; then
[2963]3101 LogFile "NOTE: No CD image (ISO file) utility found"
[2457]3102fi
3103
[747]3104FLOPPY_WAS_MOUNTED=""
3105for mtpt in /media/floppy /mnt/floppy /floppy ; do
3106 if mount | grep -w $mtpt &> /dev/null ; then
3107 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3108 umount $mtpt
3109 fi
3110done
3111
[1684]3112#
3113# If we have a USB device we need to store info
3114# and remove it from the parameters line
3115#
[747]3116if [ "$#" -ne "0" ] ; then
[1684]3117 if [ "$1" = "--usb" ] ; then
3118 shift
3119 USBDEVICE=$1
3120 if [ _"$USBDEVICE" = _"" ]; then
3121 Die "No USB device specified"
3122 fi
3123 shift
3124 fi
3125fi
3126
3127if [ "$#" -ne "0" ] ; then
[747]3128 if [ "$1" = "--findkernel" ] ; then
[2880]3129 resk=`TryToFindKernelPath`
[1336]3130 # Avoids logfile content for mondo
3131 export MONDO_SHARE=""
[2880]3132 if [ "$resk" = "" ] ; then
[2838]3133 if [ $KERNEL_IS_XEN = "yes" ]; then
3134 echo "$xenkernelpath"
[2963]3135 LogFile "INFO: xenkernelpath = $xenkernelpath"
[2860]3136 MindiExit 0
[2838]3137 else
[2860]3138 MindiExit -1
[2838]3139 fi
[747]3140 else
[2880]3141 echo "$resk"
[2963]3142 LogFile "INFO: kernelpath = $resk"
[2860]3143 MindiExit 0
[747]3144 fi
[1720]3145 elif [ "$1" = "--locatedeps" ] ; then
3146 [ ! "$2" ] && Die "Please specify the binary to look at"
[2438]3147 LocateDeps $*
[1720]3148 # Avoids logfile content for mondo
3149 export MONDO_SHARE=""
3150 MindiExit $?
[1815]3151 elif [ "$1" = "--readalllink" ] ; then
3152 [ ! "$2" ] && Die "Please specify the binary to look at"
3153 # Avoids logfile content for mondo
3154 export MONDO_SHARE=""
[3126]3155 ReadAllLink $2
[1815]3156 MindiExit $?
[2731]3157 elif [ "$1" = "--makemessage" ] ; then
[2948]3158 MakeMessageFile | cut -c1-80
[2731]3159 MindiExit 0
[747]3160 elif [ "$1" = "--makemountlist" ] ; then
3161 [ ! "$2" ] && Die "Please specify the output file"
3162 MakeMountlist $2
[2432]3163 CheckMountlist $2
[1336]3164 # Avoids logfile content for mondo
3165 export MONDO_SHARE=""
[925]3166 MindiExit $?
3167 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3168 echo "Mindi v$MINDI_VERSION"
[1336]3169 # Avoids logfile content for mondo
3170 export MONDO_SHARE=""
[925]3171 MindiExit 0
[747]3172 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]3173 MONDO_TMP=$2
3174 # Change MINDI_TMP for the one provided by mondo
3175 # So that it can get back the built files
[2153]3176 if [ _"$MONDO_TMP" = _"" ]; then
3177 Die "MONDO_TMP is empty, aborting"
3178 fi
3179 if [ _"$MONDO_TMP" = _"/" ]; then
3180 Die "MONDO_TMP is /, aborting"
3181 fi
[2092]3182 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
[1010]3183 rmdir $MINDI_TMP
[1486]3184 export MINDI_TMP=$MONDO_TMP
[953]3185 mkdir -p $MINDI_TMP
[2238]3186
[1696]3187 # This is the scratch dir in mondo - subdir images
[1880]3188 MINDI_CACHE=$3
[2238]3189
[925]3190 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[2681]3191 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3192
[747]3193###
3194### Sq-Modification...
3195### Attempt to locate kernel specific module path
3196### if module path is found then use it other wise use uname -r to set it...
3197###
[2629]3198 if [ $KERNEL_IS_XEN = "yes" ]; then
[3149]3199 LogAll "INFO: xenkernelpath = $xenkernelpath"
[2629]3200 fi
[2657]3201 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
[747]3202 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3203 then
[3149]3204 LogAll "WARNING: Module path for ${kernelpath} not found..."
3205 LogAll " using running kernel\'s modules."
[2292]3206 kernelname=$KERVERRUN
[3149]3207 else
3208 LogAll "Using modules for kernel: ${kernelname}"
[747]3209 fi
[3149]3210 LogAll "INFO: kernelname = $kernelname"
3211 LogAll "INFO: kernelpath = $kernelpath"
[747]3212###
3213### end of Sq-Modification
3214###
[925]3215 TAPEDEV=$5
3216 TAPESIZE=$6
3217 FILES_IN_FILELIST=$7
3218 USE_LZO=$8
3219 CDRECOVERY=$9
[747]3220 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3221 IMAGE_DEVS=""
3222 else
3223 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3224 fi
[925]3225 if [ "${11}" ] ; then
3226 LILO_OPTIONS=""
[3149]3227 # LogAll "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
[925]3228 fi
3229 LAST_FILELIST_NUMBER=${12}
[747]3230 ESTIMATED_TOTAL_NOOF_SLICES=${13}
[2564]3231 export MINDI_EXCLUDE_DEVS="${14}"
[747]3232 USE_COMP="${15}"
3233 USE_LILO="${16}"
[925]3234 USE_STAR="${17}"
3235 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]3236 DIFFERENTIAL="${19}"
[998]3237 USE_GZIP="${20}"
3238 NOT_BOOT="${21}"
[747]3239 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]3240 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[747]3241 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[2963]3242 [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
[1696]3243 # MONDO_ROOT is the real scratchdir
[1880]3244 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
[938]3245 if [ _"$MONDO_ROOT" != _"" ]; then
3246 mkdir -p $MONDO_ROOT
3247 else
3248 Die "MONDO_ROOT is undefined"
3249 fi
[747]3250 else
[3149]3251 LogScreen "Syntax: mindi (--custom ....)"
[925]3252 MindiExit -1
[747]3253 fi
3254fi
[2238]3255
3256if [ _"$MINDI_CACHE" != _"" ]; then
3257 rm -rf $MINDI_CACHE/* 2> /dev/null
3258 mkdir -p $MINDI_CACHE
3259fi
3260
[747]3261[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3262
[1684]3263if [ _"$MONDO_SHARE" = _"" ]; then
[963]3264 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3265 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3266 LogIt "BusyBox sources are available from http://www.busybox.net"
[747]3267 LogIt "------------------------------------------------------------------------------"
3268else
[2963]3269 LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
[747]3270fi
[1005]3271if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3272 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3273else
[2963]3274 LogIt "ERROR: Unable to find mindi-busybox, please install it"
[1005]3275 MindiExit -1
3276fi
[747]3277
3278for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
[3111]3279 modinfo $i 2> /dev/null 1> /dev/null
[3014]3280 if [ $? -eq 0 ]; then
3281 modprobe $i 2>&1 > /dev/null
3282 fi
[747]3283done
3284
3285KERN_DISK_MADE=""
3286
[2963]3287LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3288LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3289LogFile "NOT_BOOT = '$NOT_BOOT'"
[747]3290if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[2963]3291 LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]3292 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3293 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]3294 CheckMountlist $MINDI_TMP/mountlist.txt
[940]3295 mkdir -p $MINDI_TMP/small-all/tmp
[2712]3296 cd "$MINDI_TMP/small-all"
[2092]3297 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]3298 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]3299 sleep 2
[963]3300 LogIt "Done. Exiting."
[925]3301 MindiExit 0
[747]3302fi
3303
[1690]3304if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[2963]3305 LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
[1684]3306fi
3307
[747]3308if [ "$kernelpath" = "" ] ; then
[1335]3309 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]3310 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3311 read ch
3312 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3313 USE_OWN_KERNEL="yes"
[1809]3314 else
3315 USE_OWN_KERNEL="no"
[747]3316 fi
3317 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]3318 YOUR_KERNEL_SUCKS=""
3319 kernelpath=`TryToFindKernelPath`
3320 if [ "$kernelpath" = "" ] ; then
3321 echo -n "Please enter kernel path : "
3322 read kernelpath
3323 fi
[747]3324 else
[925]3325 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]3326 fi
3327fi
3328if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
[1885]3329 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3330 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3331 source $MINDI_LIB/FindDistroFailsafe
3332 # Log kernel image
[2963]3333 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
[1885]3334 kernelpath="$FAILSAFE_KBIN"
[2963]3335 LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3336 LogIt " The failsafe kernel is $kernelpath."
3337 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3338 LogIt " disks then it may still be a result of a problem with your kernel."
[1885]3339 pwd=`pwd`
[2712]3340 cd "$MINDI_TMP"
[1885]3341 mkdir -p lib/modules
3342 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
[2712]3343 cd "$pwd"
[1885]3344 else
3345 kernelpath=$MINDI_LIB/vmlinuz
[2963]3346 LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3347 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3348 LogIt " disks then it may still be a result of a problem with your kernel."
[1885]3349 pwd=`pwd`
[2712]3350 cd "$MINDI_TMP"
[1885]3351 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
[2712]3352 cd "$pwd"
[1885]3353 fi
[747]3354 YOUR_KERNEL_SUCKS="Your kernel sucks"
3355fi
[1880]3356echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
[2963]3357[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
[747]3358
[965]3359[ "$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]3360
[1983]3361PrepareDataDiskImages
3362
[747]3363ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3364rds=$(($ramdisk_size-$((ramdisk_size%4096))))
[1983]3365export ramdisk_size=$rds
[747]3366
[2963]3367LogFile "INFO: Ramdisk will be $ramdisk_size KB"
[1567]3368if [ "$ARCH" = "ia64" ] ; then
[1983]3369 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
[1567]3370else
[3072]3371 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size KB disk image."
[747]3372fi
3373
3374[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3375...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3376
[1684]3377if [ _"$MONDO_SHARE" = _"" ]; then
[1983]3378 ListImagesForUser
3379 OfferToMakeBootableISO
[1684]3380 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
[1983]3381 OfferToMakeBootableUSB
[1684]3382 fi
[3149]3383 LogAll "Finished."
[747]3384elif [ "$TAPEDEV" ] ; then
[2078]3385 if [ "$ARCH" != "ia64" ] ; then
3386 # We need to keep the img file as boot file for ia64 platform
3387 rm -f $MINDI_CACHE/{*img,*iso}
3388 else
3389 rm -f $MINDI_CACHE/*iso
3390 fi
[1898]3391 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3392 OfferToMakeBootableUSB
[1898]3393 fi
[1983]3394 OfferToMakeBootableISO
[1880]3395 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3396 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]3397 else
[925]3398 Die "Cannot find all.tar.gz, to be written to tape"
[747]3399 fi
[1695]3400elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3401 OfferToMakeBootableUSB
[747]3402else
[1983]3403 OfferToMakeBootableISO
[747]3404fi
3405# cleanup
[3149]3406LogAll "INFO: $FRIENDLY_OUTSTRING"
[747]3407for mtpt in $FLOPPY_WAS_MOUNTED ; do
3408 mount $mtpt
3409done
[925]3410MindiExit 0
Note: See TracBrowser for help on using the repository browser.