source: MondoRescue/branches/2.2.9/mindi/mindi@ 2838

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