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

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