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

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