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

Last change on this file since 3059 was 3059, checked in by Bruno Cornec, 11 years ago

r5032@localhost: bruno | 2012-11-08 23:24:32 +0100

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