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

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