source: MondoRescue/branches/2.2.10/mindi/mindi@ 2850

Last change on this file since 2850 was 2850, checked in by Bruno Cornec, 13 years ago

svn merge -r 2773:2849 2.2.9 in 2.2.10

  • Adds 3 binaries called potentially by udev o support USB key mount at restore time (Victor Gattegno)
  • Really support both mkisofs and genisoimage everywhere
  • Try to handle netfs_user better in all cases (NFS and SSHFS)
    • Improve logging in init script
    • Format improvement
    • Removes a warning when trying to launch udevadm and it doesn't exist (RHEL 5 e.g.)
    • Fix syntax description in mondoarchive man page for -E & -I with |
  • Adds download entries for new distro supported (Mageia, Fedora 15, Ubuntu 11.04)

-Fix mindi-get-perl-modules when perl dirs in @INC are symlinks (case on Ubuntu 11.04)

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