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

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