source: MondoRescue/branches/2.2.10/mindi/mindi@ 2341

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