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

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