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

Last change on this file since 3115 was 3115, checked in by Bruno Cornec, 11 years ago

r5274@localhost: bruno | 2013-05-06 18:43:25 +0200

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