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

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