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

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