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

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