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

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