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

Last change on this file since 2985 was 2985, checked in by Bruno Cornec, 12 years ago

r4608@localhost: bruno | 2012-03-29 20:28:19 +0200

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