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

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