source: MondoRescue/branches/3.2/mindi/mindi@ 3397

Last change on this file since 3397 was 3397, checked in by Bruno Cornec, 9 years ago

Adds a boot-type config option

It's filled by mondoarchive, passed to mindi as new 23rd param and
stored in the config file. It's also now read at restore time. No
exploitation of this parameter is done yet.
Remains also to prepare a correct bootable device for restoration
(currently ia64 == EFI we should manage the boot loader separately from
the boot type and from the boot env of the DR media)

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