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

Last change on this file since 2913 was 2913, checked in by Bruno Cornec, 12 years ago
  • Fix #358 by using an external program (hpsa_obdr_mode) which can set the mode of the tape to CD-ROM or Sequential at will.

That program will have to be downloaded from http://cciss.sf.net

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