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

Last change on this file since 3166 was 3166, checked in by Bruno Cornec, 11 years ago
  • Fix mindi for Mageia 3 with no /bin and /lib under / but relocated under /usr (should also fix #656 for Fedora)
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 124.2 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 3166 2013-07-25 20:01:05Z 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" -a ! -h "$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 # Is link a relative or full path name
906 fchar=`echo $link | cut -c1`
907 # If mother dir is a link print it
908 if [ -h "$d" ]; then
909 echo "$d"
910 d2=`readlink $d`
911 c2=`echo $d2 | | cut -c1`
912 if [ "$c2" != "/" ]; then
913 if [ "$c2" != "." ]; then
914 d="/$d2"
915 else
916 d="$d/$d2"
917 fi
918 fi
919 fi
920 if [ "$fchar" != "/" ]; then
921 # Relative or local link
922 ReadAllLink "$d/$link"
923 else
924 # Absolute path
925 ReadAllLink $link
926 fi
927}
928
929
930LocateFile() {
931 local i path fname_to_find location output resolved tmp stub cache_id loclist
932 fname_to_find="$1"
933 # It's an absolute path
934 if echo "$fname_to_find" | grep -x "/.*" ; then
935 output="$fname_to_find"
936 if [ -h "$output" ] ; then
937 output="`ReadAllLink $output` $output"
938 fi
939 echo "$output"
940 return 0
941 fi
942 # It's not an absolute path
943 output=""
944 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
945 #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
946 [ -h "$path" ] && continue
947 [ ! -e "$path/$fname_to_find" ] && continue
948 output="$path/$fname_to_find $output"
949 if [ -h "$path/$fname_to_find" ] ; then
950 output="`ReadAllLink $path/$fname_to_find` $output"
951 fi
952 done
953 if [ "$output" = "" ] ; then
954 return 1
955 fi
956 echo "$output"
957 return 0
958}
959
960LogProgress() {
961 local i progress modres noof_lines
962
963 progress=$1
964 noof_lines=$2
965
966 echo -en "\r\t\t\t\t\t\t\t\t"
967 i=$(($progress*100))
968 if [ $noof_lines -ne 0 ]; then
969 i=$(($i/$noof_lines))
970 else
971 i=0
972 fi
973 echo -en "$i"
974 echo -en "%"
975 modres=$(($progress%4))
976 [ "$modres" -eq "0" ] && echo -en "\t/"
977 [ "$modres" -eq "1" ] && echo -en "\t-"
978 [ "$modres" -eq "2" ] && echo -en "\t\\"
979 [ "$modres" -eq "3" ] && echo -en "\t|"
980}
981
982# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
983MakeMondoConfigFile() {
984 local outfile use_lzo use_comp use_star
985 outfile=$1
986 > $outfile
987 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
988 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
989 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
990 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
991 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
992 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
993 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
994 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
995 use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
996 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
997 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
998 echo "use-lzo $use_lzo" >> $outfile
999 echo "use-gzip $use_gzip" >> $outfile
1000 echo "use-star $use_star" >> $outfile
1001 echo "use-lzma $use_lzma" >> $outfile
1002 echo "use-comp $use_comp" >> $outfile
1003 echo "datestamp `date`" >> $outfile
1004 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
1005 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
1006 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
1007 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
1008 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
1009 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
1010 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-HWADDR netfs-client-hwaddr $outfile
1011 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
1012 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
1013 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-USER netfs-server-user $outfile
1014 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
1015 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
1016 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
1017 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
1018 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
1019 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
1020 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
1021 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
1022 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.VER bootloader.ver $outfile
1023 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
1024 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
1025 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
1026 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
1027 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
1028 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
1029 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
1030}
1031
1032# Get PV's for an LV
1033GetPVsForLV() {
1034 if [ -n "$1" ]; then
1035 vg=`$LVMCMD lvdisplay $1 2>/dev/null |awk '/VG Name/{print $NF;exit}'`
1036 if [ -z "$vg" ]; then
1037 return
1038 fi
1039 $LVMCMD vgdisplay -v $vg 2>/dev/null | awk '/PV Name/{print $NF}'
1040 fi
1041}
1042
1043
1044MakeMountlist() {
1045 local mountlist all_partitions current_partition \
1046partition_size partition_format outstring partition_number \
1047partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
1048absolute_partition old_partition_fmt current_lvolume uname skip
1049
1050 LogFile "------------------------------------"
1051 LogFile "Your raw fstab file looks like this:"
1052 LogFile "------------------------------------"
1053 cat $MY_FSTAB >> $LOGFILE
1054 LogAll "-----------------------------------"
1055 LogAll "Your mountlist will look like this:"
1056 LogAll "-----------------------------------"
1057
1058# mountlist(OUT)
1059 mountlist=$1
1060
1061# NB: partition = device
1062# NB: mountpt = where the device is mounted
1063
1064 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1065
1066 [ "$mountlist" != "" ] && rm -Rf $mountlist
1067 > $mountlist
1068 all_partitions=""
1069
1070 if [ $LVM != "false" ]; then
1071 LogAll "INFO: Analyzing LVM..."
1072 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
1073 if [ $? -ne 0 ]; then
1074 LVM="false"
1075 fi
1076 # Excluded LVs and GVs are not reported here
1077 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
1078 fi
1079 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1080 for i in $IMAGE_DEVS ; do
1081 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1082 done
1083 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1084 printf "%-15s %-15s %-15s %-13s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE MB" LABEL/UUID | tee -a $LOGFILE
1085 printf "%-15s %-15s %-15s %-13s %-15s\n" ------ ---------- ------ ------- ---------- | tee -a $LOGFILE
1086 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"
1087 for c_p in $all_partitions ; do
1088 # Skip fd/cd devices, network FS, cifs
1089 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
1090 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1091 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
1092 current_partition=`readlink -f $c_p`
1093 if [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ]; then
1094 current_partition="$c_p"
1095 elif [ "`echo $current_partition | grep -E '^/dev/dm-'`" ]; then
1096 # For SLES 11 type of distro, do not use dm devices as they are unable to be handled by lvm commands
1097 current_partition=`$MINDI_LIB/analyze-my-lvm --givevglvofdm $current_partition`
1098 fi
1099 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1100 else
1101 current_partition="$c_p"
1102 fi
1103 [ "$c_p" = "none" ] && continue
1104 redhat_label=""
1105 label=""
1106 uuid=""
1107 absolute_partition=`readlink -f $c_p`
1108 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1109
1110 # set default in case we dont't find it
1111 str_to_find_fmt_with=$current_partition
1112
1113 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1114 # current_partition contains only first column of /etc/fstab
1115 if [ "`echo "$current_partition" | grep -i "LABEL="`" != "" ]; then
1116 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1117 actual_dev=""
1118
1119 # 1st try, findfs - the RHEL way of finding labels and their partitions
1120 if [ -x "/sbin/findfs" ]; then
1121 actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
1122 fi
1123
1124 # 2nd try : blkid, the good way for all LABEL except swap
1125 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1126 actual_dev=`/sbin/blkid | grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1127 # For LVM FS it will give a /dev/dm-# which should then be converted
1128 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1129 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1130 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1131 for dev in `ls /dev/mapper/*`; do
1132 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1133 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1134 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1135 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1136 break
1137 fi
1138 done
1139 fi
1140 fi
1141
1142 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1143 # For LVM gives a /dev/mapper entry
1144 if [ "x$actual_dev" = "x" ]; then
1145 actual_dev=`/bin/mount -l | grep "\[$redhat_label\]" | cut -d' ' -f1`
1146 fi
1147
1148 # 4th try, with vol_id
1149 # SWAP only
1150 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1151 list_swaps=`cat /proc/swaps | grep "/dev/" | $AWK '{ print $1 }' `
1152 for dev_swap in $list_swaps ; do
1153 dev_exists=`/sbin/vol_id $dev_swap | grep "$redhat_label"`
1154 if [ "x$dev_exists" != "x" ]; then
1155 actual_dev=$dev_swap
1156 break;
1157 fi
1158 done
1159 fi
1160
1161 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1162 # LABEL=SW-cciss/c0d0p3 (RDP)
1163 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1164 # SWAP only
1165 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1166 skip=""
1167 uname=$KERVERRUN
1168 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1169 # 2.6.12 needs 16 (FC3)
1170 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1171 # 2.6.19 and upper needs 1052
1172 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1173 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1174 [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
1175 if [ $skip = "" ]; then
1176 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1177 fi
1178 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1179 do
1180 # Location of the swap label for kernel 2.6
1181 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1182 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1183 actual_dev=$try_dev
1184 fi
1185 done
1186 fi
1187
1188 # Check if one of all those tries has known success
1189 if [ "x$actual_dev" != "x" ]; then
1190 current_partition=$actual_dev
1191 else
1192 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"
1193 fi
1194 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1195 # current_partition contains only first column of /etc/fstab
1196 elif [ "`echo "$current_partition" | grep -i "UUID="`" != "" ]; then
1197 uuid=`echo "$current_partition" | cut -d'=' -f2`
1198 actual_dev=""
1199
1200 # 1st try, findfs - the RHEL way of finding labels and their partitions
1201 if [ -x "/sbin/findfs" ]; then
1202 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1203 fi
1204
1205 # 2nd try : blkid, the good way for all UUID except swap
1206 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1207 actual_dev=`/sbin/blkid | grep "$uuid" | grep UUID= | cut -d':' -f1`
1208 # For LVM FS it will give a /dev/dm-# which should then be converted
1209 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1210 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1211 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1212 for dev in `ls /dev/mapper/*`; do
1213 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1214 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1215 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1216 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1217 break
1218 fi
1219 done
1220 fi
1221 fi
1222
1223 # 3th try, with vol_id
1224 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1225 list_dev=`mount | grep -E '^/' | $AWK '{ print $1 }' `
1226 for dev in $list_dev ; do
1227 dev_exists=`/sbin/vol_id $dev | grep "$uuid"`
1228 if [ "x$dev_exists" != "x" ]; then
1229 actual_dev=$dev
1230 break;
1231 fi
1232 done
1233 fi
1234
1235 # 4th try, with dumpuuid (VMWare only ?) for swap
1236 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1237 list_dev=`cat /proc/swaps | grep -E '^/' | $AWK '{ print $1 }' `
1238 for dev in $list_dev ; do
1239 dev_exists=`/sbin/dumpuuid $dev | grep "$uuid"`
1240 if [ "x$dev_exists" != "x" ]; then
1241 actual_dev=$dev
1242 break;
1243 fi
1244 done
1245 fi
1246
1247 # Check if one of all those tries has known success
1248 if [ "x$actual_dev" != "x" ]; then
1249 current_partition=$actual_dev
1250 else
1251 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."
1252 fi
1253 else
1254 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1255 # they use symlinks in fstab unrelated to what is shown in mount !
1256 if [ _"$partition_mountpt" = _"" ]; then
1257 # set default in case we dont't find it
1258 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | grep -Ev "^#" | $AWK '{print $1}'`; do
1259 if [ _"`readlink -f $tmpp`" = _"`readlink -f $current_partition`" ]; then
1260 str_to_find_fmt_with=$tmpp
1261 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$tmpp" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1262 break;
1263 fi
1264 done
1265 fi
1266 fi
1267
1268 # Detects noauto partitions not mounted and exclude them
1269 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$str_to_find_fmt_with" | grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1270 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1271 LogFile "INFO: Excluding $current_partition from mountlist (due to noauto option in fstab)"
1272 continue
1273 fi
1274 # Detects bind partitions and exclude them
1275 if [ "`echo "$partition_option" | grep -iw bind`" != "" ]; then
1276 LogFile "INFO: Excluding $current_partition from mountlist (due to bind option in fstab)"
1277 continue
1278 fi
1279
1280 # Look for devices which have to be excluded
1281 skip=0
1282 if [ "$MINDI_EXCLUDE_DEVS" ] ; then
1283 l=""
1284 list_of_devices="`ReadAllLink $current_partition`"
1285 for d in $list_of_devices; do
1286 l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
1287 done
1288
1289 # Remove PVs from LVs excluded
1290 l="$l `GetPVsForLV $current_partition`"
1291
1292 # We want a single unique list
1293 list_of_devices="`echo $l | sort -u`"
1294
1295 for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
1296 if [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
1297 LogFile "INFO: Excluding $current_partition from mountlist (due to excluded device $d)"
1298 skip=1
1299 continue
1300 fi
1301 done
1302 fi
1303 if [ $skip -eq 1 ]; then
1304 continue
1305 fi
1306
1307 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1308 # Detects iso9660 ISO images and exclude them
1309 if [ "`echo "$partition_format" | grep -iw iso9660`" != "" ]; then
1310 LogFile "INFO: Excluding $current_partition from mountlist (due to iso9660 format in fstab)"
1311 continue
1312 fi
1313 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1314 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1315 # the former is then a link to the latter, so we test whether
1316 # $current_partition is actually such a link or not and set
1317 # $current_lvolume accordingly. On Debian you may find more than one answer
1318 # so we remove the one corresponding to /dev/.static
1319 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1320 # principle is the same and we need to find the link to it as well.
1321 # Note that $current_lvolume may well be an
1322 # ordinary device. It is just to make sure that we feed the right value
1323 # into any of the LVM tools if possible.
1324
1325 current_lvolume="$current_partition"
1326 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1327 # .static dir are a Debian specificity
1328 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1329 echo $current_lvolume | grep -q ' '
1330 if [ $? -eq 0 ]; then
1331 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1332 fi
1333 # if it's not found, it may well be a real device such as a multipath one
1334 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1335 if [ _"$current_lvolume" = _"" ]; then
1336 current_lvolume="$current_partition"
1337 fi
1338 fi
1339 #
1340 # End of LVM device style variation code (other than $current_lvolume).
1341
1342 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1343 # Size computed via LVM not directly
1344 partition_size="lvm"
1345 else
1346 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1347 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1348 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1349 # Skip swap files
1350 [ "`echo "$current_partition" | grep -E "^/dev"`" = "" ] && continue
1351 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition " | $AWK '{print $3}'`
1352 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1353 [ "$partition_format" != "swap" ] && partition_format="swap"
1354 if [ "$partition_size" = "" ] ; then
1355 totalsize=0
1356 items=0
1357 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1358 totalsize=$(($totalsize+$i))
1359 items=$(($items+1))
1360 done
1361 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1362 [ "$partition_size" -lt "125000" ] && partition_size=125000
1363 LogFile "INFO: I'm guessing $c_p is $(($partition_size/1024))MB"
1364 fi
1365 else
1366 partition_size=`SizeOfPartition $current_partition`
1367 fi
1368 fi
1369 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1370 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1371 if [ "$partition_mountpt" = "" ] ; then
1372 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1373 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1374 partition_mountpt="raid"
1375 partition_format="raid"
1376 else
1377 partition_mountpt="lvm"
1378 partition_format="lvm"
1379 fi
1380 fi
1381 fi
1382 psz=$partition_size
1383 LogFile "INFO: Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1384 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1385 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1386 partition_mountpt="image"
1387 old_partition_fmt=$partition_format
1388 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1389 partition_size=$(($partition_size+1)); # just in case
1390 if [ "$partition_format" = "Linux" ] ; then
1391 LogFile "WARNING: Are you imaging a mounted swap partition? Silly..."
1392 LogFile "WARNING: Reverting format from $old_partition_fmt to $partition_format"
1393 partition_format=$old_partition_fmt
1394 fi
1395 fi
1396
1397 if [ ! "$partition_mountpt" ] ; then
1398 LogFile "------- $FDISK -l $qq log ------------"
1399 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1400 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1401 [ "$partition_format" ] && break
1402 done
1403 LogFile "------- $FDISK log end ------------"
1404 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1405 partition_format="compaq"
1406 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1407 LogAll "WARNING: Unable to find mountpoint of $current_partition - ignoring"
1408 continue
1409 fi
1410 fi
1411 if [ "$redhat_label" ]; then
1412 label="$redhat_label"
1413 elif [ "$uuid" ]; then
1414 label="$uuid"
1415 fi
1416 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1417 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1418 unofficial_outstring=`printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1419 if [ "$current_partition" = "" ] ; then
1420 LogFile "WARNING: Unknown partition (outstring = $unofficial_outstring)"
1421 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1422 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1423 partition_mountpt=raid
1424 partition_format=raid
1425 printf "%-15s %-15s %-15s %7s %15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1426 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1427 else
1428 LogFile "WARNING: Unknown mountpoint (outstring = $unofficial_outstring)"
1429 fi
1430 elif [ "$partition_format" = "" ] ; then
1431 LogFile "WARNING: Unknown format (outstring = $unofficial_outstring)"
1432 elif [ "$partition_size" = "" ] ; then
1433 LogFile "WARNING: Unknown partition size (outstring = $unofficial_outstring)"
1434 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1435 continue
1436 else
1437 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1438 LogFile "WARNING: vfat should be used instead of dos/msdos as a partition format"
1439 partition_format="vfat"
1440 fi
1441 printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1442 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1443 fi
1444 done
1445 LogAll "-----------------------------------"
1446}
1447
1448CheckMountlist() {
1449 local file=$1
1450 # Coherency verification
1451 ML01=`cat $file | wc -l`
1452 ML02=`grep -vE ' lvm | raid | swap ' $file | wc -l`
1453 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1454 ML2=`grep -vE ' lvm | raid | swap ' $file | $AWK '{print $2}' | sort -u | wc -l`
1455 if [ "$ML01" -ne "$ML1" ]; then
1456 LogFile "--------------------------------------------"
1457 LogAll "WARNING: Duplicate device entry in mountlist"
1458 LogFile "--------------------------------------------"
1459 fi
1460 if [ "$ML02" -ne "$ML2" ]; then
1461 LogFile "--------------------------------------------"
1462 LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1463 LogFile "------------------------------------------------"
1464 fi
1465}
1466
1467OfferToMakeBootableISO() {
1468 local i old_pwd
1469 if [ -z "$ISO_CMD" ]; then
1470 LogAll "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
1471 return
1472 fi
1473 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1474 echo -en "Shall I make a bootable CD image? (y/[n]) "
1475 read i
1476 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1477 fi
1478 rm -Rf $MINDI_TMP/iso
1479 mkdir -p $MINDI_TMP/iso/{images,archives}
1480 LogFile "INFO: mindi_lib = $MINDI_LIB"
1481 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"
1482 for i in memdisk memtest.bin memtest.img ; do
1483 j=$MINDI_LIB/$i
1484 k=$MINDI_TMP/iso
1485 if [ -e "$j" ] ; then
1486 LogAll "INFO: Copying $j to $k"
1487 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1488 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1489 if [ _"$MONDO_SHARE" != _"" ]; then
1490 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1491 fi
1492 fi
1493 done
1494 MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
1495 if [ $KERNEL_IS_XEN = "yes" ]; then
1496 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?"
1497 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?"
1498 fi
1499 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?"
1500 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?"
1501
1502 if [ _"$MONDO_SHARE" != _"" ]; then
1503 if [ $KERNEL_IS_XEN = "yes" ]; then
1504 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?"
1505 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?"
1506 fi
1507 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?"
1508 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?"
1509 fi
1510 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1511 if [ "$ARCH" != "ia64" ] ; then
1512 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?"
1513 fi
1514 old_pwd=`pwd`
1515 cd "$MINDI_TMP/iso"
1516 if [ "$ARCH" != "ia64" ] ; then
1517 if [ _"$MONDO_SHARE" != _"" ]; then
1518 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?"
1519 if [ $KERNEL_IS_XEN = "yes" ]; then
1520 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?"
1521 fi
1522 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1523 fi
1524 $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
1525 else
1526 $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
1527 fi
1528 if [ "$?" -ne "0" ] ; then
1529 LogFile "----------- $ISO_CMD's errors --------------"
1530 LogAll "$ISO_CMD returned the following errors:"
1531 cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
1532 LogAll "ERROR: Failed to create ISO image."
1533 else
1534 LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1535 fi
1536 rm -f $MINDI_TMP/mkisofs.log
1537 cd "$old_pwd"
1538}
1539
1540
1541OfferToMakeBootableUSB() {
1542 local i
1543 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1544 echo -n "Shall I make a bootable USB device ? (y/[n]) "
1545 read i
1546 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1547 if [ "$USBDEVICE" = "" ]; then
1548 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1549 read dev
1550 USBDEVICE=$dev
1551 fi
1552 echo "WARNING: This will erase all content on $USBDEVICE"
1553 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1554 read i
1555 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1556 fi
1557 rm -Rf $MINDI_TMP/usb
1558 mkdir -p $MINDI_TMP/usb
1559 USBPART="${USBDEVICE}1"
1560
1561 echo -en "Transforming $USBDEVICE in a Bootable device "
1562 echo -en "."
1563 LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1564 LogFile "INFO: Checking $USBDEVICE"
1565 $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
1566 if [ $? -ne 0 ]; then
1567 LogAll "ERROR: Unable to access $USBDEVICE"
1568 LogAll " Make sure your USB device is plugged in"
1569 MindiExit -1
1570 fi
1571 echo -en "."
1572 # Some distro do auto mount at that point (Ubuntu)
1573 LogFile "INFO: Unmounting $USBPART just in case"
1574 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1575 # If your key has no MBR it may cause an issue
1576 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1577 if [ -r $MBRFILE ]; then
1578 LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
1579 dd if=$MBRFILE of=$USBDEVICE
1580 else
1581 LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1582 LogAll " on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
1583 fi
1584 LogFile "INFO: Preparing $USBDEVICE"
1585 cat > $MINDI_TMP/fdisk.txt << EOF
1586d
1587d
1588d
1589d
1590n
1591p
15921
1593
1594
1595t
1596b
1597a
15981
1599w
1600EOF
1601 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
1602 if [ $? -ne 0 ]; then
1603 LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
1604 LogAll " Make sure your USB device is plugged in"
1605 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1606 MindiExit -1
1607 fi
1608 LogFile "fdisk build file"
1609 LogFile "----------------"
1610 cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1611 LogFile "----------------"
1612 rm -f $MINDI_TMP/fdisk.txt
1613 LogFile "INFO: The USB device $USBDEVICE now looks like this:"
1614 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1615 echo -en "."
1616 # Calling kpartx in case devices were not created
1617 if [ -x "/sbin/kpartx" ]; then
1618 /sbin/kpartx -a $USBDEVICE
1619 fi
1620 # Some distro do auto mount at that point (Ubuntu)
1621 LogFile "INFO: Unmounting $USBPART just in case again"
1622 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1623 echo -en "."
1624 # Some distro have a dmsetup conf at that point so removing it Cf: http://trac.mondorescue.org/ticket/651
1625 if [ "`which dmsetup`" != "" ]; then
1626 block_id="`echo $USBPART | sed 's|/dev/||g'`"
1627 if [[ "`dmsetup ls | awk '{print $1}' | grep $block_id`" != "" ]]; then
1628 LogFile "INFO: Removing $block_id from device mapper."
1629 sleep 1
1630 dmsetup remove $block_id
1631 fi
1632 fi
1633 echo -en "."
1634 LogFile "INFO: Creating a vfat filesystem on $USBPART"
1635 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1636 if [ $? -ne 0 ]; then
1637 LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
1638 LogAll " Make sure your USB device is plugged in and partitioned ($USBPART must exist on it)"
1639 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1640 MindiExit -1
1641 fi
1642 echo -en "."
1643 LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
1644 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1645 if [ $? -ne 0 ]; then
1646 LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
1647 LogAll " Make sure your USB device is plugged in, partitioned and formated ($USBPART must exist on it)"
1648 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1649 MindiExit -1
1650 fi
1651 echo -en "."
1652 mkdir -p $MINDI_TMP/usb/images
1653 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"
1654 echo -en "."
1655 LogFile "INFO: mindi_lib = $MINDI_LIB"
1656 for i in memdisk memtest.bin memtest.img ; do
1657 j=$MINDI_LIB/$i
1658 k=$MINDI_TMP/usb
1659 if [ -e "$j" ] ; then
1660 LogIt "INFO: Copying $j to $k"
1661 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1662 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1663 fi
1664 done
1665 echo -en "."
1666 MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
1667 echo -en "."
1668 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?"
1669 echo -en "."
1670 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1671 echo -en "."
1672 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1673 echo -en "."
1674 LogAll "----------- syslinux's conf --------------"
1675 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1676 LogAll "------------------------------------------"
1677 umount $MINDI_TMP/usb
1678 if [ "$ARCH" != "ia64" ] ; then
1679 syslinux -v 2>&1 | grep -q 4.02
1680 if [ $? -eq 0 ]; then
1681 # This buggy version of syslinux requires a call to --stupid and not -s
1682 syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1683 res=$?
1684 else
1685 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1686 res=$?
1687 fi
1688 if [ $res -ne 0 ] ; then
1689 LogAll "----------- syslinux's errors --------------"
1690 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1691 LogAll "------------------------------------------"
1692 LogIt "ERROR: Failed to create USB image."
1693 else
1694 echo -e "$DONE"
1695 LogFile "INFO: Created bootable USB image on $USBDEVICE"
1696 fi
1697 rm -f $MINDI_TMP/syslinux.log
1698 else
1699 LogAll "ERROR: No USB boot support for ia64"
1700 MindiExit -1
1701 fi
1702}
1703
1704
1705MakeMessageFile() {
1706
1707 if [ -x "/bin/lsb_release" ]; then
1708 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1709 elif [ -r /etc/arch-release ]; then # this code must be written before /etc/issue test to avoid errors
1710 DESC="Arch Linux"
1711 if [ -r /var/log/pacman.log ]; then
1712 # there are no releases but we can get the last system upgrade
1713 # Output example: Arch Linux [2011-03-03 01:39]
1714 DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"
1715 fi
1716 elif [ -r /etc/issue.net ]; then
1717 DESC=`head -1 /etc/issue.net`
1718 elif [ -r /etc/issue ]; then
1719 DESC=`head -1 /etc/issue`
1720 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1721 # For pb >= 0.9.8
1722 DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
1723 else
1724 DESC="Unknown desc"
1725 fi
1726 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/"
1727 if [ _"$MONDO_SHARE" != _"" ]; then
1728 if [ "$CDRECOVERY" != "yes" ] ; then
1729 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1730 echo -en "Press <enter> to continue.\n"
1731 elif [ ! "$MINDI_TMP" ] ; then
1732 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1733 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1734 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1735 fi
1736 else
1737 echo -en "$BOOT_MEDIA_MESSAGE"
1738 fi
1739 else
1740 echo -en "\
1741To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1742CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1743 fi
1744 fi
1745 echo -en "\n\n\n"
1746}
1747
1748
1749MakeBootConfFile() {
1750 local options i ooo
1751 options=""
1752 # Type of boot file (elilo or syslinux/isolinux)
1753 type=$1
1754 if [ "$type" = "elilo" ]; then
1755 sep="="
1756 else
1757 sep=" "
1758 fi
1759
1760 # Generic header for conf file
1761 if [ "$type" != "elilo" ] ; then
1762 echo -en "prompt 1\ndisplay message.txt\n"
1763 else
1764 echo -en "prompt\n"
1765 fi
1766
1767 # Compute which default option to boot from
1768 if [ "$CDRECOVERY" = "yes" ] ; then
1769 echo -en "default${sep}RESTORE\n"
1770 # In case it's mondoarchive
1771 elif [ _"$MONDO_SHARE" != _"" ]; then
1772 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1773 echo -en "default${sep}iso\n"
1774 else
1775 echo -en "default${sep}${MINDI_DEFAULT_BOOT_OPTION}\n"
1776 fi
1777 else
1778 echo -en "default${sep}expert\n"
1779 fi
1780
1781 # Handle timeout
1782 if [ "$CDRECOVERY" != "yes" ] ; then
1783 echo -en "timeout${sep}${MINDI_BOOT_TIMEOUT}\n"
1784 else
1785 echo -en "timeout${sep}10000\n"
1786 fi
1787 echo -en "\n"
1788
1789 # prepare which labels will be generated
1790 if [ "$CDRECOVERY" = "yes" ] ; then
1791 options="RESTORE expert"
1792 else
1793 if [ _"$MONDO_SHARE" != _"" ]; then
1794 options="interactive expert compare iso nuke isonuke"
1795 else
1796 options="expert"
1797 fi
1798 fi
1799
1800 # Generate rest of conf file
1801 for i in $options ; do
1802 ooo=$i
1803 [ "$ooo" = "RESTORE" ] && ooo="RESTORE nuke"
1804 if [ "$type" = "elilo" ]; then
1805 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"
1806 else
1807 ps="/"
1808 if [ "$type" = "syslinux" ]; then
1809 ps=""
1810 fi
1811 if [ $KERNEL_IS_XEN = "no" ]; then
1812 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"
1813 else
1814 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"
1815 fi
1816 fi
1817 echo -en "$outstr"
1818 done
1819 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1820 if [ "$type" = "elilo" ]; then
1821 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1822 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1823 else
1824 ps="/"
1825 if [ "$type" = "syslinux" ]; then
1826 ps=""
1827 fi
1828 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1829 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1830 fi
1831 fi
1832}
1833
1834
1835PrepareBootDiskImage_LILO() {
1836 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1837 imagesdir=$MINDI_CACHE
1838 kernelpath=$1
1839
1840 retval=0
1841
1842 old_pwd=`pwd`
1843 [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
1844 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1845 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?"
1846 echo -en "..."
1847 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1848 mountpoint=$MINDI_TMP/mountpoint.$$
1849 mkdir -p $mountpoint
1850 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1851 LogFile "Creating vfat filesystem on $imagefile"
1852 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1853 mount -t vfat -o loop $imagefile $mountpoint || LogAll "ERROR: Cannot mount (PBDI)"
1854
1855 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1856 mkdir -p $mountpoint/etc
1857 liloconf=$mountpoint/elilo.conf
1858
1859 MakeBootConfFile elilo > $liloconf
1860
1861 # Copy it so that CD-ROM menu entry is satisfied
1862 mountefi=0
1863 df -T | grep /boot/efi | grep -q vfat
1864 if [ $? -ne 0 ]; then
1865 mount /boot/efi
1866 if [ $? -ne 0 ]; then
1867 echo "You have to mount your EFI partition when using mindi"
1868 MindiExit -1
1869 fi
1870 mountefi=1
1871 fi
1872 el=`find /boot/efi -name elilo.efi`
1873 cp $el $mountpoint
1874 cp $liloconf $mountpoint
1875 if [ $mountefi -eq 1 ]; then
1876 umount /boot/efi 2>&1 > /dev/null
1877 fi
1878
1879 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
1880 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1881 if [ "$?" -ne "0" ] ; then
1882 LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1883 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1884 LogIt " Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1885 rm -f $MINDI_TMP/mtpt.$$
1886 LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1887 retval=$(($retval+1))
1888 fi
1889 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1890
1891 mkdir -p $mountpoint/tmp
1892 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1893 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1894 fi
1895
1896 # copy the kernel across
1897 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1898 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1899 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1900 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1901 if [ "$?" -ne "0" ] ; then
1902 LogFile "INFO: Files at mountpoint ($mountpoint) :"
1903 du -sk $mountpoint/* >> $LOGFILE
1904 LogFile "--- end of list of files ---"
1905 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
1906 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1907 cd "$old_pwd"
1908 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1909 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1910 # losetup /dev/loop0 -d
1911 [ "$imagefile" != "" ] && rm -f $imagefile
1912 LogIt "ERROR: Sorry, your kernel is too big for your image"
1913 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1914 return 0
1915 fi
1916 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1917 LogFile "INFO: Free space left on image = $free_space KB"
1918 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1919 # make it bootable
1920 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1921 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1922 if [ "$KERN_DISK_MADE" ] ; then
1923 LogFile "INFO: Not running LILO. It's not that kind of disk."
1924 fi
1925
1926 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1927 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1928 echo -en "..."
1929 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
1930 if [ "$retval" -eq "0" ] ; then
1931 echo -en "...$DONE\n"
1932 if [ "$KERN_DISK_MADE" ] ; then
1933 LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
1934 fi
1935 else
1936 echo -en "...failed\n"
1937 LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
1938 [ "$imagefile" != "" ] && rm -f $imagefile
1939 fi
1940 [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
1941 return $retval
1942}
1943
1944
1945PrepareBootDiskImage_ISOLINUX() {
1946 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage retval
1947 imagesdir=$MINDI_CACHE
1948 kernelpath=$1
1949 do_boot_root_thingy=""
1950 retval=0
1951
1952 old_pwd=`pwd`
1953 [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
1954 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1955 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?"
1956 echo -en "..."
1957 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1958 mountpoint=$MINDI_TMP/mountpoint.$$
1959 mkdir -p $mountpoint
1960 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1961 LogFile "INFO: Creating vfat filesystem on $imagefile"
1962 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1963 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
1964 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1965
1966 # Only move it now to its final destination and use it now
1967 mv $imagefile $imagesdir
1968 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1969
1970 mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
1971
1972 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1973 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
1974 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1975 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1976 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1977 if [ "$?" -ne "0" ] ; then
1978 LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1979 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1980 LogAll " Please unload some of your modules and try again."
1981 rm -f $MINDI_TMP/mtpt.$$
1982 LogAll " Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1983 LogAll " Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
1984 retval=$(($retval+1))
1985 fi
1986
1987 mkdir -p $mountpoint/tmp
1988 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1989 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1990 fi
1991
1992 # copy the kernel across
1993 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1994 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1995 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1996
1997 retval=0
1998 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1999 retval=$?
2000 if [ $KERNEL_IS_XEN = "yes" ]; then
2001 cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
2002 let retval+=$?
2003 fi
2004
2005 if [ "$retval" -ne "0" ] ; then
2006 LogFile "INFO: Files at mountpoint ($mountpoint) :"
2007 du -sk $mountpoint/* >> $LOGFILE
2008 LogFile "--- end of list of files ---"
2009 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
2010 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
2011 cd "$old_pwd"
2012 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2013 rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
2014
2015 LogIt "ERROR: Sorry, your kernel is too big for your image"
2016 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
2017 fi
2018 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
2019 LogFile "INFO: Free space left on image = $free_space KB"
2020 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
2021
2022 # make it bootable
2023 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
2024 mkdir -p $mountpoint/etc
2025 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
2026 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2027 echo -en "..."
2028 rmdir $mountpoint || LogAll "ERROR: Cannot rmdir (PBDI)"
2029
2030 if [ "$retval" -eq "0" ] ; then
2031 echo -en "...$DONE\n"
2032 if [ "$KERN_DISK_MADE" ] ; then
2033 [ "$imagefile" != "" ] && rm -f $imagefile
2034 LogAll "INFO: $BOOT_SIZE KB boot disks were created OK\n"
2035 fi
2036 else
2037 echo -en "...failed\n"
2038 LogAll "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
2039 [ "$imagefile" != "" ] && rm -f $imagefile
2040 fi
2041 [ "$retval" -ne "0" ] && LogAll "ERROR: PrepareBootDiskImage() is returning nonzero"
2042 return $retval
2043}
2044
2045
2046ParseModprobeForIncludes() {
2047local MODPROBE_CONF mpincfile includes include
2048
2049MODPROBE_CONF=/etc/modprobe.conf
2050mpincfile=$1
2051touch $mpincfile
2052if [ -a $MODPROBE_CONF ]; then
2053 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
2054 if [ -n "$includes" ]; then
2055 for include in $includes
2056 do
2057 if [ -a "$include" ]; then
2058 echo $include >> $mpincfile
2059 fi
2060 done
2061 fi
2062fi
2063}
2064
2065
2066PrepareDataDiskImages() {
2067 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
2068
2069 imagesdir=$MINDI_CACHE
2070 rm -f $imagesdir/mindi.iso
2071 needlist=$MINDI_TMP/what-we-need.txt
2072 bigdir=$MINDI_TMP/bigdir
2073 mkdir -p $bigdir/usr/bin
2074 mkdir -p $bigdir/usr/sbin
2075 includefile=$MINDI_TMP/$$.includefile.txt
2076
2077 lfiles=`ls $DEPLIST_DIR/* | grep -v /minimal`
2078 if [ -e "$DEPLIST_FILE" ]; then
2079 lfiles="$DEPLIST_FILE $lfiles"
2080 fi
2081 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
2082 ParseModprobeForIncludes $includefile
2083 lines=$(($lines+`cat $includefile | wc -l`))
2084 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
2085 res=$?
2086 rm -f $includefile
2087 if [ "$YOUR_KERNEL_SUCKS" ]; then
2088 pwd=`pwd`
2089 cd "$MINDI_TMP"
2090 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
2091 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
2092 done
2093 for i in $EXTRA_MODS ; do
2094 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2095 [ ! "$j" ] && LogFile "WARNING: cannot find failsafe module $i.o.gz"
2096 for k in $j ; do
2097 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2098 LogFile "INFO: Added failsafe module $k to ramdisk"
2099 done
2100 done
2101 cd "$pwd"
2102 else
2103 ListKernelModulePaths >> $needlist
2104 fi
2105 if [ "$res" -ne "0" ] ; then
2106 Die "You have $res files present in dependency list\nbut absent from filesystem."
2107 fi
2108 FindAndAddUserKeyboardMappingFile
2109 mkdir -p $bigdir/tmp
2110 if [ _"$MONDO_SHARE" != _"" ]; then
2111 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2112 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
2113 fi
2114 [ -d "/mnt/.boot.d" ] && echo "GENTOO" > $bigdir/tmp/DUMBASS-GENTOO
2115 DropOptimizedLibraries $needlist $bigdir
2116 echo -en "Assembling dependency files"
2117
2118 CopyDependenciesToDirectory < $needlist $bigdir `wc -l $needlist`
2119
2120 # also copy io.sys and msdos.sys, if we can find them
2121 for i in `mount | cut -d' ' -f3` ; do
2122 for j in io.sys msdos.sys ; do
2123 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
2124 done
2125 done
2126
2127 # master boot record, too
2128 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
2129 if [ "$i" ] ; then
2130 LogAll "INFO: Backing up $i's MBR"
2131 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2132 sleep 1
2133 sync
2134 j=$i
2135 [ -h "$j" ] && j=`readlink -f $j`
2136 LogAll "INFO: Creating /dev/boot_device ($j)"
2137 mkdir -p $bigdir/dev
2138 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
2139 fi
2140
2141 old_pwd=`pwd`
2142 cd "$bigdir"
2143
2144 # Get terminfo content
2145 ti="usr/share/terminfo/l"
2146 if [ -d /$ti ]; then
2147 mkdir -p $ti
2148 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "ERROR: issue copying terminfo"
2149 fi
2150 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
2151 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
2152 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
2153 fi
2154 if [ -d "/lib/dev-state" ]; then
2155 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2156 fi
2157 cd "$old_pwd"
2158 echo -e "$DONE"
2159 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
2160 MakeMountlist $MINDI_TMP/mountlist.txt
2161 CheckMountlist $MINDI_TMP/mountlist.txt
2162 mkdir -p $bigdir/tmp
2163 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
2164 if [ _"$MONDO_SHARE" != _"" ]; then
2165 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
2166 fi
2167 if [ $LVM != "false" ]; then
2168 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2169 if [ "$?" -ne "0" ]; then
2170 LVM="false"
2171 rm -f $bigdir/tmp/i-want-my-lvm
2172 else
2173 LogFile "Your i-want-my-lvm file content is:"
2174 LogFile "-----------------------------------"
2175 cat $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2176 LogFile "-----------------------------------"
2177 fi
2178 fi
2179 LogFile "Your mountlist.txt file content is:"
2180 LogFile "-----------------------------------"
2181 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
2182 LogFile "-----------------------------------"
2183
2184 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2185 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
2186 if [ _"$MONDO_SHARE" != _"" ]; then
2187 for q in filelist.full.gz biggielist.txt ; do
2188 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2189 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2190 done
2191 fi
2192
2193 echo -en "Tarring and zipping the data content..."
2194 size_of_all_tools=`du -sk $bigdir | cut -f1`
2195 (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)
2196 LogFile "Size of the data content"
2197 LogFile "------------------------"
2198 du -sk $imagesdir/*gz >> $LOGFILE
2199 LogFile "------------------------"
2200 echo -e "$DONE"
2201
2202 FRIENDLY_OUTSTRING="Boot and data disk images were created."
2203 rm -rf $bigdir
2204 rm -f $needlist
2205}
2206
2207
2208ProcessLDD() {
2209 local incoming f d nd bd bnd
2210 read incoming
2211 while [ "$incoming" != "" ]; do
2212 # We take the full path name of the dyn. lib. we want
2213 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2214 for f in $incoming ; do
2215 # echo modified file name if one of the parent dir is a link
2216 # by replacing the original dirname by the destination of the link
2217 d="`dirname $f`"
2218 found="false"
2219 while [ "$d" != "/" ]; do
2220 if [ -h "$d" ]; then
2221 nd=`readlink -f $d`
2222 bd=`basename $d`
2223 bnd=`basename $nd`
2224 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2225 echo $d
2226 fi
2227 d="`dirname $d`"
2228 done
2229
2230 echo "$f"
2231 echo "`ReadAllLink $f`"
2232 done
2233 read incoming
2234 done
2235}
2236
2237
2238Prompt() {
2239 echo -en "$1"
2240 read line
2241}
2242
2243
2244ReadLine() {
2245 local i incoming
2246 read incoming
2247 i=0
2248 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2249 i=$(($i+1))
2250 read incoming
2251 done
2252 echo "$incoming"
2253}
2254
2255
2256SizeOfPartition() {
2257 local devpath drive res stub
2258 device=$1
2259 if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2260 Die "Cannot find $device's size - is your /etc/fstab sane?"
2261 fi
2262 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2263 res=`SizeOfRaidPartition $device`
2264 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2265 echo "$res"
2266 return 0
2267 fi
2268 # patch from Bill <bill@iwizard.biz> - 2003/08/25
2269 res=`$FDISK -s $device 2>> $LOGFILE`
2270 # end patch
2271 # take only the first in case of multiple mount (cifs, nfs, ...)
2272 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2273 [ "$res" = "" ] && res="-1"
2274 echo $res
2275 return 0
2276}
2277
2278
2279SizeOfRaidPartition() {
2280 local real_dev smallest_size silly tmp
2281
2282 silly=999999999
2283 smallest_size=$silly
2284
2285 for real_dev in `GetRaidDevMembers $1` ; do
2286 tmp=`SizeOfPartition $real_dev`
2287 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2288 done
2289
2290 if [ "$smallest_size" = "$silly" ] ; then
2291 echo "-1"
2292 return 1
2293 else
2294 echo "$smallest_size"
2295 return 0
2296 fi
2297}
2298
2299
2300StripExecutable()
2301{
2302 local tmpfile
2303
2304 tmpfile=$MINDI_TMP/stripped.$$.dat
2305 [ -d "$1" ] || [ -h "$1" ] && return
2306 cp -f $1 $tmpfile 2>> $LOGFILE
2307 strip $tmpfile 2> /dev/null
2308 if [ "$?" -eq "0" ] ; then
2309 cp -f $tmpfile $1 2>> $LOGFILE
2310 LogFile "INFO: Stripped binary $2"
2311 fi
2312 rm -f $tmpfile
2313}
2314
2315KernelVer() {
2316 local fkern_ver fname
2317
2318 fname=$1
2319 file $fname | grep -q gzip
2320 if [ "$?" -eq "0" ] ; then
2321 # Used by ia64
2322 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2323 else
2324 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2325 fi
2326 echo "$fkern_ver"
2327}
2328
2329
2330# WARNING: This function should just echo the final result !!!
2331#
2332TryToFindKernelPath() {
2333 local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
2334
2335 we_want_version=$KERVERRUN
2336 possible_kernels=""
2337 duff_kernels=""
2338 output=""
2339
2340 if [ "$ARCH" = "ia64" ] ; then
2341 root="/boot/efi/efi"
2342 else
2343 root="/"
2344 fi
2345 # See if we're booted from a Xen kernel
2346 # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2347 if [ -f /proc/xen/capabilities ]; then
2348 # It's a Xen kernel
2349 KERNEL_IS_XEN="yes"
2350 LogFile "INFO: It's a Xen kernel..."
2351 fi
2352
2353 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
2354 [ ! -e "$fname" ] && continue
2355 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2356 fkern_ver=`KernelVer $fname`
2357 [ "$fkern_ver" = "" ] && continue
2358 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2359 [ -f "$fname" ] || continue
2360 [ -h "$fname" ] && continue
2361 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2362 file $fname | grep -q gzip
2363 if [ "$?" -eq "0" ] ; then
2364 # Used by ia64
2365 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2366 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2367 duff_kernels="$fname $duff_kernels"
2368 else
2369 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2370 possible_kernels="$fname $possible_kernels"
2371 fi
2372 else
2373 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2374 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2375 duff_kernels="$fname $duff_kernels"
2376 else
2377 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2378 possible_kernels="$fname $possible_kernels"
2379 fi
2380 fi
2381 done
2382 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2383 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2384 fi
2385 if [ ! "$possible_kernels" ] ; then
2386 LogAll "INFO: No kernel matches exactly. Are there any duff kernels?"
2387 possible_kernels="$duff_kernels"
2388 if [ ! "$possible_kernels" ] ; then
2389 LogAll "INFO: Sorry, no duff kernels either"
2390 else
2391 LogAll "INFO: I bet you're running Debian or Gentoo, aren't you?"
2392 LogAll "INFO: Your kernel doesn't have a sane builddate. Oh well..."
2393 fi
2394 fi
2395 if [ $KERNEL_IS_XEN = "yes" ]; then
2396 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2397 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2398 FindMboot32Binary
2399 fi
2400 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2401 noof_kernels=`CountItemsIn "$possible_kernels"`
2402 if [ "$noof_kernels" -eq "0" ] ; then
2403 LogAll "Could not find your kernel."
2404 if [ -e "/boot/vmlinuz" ] ; then
2405 LogAll "INFO: Using /boot/vmlinuz as a last resort."
2406 output=/boot/vmlinuz
2407 else
2408 output=""
2409 fi
2410 elif [ "$noof_kernels" -eq "1" ] ; then
2411 kp=`echo "$possible_kernels" | sed s/' '//`
2412 LogFile "INFO: Your kernel is $kp (v$KERVERRUN)"
2413 output="$kp"
2414 else
2415 for i in $possible_kernels ; do
2416 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2417 LogAll "INFO: OK, I used my initiative and found that "
2418 LogAll "INFO: $i is probably your kernel. "
2419 output="$i"
2420 break
2421 fi
2422 done
2423 if [ ! -n "$output" ]; then
2424 if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
2425 output=/boot/vmlinuz
2426 LogFile "INFO: Schlomo, this one's for you."
2427 else
2428 LogFile "INFO: Two or more possible kernels found. You may specify any one of them and the "
2429 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2430 LogFile "INFO: $possible_kernels"
2431 output=""
2432 fi
2433 fi
2434 fi
2435 if [ $KERNEL_IS_XEN = "yes" ]; then
2436 if [ "$noof_xenkernels" -eq "0" ]; then
2437 xenkernelpath=""
2438 elif [ "$noof_xenkernels" -eq "1" ]; then
2439 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
2440 LogFile "INFO: Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
2441 else
2442 for i in $possible_xenkernels ; do
2443 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2444 LogFile "INFO: OK, I used my initiative and found that "
2445 LogFile "INFO: $i is probably your Xen kernel. "
2446 xenkernelpath="$i"
2447 break
2448 fi
2449 done
2450 if [ ! -n "$xenkernelpath" ]; then
2451 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2452 if [ ! -n "$new_possible_xenkernels" ]; then
2453 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
2454 LogFile "INFO: Using $xenkernelpath"
2455 else
2456 LogFile "INFO: Two or more possible Xen kernels found. You may specify any one of them and the "
2457 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2458 LogFile "INFO: $possible_xenkernels"
2459 output=""
2460 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
2461 LogFile "INFO: Using $xenkernelpath"
2462 fi
2463 fi
2464 fi
2465 if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2466 Die "Cannot find Xen kernel $xenkernelpath, aborting"
2467 fi
2468 fi
2469 LogAll "TryToFindKernelPath found $output"
2470 echo "$output"
2471}
2472
2473
2474TurnTgzIntoRdz() {
2475 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2476
2477 tgz_dir_fname=$1
2478 rdz_fname=$2
2479 kernelsize=$3
2480 maxsize=$(($BOOT_SIZE-$kernelsize))
2481 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2482 tempfile=$MINDI_TMP/temp.rd
2483 mountpoint=$MINDI_TMP/mnt1
2484 res=0
2485 echo -en "..."
2486 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2487 echo -en "..."
2488 LogFile "INFO: Creating ext2 filesystem on $tempfile"
2489 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2490 echo -en "..."
2491 mkdir -p $mountpoint
2492 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."
2493 echo -en "..."
2494 old_pwd=`pwd`
2495 cd "$mountpoint"
2496
2497 # Check whether /lib64 or /lib is a link and if so explicitly create one in rootfs
2498 if [ -h "/lib64" ]; then
2499 mkdir -p lib || LogIt "ERROR: Unable to create lib in $mountpoint."
2500 ln -s lib lib64 || LogIt "ERROR: /lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2501 fi
2502 if [ -h "/lib" ]; then
2503 mkdir -p usr/lib || LogIt "ERROR: Unable to create usr/lib in $mountpoint."
2504 mv lib/* usr/lib
2505 rmdir lib
2506 fi
2507 # Check whether /sbin and /bin are a link and if so explicitly create one in rootfs (Fedora 17 crazyness)
2508 if [ -h "/sbin" ]; then
2509 mkdir -p usr/sbin || LogIt "ERROR: Unable to create usr/sbin in $mountpoint."
2510 mv sbin/* usr/sbin
2511 rmdir sbin
2512 fi
2513 if [ -h "/bin" ]; then
2514 mkdir -p usr/bin || LogIt "ERROR: Unable to create usr/bin in $mountpoint."
2515 mv bin/* usr/bin
2516 rmdir bin
2517 fi
2518
2519 # Check files before copying to discover configuration issues or McAfee preventing mindi reading these files
2520 for f in $tgz_dir_fname/*; do
2521 if [ ! -r $f ]; then
2522 Die "ERROR: Unable to copy $f to the target dir. Check your installation or McAfee presence"
2523 else
2524 cp -Rdf $f . 2>&1 >> $LOGFILE
2525 fi
2526 done
2527 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2528
2529 cd dev || Die "Can't cd to dev"
2530 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2531 rm -f dev-entries.tgz
2532 cd ..
2533
2534 for w in insmod.static insmod.static.old ; do
2535 s=`which $w 2> /dev/null`
2536 if [ -e "$s" ] ; then
2537 tar cf - -C / $s 2> /dev/null | tar xf -
2538 fi
2539 done
2540
2541 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2542
2543 # Copy of files mandatory for ssh to automate mount if sshfs is used
2544 mkdir $mountpoint/.ssh
2545 cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
2546 echo > $mountpoint/tmp/myssh << EOF
2547ssh -o StrictHostKeyChecking=no $*
2548EOF
2549 chmod 755 $mountpoint/tmp/myssh
2550
2551 # Copy of files mandatory for ld.so
2552 cp -rp /etc/ld.so.c* $mountpoint/etc
2553
2554 # Handle the case where busybox and mount are dynamically linked
2555 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2556 if [ $? -eq 0 ]; then
2557 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2558 rm -f bin/mount
2559 fi
2560
2561 # Copy of files from the minimal env needed as per the deplist.d/minimal.conf file (which includes all busybox deps)
2562 rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2563 for f in `grep -v " *#.*" $DEPLIST_DIR/minimal.conf | sort -u`; do
2564 if [ -r $f ]; then
2565 echo $f >> $MINDI_TMP/minimal.lis
2566 LocateDeps $f >> $MINDI_TMP/minimal2.lis
2567 fi
2568 done
2569 for f in `cat $MINDI_TMP/minimal.lis` `sort -u $MINDI_TMP/minimal2.lis`; do
2570 ReadAllLink $f >> $MINDI_TMP/minimal.lis
2571 done
2572 # Initial / are trucated by tar
2573 finallist=""
2574 # Remove directories from the list, as tar will create them anyway
2575 # and it may hurt if /lib is in it as on Debian/Ubuntu
2576 # recent bash says that -d is true for a link to a dir !
2577 for f in `sort -u $MINDI_TMP/minimal.lis`; do
2578 if [ -e $f -a ! -d $f ] || [ -h $f ]; then
2579 finallist="$finallist $f"
2580 fi
2581 done
2582 tar cf - $finallist 2>> $MINDI_TMP/$$.log | tar xUf - || LogIt "WARNING: Problem in minimal analysis" $MINDI_TMP/$$.log
2583
2584 # To improve support for distribution scripts, we now prefer to use bash as the std shell. Also fixes #600
2585 ln -sf /bin/bash bin/sh
2586 LogIt "INFO: Using bash as default shell"
2587 rm -f $MINDI_TMP/minimal.lis $MINDI_TMP/minimal2.lis
2588
2589 # Avoids an issue on some distro (RHEL5)
2590 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2591
2592 mkdir -p $mountpoint/tmp
2593 # Management of udev (which includes modprobe in rules)
2594 ps auxww | grep -v grep | grep -qw udevd
2595 if [ $? -eq 0 ]; then
2596 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2597 LogIt "INFO: udev device manager found"
2598 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2599 # This avoids NIC remapping if on another machine at restore time on Debian at least
2600 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2601 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2602 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2603 # Do not do it if it's a link (Ubuntu 64 bits #503)
2604 if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [ ! -h "/lib64/udev" ]; then
2605 tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
2606 fi
2607 if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [ ! -h "/lib32/udev" ]; then
2608 tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
2609 fi
2610 if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [ ! -h "/lib/udev" ]; then
2611 tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2612 fi
2613 if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
2614 lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
2615 lis=""
2616 # Get only the files which exist in that list
2617 # and potentially their symlink structure
2618 for i in $lis2; do
2619 if [ -h $i ]; then
2620 j=$i
2621 while [ -h $j ]; do
2622 lis="$lis $j"
2623 j=`readlink $j`
2624 done
2625 lis="$lis $j"
2626 elif [ -f $i ]; then
2627 lis="$lis $i"
2628 fi
2629 done
2630 # And their deps
2631 LocateDeps $lis > $MINDI_TMP/udev.lis
2632 for i in $lis; do
2633 if [ "`echo $i | cut -c1`" = "/" ]; then
2634 j=`echo $i | cut -c2-`
2635 [ "$j" != "" ] && rm -f $j
2636 fi
2637 done
2638 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
2639 rm -f $MINDI_TMP/udev.lis
2640 else
2641 LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
2642 LogAll " mindi will use static devices which may cause problems"
2643 rm -f $mountpoint/tmp/USE-UDEV
2644 fi
2645 fi
2646
2647 # Management of potential HW info (ProLiant only at the moment)
2648 rm -rf $MINDI_CACHE/bkphw
2649 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2650 if [ -d $MINDI_CACHE/bkphw ]; then
2651 LogIt "INFO: Hardware Information found and saved ..."
2652 cp -rp $MINDI_CACHE/bkphw .
2653 if [ -f $MINDI_CACHE/tools.files ]; then
2654 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2655 LocateDeps $lis > $MINDI_TMP/tools.lis
2656 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
2657 fi
2658 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2659 mv -f $MINDI_CACHE/mindi-rsthw .
2660 chmod 755 ./mindi-rsthw
2661 fi
2662 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2663 fi
2664
2665 # Management of perl scripts delivered needed at restore time
2666 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2667 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
2668
2669 for w in cdrom groovy-stuff ; do
2670 mkdir -p mnt/$w
2671 done
2672
2673 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
2674
2675 cd "$old_pwd"
2676 echo -en "..."
2677 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2678 cd "$MINDI_TMP"
2679 needed_modules_path=lib/modules/$FAILSAFE_KVER
2680 else
2681 cd /
2682 if [ "${kernelname}" != "" ]
2683 then
2684 needed_modules_path=lib/modules/${kernelname}
2685 else
2686 needed_modules_path=lib/modules/$KERVERRUN
2687 fi
2688 fi
2689
2690 needed_modules=""
2691 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2692
2693 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2694 # For PXE boot
2695 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2696 fi
2697 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2698 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2699 fi
2700 for i in $DENY_MODS; do
2701 LogFile "INFO: Removing $i from the list of modules to load"
2702 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2703 done
2704
2705 [ -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."
2706 for i in $list_of_groovy_mods ; do
2707 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2708 done
2709
2710 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
2711 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2712 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2713 LogFile "INFO: Adding $i ($s KB) to the rootfs"
2714 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2715 # Uncompress modules if not using udev and native modprobe
2716 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2717 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2718 LogFile "INFO: Uncompressing $i"
2719 gunzip -f $mountpoint/$i
2720 fi
2721 fi
2722 if [ -L $mountpoint/$i ] && [ `echo "$i" | grep "\.ko$"` ]; then
2723 echo "Replacing module symlink ($i) with actual file"
2724 rm -f $mountpoint/$i
2725 cp -Lf $i $mountpoint/$i
2726 ls -l $mountpoint/$i
2727 fi
2728 done
2729
2730 # Also copy modules.* in case of udev so that normal modprobe works
2731 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
2732
2733 # Copy FW in case some drivers needs it
2734 for d in "/lib" "/usr/lib"; do
2735 if [ -d "$d/firmware" ]; then
2736 cp -a "$d/firmware" "$mountpoint/$d"
2737 fi
2738 done
2739
2740 # Copy multipath dynamic libraries in case multipath is used (RHEL 6.4 and later)
2741 for d in "/lib" "/usr/lib" "/lib64" "/usr/lib64"; do
2742 if [ -d "$d/multipath" ]; then
2743 cp -a "$d/multipath" "$mountpoint/$d"
2744 fi
2745 done
2746
2747 # Copy an additional ProLiant tool for OBDR support
2748 if [ -f $MINDI_TMP/OBDR ]; then
2749 found=0
2750 if [ -x /usr/bin/hpsa_obdr_mode ]; then
2751 mkdir -p $mountpoint/usr/bin
2752 cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
2753 LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved Smart Array OBDR support"
2754 found=1
2755 fi
2756 if [ -x /usr/bin/sg_wr_mode ]; then
2757 mkdir -p $mountpoint/usr/bin
2758 lis="/usr/bin/sg_map /usr/bin/sg_inq /usr/bin/sg_reset /usr/bin/rev"
2759 LocateDeps $lis > $MINDI_TMP/obdr.lis
2760 (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)
2761 LogIt "INFO: Copying /usr/bin/sg_reset to ramdisk for improved SCSI OBDR support"
2762 found=1
2763 fi
2764 if [ $found -eq 0 ]; then
2765 LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode nor the /usr/bin/sg_wr_mode tool"
2766 LogAll " This may lead to a tape not going back to sequential mode after OBDR boot"
2767 fi
2768 fi
2769
2770 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2771 LogFile "INFO: Deleting devfsd daemon from ramdisk"
2772 [ ! -e "/sbin/devfsd" ] && LogFile " ...because /sbin/devfsd not found"
2773 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile " ...because kernel is failsafe"
2774 rm -f $mountpoint/sbin/devfsd
2775 fi
2776 cd "$old_pwd"
2777 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2778 if [ _"$MONDO_SHARE" != _"" ]; then
2779 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2780 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2781 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2782 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2783 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2784 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2785 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2786 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2787 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2788 fi
2789 mkdir -p $mountpoint/proc
2790 LogFile "---------------------------"
2791 LogFile "Content of initial ramdisk:"
2792 LogFile "---------------------------"
2793 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
2794 LogFile "---------------------------"
2795
2796 # Determine what filesystem to use for initrd image
2797 LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2798 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2799 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2800 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ] || [ "$gvFileSystem" = "ext4fs" ]; then
2801 # say what will be used
2802 LogFile "INFO: Creating an $gvFileSystem initrd image..."
2803 # kernel expects linuxrc in ext2 filesystem
2804 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
2805 # unmount loop filesystem and create image file using the standard approach
2806 umount $mountpoint || Die "Cannot unmount $tempfile"
2807 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2808 if [ "$gvFileSystem" = "ext4fs" ] && [ -x "/sbin/tune4fs" ]; then
2809 bs=`/sbin/tune4fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2810 else
2811 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2812 fi
2813 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2814 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2815 rm -f ${rdz_fname}.tmp
2816 # log that we are done
2817 LogFile " ...done."
2818 elif [ "$gvFileSystem" = "initramfs" ]; then
2819 # say what will be used
2820 LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2821 # make sure that cpio is there
2822 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2823 # go into filesystem
2824 cd "$mountpoint"
2825 # kernel expects init in cpio filesystem
2826 ln -sf sbin/init init
2827 # create cpio image file and unmount loop filesystem
2828 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2829 cd "$old_pwd"
2830 umount $mountpoint || Die "Cannot unmount $tempfile"
2831 # log that we are done
2832 LogFile " ...done."
2833 else
2834 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2835 fi
2836
2837 if [ "$res" -eq "0" ] ; then
2838 echo -en "..."
2839 else
2840 echo -en "\rMade an rdz WITH ERRORS. \n"
2841 fi
2842 return 0
2843}
2844
2845
2846##############################################################################
2847#----------------------------------- Main -----------------------------------#
2848##############################################################################
2849
2850# Now we can create what we need
2851mkdir -p $MINDI_TMP
2852
2853# Purge from potential old run
2854if [ _"$MINDI_CACHE" = _"" ]; then
2855 Die "MINDI_CACHE undefined"
2856fi
2857
2858# --nolog needs to be first, and is used in analyze-my-lvm
2859if [ "$1" = "--nolog" ] ; then
2860 shift
2861 LOGFILE=/dev/stderr
2862else
2863 > $LOGFILE
2864fi
2865if [ "$1" = "--printvar" ] ; then
2866 shift
2867 if [ _"$1" != _"" ] ; then
2868 set | grep -Ew "^$1" | cut -d= -f2
2869 fi
2870 exit 0
2871fi
2872
2873LogFile "mindi v$MINDI_VERSION"
2874LogFile "$ARCH architecture detected"
2875LogFile "mindi called with the following arguments:"
2876echo "$@">> $LOGFILE
2877LogFile "Start date : `date`"
2878LogFile "-----------------------------"
2879
2880[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && LogAll "/sbin/mkfs.vfat is missing!"
2881
2882# Log some capital variables
2883[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2884[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2885LogFile "MONDO_SHARE = $MONDO_SHARE"
2886LogFile "MINDI_LIB = $MINDI_LIB"
2887LogFile "MINDI_SBIN = $MINDI_SBIN"
2888LogFile "MINDI_CONF = $MINDI_CONF"
2889if [ -f $MINDI_CONFIG ]; then
2890 LogFile "-----------------------------"
2891 LogFile " Mindi configuration file "
2892 LogFile "-----------------------------"
2893 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2894 LogFile "-----------------------------"
2895fi
2896LogFile "In Mindi"
2897LogFile "--------"
2898LogFile "EXTRA_SPACE = $EXTRA_SPACE"
2899LogFile "BOOT_SIZE = $BOOT_SIZE"
2900LogFile "--------"
2901
2902trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2903
2904# Sanity checks
2905which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2906which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2907which 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."
2908which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2909if which awk &> /dev/null ; then
2910 if ! which gawk &> /dev/null ; then
2911 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"
2912 fi
2913fi
2914which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2915[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2916
2917[ "`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"
2918
2919# Update the PATH variable if incomplete
2920if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2921 PATH=$PATH:/sbin:/usr/sbin
2922 export PATH
2923 LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2924 LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2925 LogFile "INFO: Or you might like to call 'su -' instead of 'su', for example."
2926fi
2927
2928# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2929if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2930 source $MINDI_LIB/FindDistroFailsafe
2931 # Log kernel image
2932 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2933else
2934 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2935fi
2936
2937if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2938 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2939fi
2940
2941### TODO
2942### Fix as it's not mandatory on ia64
2943if [ "$ARCH" = "ia64" ] ; then
2944 if which elilo &> /dev/null ; then
2945 LILO_EXE=elilo
2946 else
2947 LILO_EXE=`which false 2> /dev/null`
2948 fi
2949else
2950 FindIsolinuxBinary
2951fi
2952trap "Aborted" SIGTERM
2953DONE="\r\t\t\t\t\t\t\t\tDone. "
2954kernelpath=""
2955MONDO_ROOT=/var/cache/mondo
2956mkdir -p $MONDO_ROOT
2957
2958if [ -d "/proc/lvm" ]; then
2959 # LVM v1
2960 LVMCMD=""
2961 LVM="v1"
2962elif [ -d "/dev/mapper" ]; then
2963 # LVM v2
2964 LVMCMD="lvm"
2965 LVM="v2"
2966else
2967 LVM="false"
2968fi
2969
2970if [ -e "/proc/cmdline" ]; then
2971 CMDLINE="/proc/cmdline"
2972elif [ -e "/tmp/cmdline" ]; then
2973 CMDLINE="/tmp/cmdline"
2974else
2975 CMDLINE="/dev/null"
2976fi
2977
2978LogFile "INFO: LVM set to $LVM"
2979LogFile "----------"
2980LogFile "mount result:"
2981LogFile "-------------"
2982mount >> $LOGFILE
2983if [ -e /etc/raidtab ]; then
2984 LogFile "-------------"
2985 LogFile "/etc/raidtab content:"
2986 LogFile "-------------"
2987 cat /etc/raidtab >> $LOGFILE
2988else
2989 LogFile "No file /etc/raidtab"
2990fi
2991if [ -e /etc/mdadm.conf ]; then
2992 LogFile "-------------"
2993 LogFile "/etc/mdadm.conf content:"
2994 LogFile "-------------"
2995 cat /etc/mdadm.conf >> $LOGFILE
2996else
2997 LogFile "-------------"
2998 LogFile "No file /etc/mdadm.conf"
2999fi
3000LogFile "-------------"
3001LogFile "cat $CMDLINE"
3002LogFile "-------------"
3003cat $CMDLINE >> $LOGFILE
3004LogFile "-------------"
3005LogFile "cat /proc/swaps:"
3006LogFile "-------------"
3007cat /proc/swaps >> $LOGFILE
3008LogFile "-------------"
3009if [ -e /proc/mdstat ]; then
3010 LogFile "cat /proc/mdstat:"
3011 LogFile "-------------"
3012 cat /proc/mdstat >> $LOGFILE
3013else
3014 LogFile "No pseudo file /proc/mdstat"
3015fi
3016LogFile "-------------"
3017LogFile "cat /proc/partitions:"
3018LogFile "-------------"
3019cat /proc/partitions >> $LOGFILE
3020LogFile "-------------"
3021LogFile "cat /proc/filesystems:"
3022LogFile "-------------"
3023cat /proc/filesystems >> $LOGFILE
3024LogFile "-------------"
3025LogFile "lsmod result:"
3026LogFile "-------------"
3027lsmod >> $LOGFILE
3028MODULES="`cat /proc/modules | $AWK '{print $1}'`"
3029if [ -x /usr/sbin/esxcfg-module ]; then
3030 LogFile "-------------"
3031 LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
3032 LogFile "-------------"
3033 LogFile "VMWare modules"
3034 LogFile "-------------"
3035 /usr/sbin/esxcfg-module -l >> $LOGFILE
3036 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
3037fi
3038LogFile "Liste of extra modules is:"
3039LogFile "-------------"
3040LogFile "$EXTRA_MODS"
3041LogFile "-------------"
3042LogFile "FORCE_MODS:"
3043LogFile "-------------"
3044LogFile "$FORCE_MODS"
3045LogFile "-------------"
3046LogFile "DENY_MODS:"
3047LogFile "-------------"
3048LogFile "$DENY_MODS"
3049LogFile "-------------"
3050LogFile "df result:"
3051LogFile "----------"
3052df -aT >> $LOGFILE
3053LogFile "-------------"
3054LogFile "df -i result:"
3055LogFile "----------"
3056df -i >> $LOGFILE
3057LogFile "-------------"
3058if [ -r /boot/grub/menu.lst ]; then
3059 LogFile "-------------"
3060 LogFile "INFO: /boot/grub/menu.lst content"
3061 LogFile "-------------"
3062 cat /boot/grub/menu.lst >> $LOGFILE
3063 LogFile "-------------"
3064fi
3065if [ -r /boot/grub/grub.conf ]; then
3066 LogFile "-------------"
3067 LogFile "INFO: /boot/grub/grub.conf content"
3068 LogFile "-------------"
3069 cat /boot/grub/grub.conf >> $LOGFILE
3070 LogFile "-------------"
3071fi
3072if [ -r /boot/grub/grub.cfg ]; then
3073 LogFile "-------------"
3074 LogFile "INFO: /boot/grub/grub.cfg content"
3075 LogFile "-------------"
3076 cat /boot/grub/grub.cfg >> $LOGFILE
3077 LogFile "-------------"
3078fi
3079if [ -r /boot/grub/device.map ]; then
3080 LogFile "-------------"
3081 LogFile "INFO: /boot/grub/device.map content"
3082 LogFile "-------------"
3083 cat /boot/grub/device.map >> $LOGFILE
3084 LogFile "-------------"
3085fi
3086if [ -r /etc/lilo.conf ]; then
3087 LogFile "-------------"
3088 LogFile "INFO: /etc/lilo.conf content"
3089 LogFile "-------------"
3090 cat /etc/lilo.conf >> $LOGFILE
3091fi
3092LogFile "Full fdisk info"
3093LogFile "---------------"
3094$FDISK -l >> $LOGFILE
3095LogFile "----------------"
3096LogFile "List of extra modules is:"
3097LogFile "$EXTRA_MODS"
3098LogFile "-------------"
3099
3100# Compute libata version
3101laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
3102# If libata v2 is used then remove ide-generic as it will perturbate boot
3103if [ "`echo $MODULES | grep libata`" ]; then
3104 if [ "$laver" = "2" ]; then
3105 DENY_MODS="$DENY_MODS ide-generic"
3106 LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
3107 LogFile "-------------"
3108 fi
3109fi
3110
3111# Check for McAfee which disturbs the access to some files (tgz in articular)
3112if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
3113 LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
3114 LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
3115 LogFile "WARNING: You have two options:"
3116 LogFile "WARNING: - Exclude all directories with special files (check McAfee System Events Log)"
3117 LogFile "WARNING: - Disable the scanner during the backup"
3118fi
3119
3120# Check for ISO_CMD command
3121if [ ! -x $ISO_CMD ]; then
3122 LogFile "NOTE: No CD image (ISO file) utility found"
3123fi
3124
3125FLOPPY_WAS_MOUNTED=""
3126for mtpt in /media/floppy /mnt/floppy /floppy ; do
3127 if mount | grep -w $mtpt &> /dev/null ; then
3128 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3129 umount $mtpt
3130 fi
3131done
3132
3133#
3134# If we have a USB device we need to store info
3135# and remove it from the parameters line
3136#
3137if [ "$#" -ne "0" ] ; then
3138 if [ "$1" = "--usb" ] ; then
3139 shift
3140 USBDEVICE=$1
3141 if [ _"$USBDEVICE" = _"" ]; then
3142 Die "No USB device specified"
3143 fi
3144 shift
3145 fi
3146fi
3147
3148if [ "$#" -ne "0" ] ; then
3149 if [ "$1" = "--findkernel" ] ; then
3150 resk=`TryToFindKernelPath`
3151 # Avoids logfile content for mondo
3152 export MONDO_SHARE=""
3153 if [ "$resk" = "" ] ; then
3154 if [ $KERNEL_IS_XEN = "yes" ]; then
3155 echo "$xenkernelpath"
3156 LogFile "INFO: xenkernelpath = $xenkernelpath"
3157 MindiExit 0
3158 else
3159 MindiExit -1
3160 fi
3161 else
3162 echo "$resk"
3163 LogFile "INFO: kernelpath = $resk"
3164 MindiExit 0
3165 fi
3166 elif [ "$1" = "--locatedeps" ] ; then
3167 [ ! "$2" ] && Die "Please specify the binary to look at"
3168 LocateDeps $*
3169 # Avoids logfile content for mondo
3170 export MONDO_SHARE=""
3171 MindiExit $?
3172 elif [ "$1" = "--readalllink" ] ; then
3173 [ ! "$2" ] && Die "Please specify the binary to look at"
3174 # Avoids logfile content for mondo
3175 export MONDO_SHARE=""
3176 ReadAllLink $2
3177 MindiExit $?
3178 elif [ "$1" = "--makemessage" ] ; then
3179 MakeMessageFile | cut -c1-80
3180 MindiExit 0
3181 elif [ "$1" = "--makemountlist" ] ; then
3182 [ ! "$2" ] && Die "Please specify the output file"
3183 MakeMountlist $2
3184 CheckMountlist $2
3185 # Avoids logfile content for mondo
3186 export MONDO_SHARE=""
3187 MindiExit $?
3188 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3189 echo "Mindi v$MINDI_VERSION"
3190 # Avoids logfile content for mondo
3191 export MONDO_SHARE=""
3192 MindiExit 0
3193 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
3194 MONDO_TMP=$2
3195 # Change MINDI_TMP for the one provided by mondo
3196 # So that it can get back the built files
3197 if [ _"$MONDO_TMP" = _"" ]; then
3198 Die "MONDO_TMP is empty, aborting"
3199 fi
3200 if [ _"$MONDO_TMP" = _"/" ]; then
3201 Die "MONDO_TMP is /, aborting"
3202 fi
3203 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
3204 rmdir $MINDI_TMP
3205 export MINDI_TMP=$MONDO_TMP
3206 mkdir -p $MINDI_TMP
3207
3208 # This is the scratch dir in mondo - subdir images
3209 MINDI_CACHE=$3
3210
3211 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
3212 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3213
3214###
3215### Sq-Modification...
3216### Attempt to locate kernel specific module path
3217### if module path is found then use it other wise use uname -r to set it...
3218###
3219 if [ $KERNEL_IS_XEN = "yes" ]; then
3220 LogAll "INFO: xenkernelpath = $xenkernelpath"
3221 fi
3222 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
3223 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3224 then
3225 LogAll "WARNING: Module path for ${kernelpath} not found..."
3226 LogAll " using running kernel\'s modules."
3227 kernelname=$KERVERRUN
3228 else
3229 LogAll "Using modules for kernel: ${kernelname}"
3230 fi
3231 LogAll "INFO: kernelname = $kernelname"
3232 LogAll "INFO: kernelpath = $kernelpath"
3233###
3234### end of Sq-Modification
3235###
3236 TAPEDEV=$5
3237 TAPESIZE=$6
3238 FILES_IN_FILELIST=$7
3239 USE_LZO=$8
3240 CDRECOVERY=$9
3241 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3242 IMAGE_DEVS=""
3243 else
3244 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3245 fi
3246 if [ "${11}" ] ; then
3247 LILO_OPTIONS=""
3248 # LogAll "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
3249 fi
3250 LAST_FILELIST_NUMBER=${12}
3251 ESTIMATED_TOTAL_NOOF_SLICES=${13}
3252 export MINDI_EXCLUDE_DEVS="${14}"
3253 USE_COMP="${15}"
3254 USE_LILO="${16}"
3255 USE_STAR="${17}"
3256 INTERNAL_TAPE_BLOCK_SIZE="${18}"
3257 DIFFERENTIAL="${19}"
3258 USE_GZIP="${20}"
3259 NOT_BOOT="${21}"
3260 [ "$USE_COMP" = "" ] && USE_COMP=yes
3261 [ "$USE_GZIP" = "" ] && USE_GZIP=no
3262 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
3263 [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
3264 # MONDO_ROOT is the real scratchdir
3265 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
3266 if [ _"$MONDO_ROOT" != _"" ]; then
3267 mkdir -p $MONDO_ROOT
3268 else
3269 Die "MONDO_ROOT is undefined"
3270 fi
3271 else
3272 LogScreen "Syntax: mindi (--custom ....)"
3273 MindiExit -1
3274 fi
3275fi
3276
3277if [ _"$MINDI_CACHE" != _"" ]; then
3278 rm -rf $MINDI_CACHE/* 2> /dev/null
3279 mkdir -p $MINDI_CACHE
3280fi
3281
3282[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3283
3284if [ _"$MONDO_SHARE" = _"" ]; then
3285 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3286 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3287 LogIt "BusyBox sources are available from http://www.busybox.net"
3288 LogIt "------------------------------------------------------------------------------"
3289else
3290 LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
3291fi
3292if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3293 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3294else
3295 LogIt "ERROR: Unable to find mindi-busybox, please install it"
3296 MindiExit -1
3297fi
3298
3299for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
3300 modinfo $i 2> /dev/null 1> /dev/null
3301 if [ $? -eq 0 ]; then
3302 modprobe $i 2>&1 > /dev/null
3303 fi
3304done
3305
3306KERN_DISK_MADE=""
3307
3308LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3309LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3310LogFile "NOT_BOOT = '$NOT_BOOT'"
3311if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
3312 LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
3313 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3314 MakeMountlist $MINDI_TMP/mountlist.txt
3315 CheckMountlist $MINDI_TMP/mountlist.txt
3316 mkdir -p $MINDI_TMP/small-all/tmp
3317 cd "$MINDI_TMP/small-all"
3318 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
3319 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
3320 sleep 2
3321 LogIt "Done. Exiting."
3322 MindiExit 0
3323fi
3324
3325if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3326 LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
3327fi
3328
3329if [ "$kernelpath" = "" ] ; then
3330 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
3331 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3332 read ch
3333 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3334 USE_OWN_KERNEL="yes"
3335 else
3336 USE_OWN_KERNEL="no"
3337 fi
3338 if [ "$USE_OWN_KERNEL" = "yes" ]; then
3339 YOUR_KERNEL_SUCKS=""
3340 kernelpath=`TryToFindKernelPath`
3341 if [ "$kernelpath" = "" ] ; then
3342 echo -n "Please enter kernel path : "
3343 read kernelpath
3344 fi
3345 else
3346 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
3347 fi
3348fi
3349if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
3350 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3351 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3352 source $MINDI_LIB/FindDistroFailsafe
3353 # Log kernel image
3354 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3355 kernelpath="$FAILSAFE_KBIN"
3356 LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3357 LogIt " The failsafe kernel is $kernelpath."
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 mkdir -p lib/modules
3363 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
3364 cd "$pwd"
3365 else
3366 kernelpath=$MINDI_LIB/vmlinuz
3367 LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3368 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3369 LogIt " disks then it may still be a result of a problem with your kernel."
3370 pwd=`pwd`
3371 cd "$MINDI_TMP"
3372 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
3373 cd "$pwd"
3374 fi
3375 YOUR_KERNEL_SUCKS="Your kernel sucks"
3376fi
3377echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
3378[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
3379
3380[ "$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."
3381
3382PrepareDataDiskImages
3383
3384ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3385rds=$(($ramdisk_size-$((ramdisk_size%4096))))
3386export ramdisk_size=$rds
3387
3388LogFile "INFO: Ramdisk will be $ramdisk_size KB"
3389if [ "$ARCH" = "ia64" ] ; then
3390 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
3391else
3392 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size KB disk image."
3393fi
3394
3395[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3396...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3397
3398if [ _"$MONDO_SHARE" = _"" ]; then
3399 ListImagesForUser
3400 OfferToMakeBootableISO
3401 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
3402 OfferToMakeBootableUSB
3403 fi
3404 LogAll "Finished."
3405elif [ "$TAPEDEV" ] ; then
3406 if [ "$ARCH" != "ia64" ] ; then
3407 # We need to keep the img file as boot file for ia64 platform
3408 rm -f $MINDI_CACHE/{*img,*iso}
3409 else
3410 rm -f $MINDI_CACHE/*iso
3411 fi
3412 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3413 OfferToMakeBootableUSB
3414 fi
3415 OfferToMakeBootableISO
3416 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3417 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
3418 else
3419 Die "Cannot find all.tar.gz, to be written to tape"
3420 fi
3421elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
3422 OfferToMakeBootableUSB
3423else
3424 OfferToMakeBootableISO
3425fi
3426# cleanup
3427LogAll "INFO: $FRIENDLY_OUTSTRING"
3428for mtpt in $FLOPPY_WAS_MOUNTED ; do
3429 mount $mtpt
3430done
3431MindiExit 0
Note: See TracBrowser for help on using the repository browser.