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

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