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

Last change on this file since 3123 was 3123, checked in by victor gattegno, 11 years ago

Ticket #686 - Added grub.conf, grub.cfg and modified device.map.lst to device.map

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