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

Last change on this file since 2395 was 2395, checked in by Bruno Cornec, 15 years ago
  • Fix interface of evaluate_mountlist (remove 2nd param useless) and fix nuke mode which wasn't working.
  • Tries to add support for bzip2 and lzma initramfs (preliminary, not tested) for 2.6.30

(Backport from 2.2.9)

  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 103.7 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2395 2009-09-12 00:57:02Z 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 fuse"
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"
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/NETFS-DEV" ] ; then
568 LogAll "\nIncorporating NFS-related settings"
569 for r in NETFS-* 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 lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
636 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
637initramfs"
638
639 # local variables
640 local lvOffset
641 local lvScanRes
642 local lvUseFilesystem
643
644 # say where we are.
645 LogFile " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage.\n"
646
647 # verify that file exists
648 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
649
650 # Kernel may be gzip compressed
651 file $lvKernelImage 2>&1 | grep -q gzip
652 if [ $? -eq 0 ]; then
653 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
654 else
655 # Since 2.6.30 kernel can use lzma and bzip2 in addition to gzip for initramfs compression
656 # get offet of gzip magic "1f8b0800" in file (or 1f8b9e ??)
657 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "1f8b0800")}'`
658 if [ $lvOffset -eq 0 ]; then
659 # get offet of bzip2 magic "425a" in file
660 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "425a")}'`
661 if [ $lvOffset -eq 0 ]; then
662 # get offet of lzma magic "5d00" in file
663 lvOffset=`od -vA n -t x1 $lvKernelImage | tr -d '[:space:]' | awk '{ print match($0, "5d00")}'`
664 if [ $lvOffset -eq 0 ]; then
665 Die "No magic compression pattern found in file $lvKernelImage. Terminating."
666 else
667 comp="lzma"
668 fi
669 else
670 comp="bzip2"
671 fi
672 else
673 comp="gzip"
674 fi
675
676 lvOffset=`expr $lvOffset / 2`
677 LogFile " GetInitrdFilesystemToUse(): $comp magic found in $lvKernelImage at lvOffset $lvOffset.\n"
678
679 # scan kernel image for initrd filessystem support
680 lvScanRes=`dd ibs=1 skip=$lvOffset if=$lvKernelImage obs=1M 2>/dev/null | $comp -dc 2> /dev/null | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
681 fi
682
683 # determine which filesystem to use for initrd image: ext2fs, gzip'ed cpio (initramfs ) or cramfs
684 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
685 lvUseFilesystem="ext2fs"
686 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
687 lvUseFilesystem="ext3fs"
688 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
689 lvUseFilesystem="initramfs"
690 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
691 lvUseFilesystem="cramfs"
692 else
693 lvUseFilesystem="UNSUPPORTED"
694 fi
695
696 # say what we are using
697 LogFile " GetInitrdFilesystemToUse(): Filesytem to use for initrd is $lvUseFilesystem.\n"
698
699 # return file system to use
700 echo "$lvUseFilesystem"
701
702}
703
704# Searches parent raid device of given disk device
705# $1: disk device (i.e. /dev/hda1)
706GetParentRaidDev() {
707 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
708}
709
710
711# Searches members of raid device
712# $1: raid device (/dev/md...)
713GetRaidDevMembers() {
714 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
715}
716
717
718HackPathsToFailsafe() {
719 local incoming newpath stub i pwd
720 incoming=`ReadLine`
721 pwd=`pwd`
722 cd $MINDI_TMP
723 while [ "$incoming" != "" ] ; do
724 stub=`basename $incoming`
725 newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
726 for i in $newpath ; do
727 echo "$i"
728 done
729 read incoming
730 done
731 cd $pwd
732}
733
734
735ListAllPartitions() {
736 local res currline partition all_partitions ap_orig remaining i j
737
738 grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
739 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
740 if [ -e "/vmfs/volumes" ]; then
741 # For VMWare ESX 3 get the device names of these volumes
742 vdf -P | grep -E '/vmfs/volumes' | awk '{print $1}'
743 fi
744 return
745}
746
747
748ListImagesForUser() {
749 local path fname
750 path=$MINDI_CACHE
751 echo -en "In the directory '$path' you will find the images:-\n"
752 for fname in `ls $path | grep -F mindi-` ; do
753 printf "%19s " $fname
754 done
755 echo " "
756}
757
758
759ListKernelModulePaths() {
760 local module_list module fname oss r kern
761 oss="/root/oss/modules"
762 module_list="$MODULES"
763 # Remove unwanted modules from list
764 for i in $DENY_MODS; do
765 module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
766 EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
767 done
768###
769### Sq-Modification ... Use kernelname for module search path if specified
770###
771 if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
772 then
773 kern=${kernelname}
774 else
775 kern="$KERVERRUN"
776 fi
777 export KERVER=$kern
778###
779### Sq-Mod End
780###
781 for module in $module_list $EXTRA_MODS ; do
782 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
783 LogFile "module $module --> $r"
784 [ "$r" ] && echo "$r"
785 [ -f "$oss" ] && find $oss | grep -F $module
786 done
787 find /lib/modules/$kern/modules.* -type f 2> /dev/null
788 [ -f "$oss" ] && find $oss.* 2> /dev/null
789}
790
791#
792# Critical function which computes all dependencies (dyn. lib.)
793# for a list of binaries
794#
795LocateDeps() {
796 local incoming fname deps
797 incoming="$*"
798 for fname in $incoming ; do
799 if [ ! -e "$fname" ] ; then
800 LogFile "WARNING - $fname does not exist; cannot be LDD'd."
801 if echo $fname | grep lvm &> /dev/null ; then
802 LogFile "This warning only affects you if you are using LVM."
803 if echo "$MODULES" | grep lvm &> /dev/null ; then
804 LogFile "I think you are, so please take heed!"
805 else
806 LogFile "I don't think you are, so don't worry about it."
807 fi
808 fi
809 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
810 LogFile "$fname is softlink"
811 else
812 ldd $fname 2> /dev/null | ProcessLDD
813 fi
814 done
815}
816
817
818# Give all symlinks recursively of a full path name
819ReadAllLink() {
820 file="$1"
821
822 echo $file | grep -q '\.\./'
823 if [ $? -eq 0 ]; then
824 # We need to normalise the path with .. in it
825 file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
826 fi
827 echo "$file"
828 if [ ! -h $file ]; then
829 return 0
830 fi
831
832 link=`readlink $file`
833 d=`dirname $file`
834 fchar=`echo $link | cut -c1`
835 # If mother dir is a link print it
836 if [ -h "$d" ]; then
837 echo "$d"
838 d=`readlink $d`
839 fi
840 if [ "$fchar" != "/" ]; then
841 # Relative or local link
842 ReadAllLink "$d/$link"
843 else
844 # Absolute path
845 ReadAllLink $link
846 fi
847}
848
849
850LocateFile() {
851 local i path fname_to_find location output resolved tmp stub cache_id loclist
852 fname_to_find="$1"
853 # It's an absolute path
854 if echo "$fname_to_find" | grep -x "/.*" ; then
855 output="$fname_to_find"
856 if [ -h "$output" ] ; then
857 output="`ReadAllLink $output` $output"
858 fi
859 echo "$output"
860 return 0
861 fi
862 # It's not an absolute path
863 output=""
864 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
865 #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
866 [ -h "$path" ] && continue
867 [ ! -e "$path/$fname_to_find" ] && continue
868 output="$path/$fname_to_find $output"
869 if [ -h "$path/$fname_to_find" ] ; then
870 output="`ReadAllLink $path/$fname_to_find` $output"
871 fi
872 done
873 if [ "$output" = "" ] ; then
874 return 1
875 fi
876 echo "$output"
877 return 0
878}
879
880LogProgress() {
881 local i progress modres noof_lines
882
883 progress=$1
884 noof_lines=$2
885
886 echo -en "\r\t\t\t\t\t\t\t\t"
887 i=$(($progress*100))
888 i=$(($i/$noof_lines))
889 echo -en "$i"
890 echo -en "%"
891 modres=$(($progress%4))
892 [ "$modres" -eq "0" ] && echo -en "\t/"
893 [ "$modres" -eq "1" ] && echo -en "\t-"
894 [ "$modres" -eq "2" ] && echo -en "\t\\"
895 [ "$modres" -eq "3" ] && echo -en "\t|"
896}
897
898# Function to log on screen only
899LogScreen() {
900 if [ -e /dev/stderr ] ; then
901 echo -e "$1" >> /dev/stderr
902 elif [ -e /usr/bin/logger ] ; then
903 /usr/bin/logger -s $1
904 fi
905}
906
907# Function to log in log file only
908LogFile() {
909
910 echo -e "$1" >> $LOGFILE
911 if [ _"$2" != _"" ]; then
912 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
913 fi
914 rm -f "$2"
915}
916
917# Function to log in both screen and logfile
918LogAll() {
919 LogScreen "$1"
920 LogFile "$1" "$2"
921}
922
923
924# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
925MakeMondoConfigFile() {
926 local outfile use_lzo use_comp use_star
927 outfile=$1
928 > $outfile
929 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
930 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
931 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
932 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
933 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
934 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
935 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
936 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
937 use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
938 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
939 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
940 echo "use-lzo $use_lzo" >> $outfile
941 echo "use-lzma $use_lzma" >> $outfile
942 echo "use-star $use_star" >> $outfile
943 echo "use-comp $use_comp" >> $outfile
944 echo "datestamp `date`" >> $outfile
945 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
946 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
947 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
948 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
949 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
950 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
951 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
952 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
953 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
954 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
955 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
956 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
957 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
958 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
959 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
960 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
961 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
962 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
963 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
964 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
965 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
966 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
967 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
968}
969
970
971MakeMountlist() {
972 local scratchdir mountlist all_partitions current_partition \
973partition_size partition_format outstring partition_number \
974partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
975absolute_partition old_partition_fmt current_lvolume uname skip
976
977 LogFile "Your raw fstab file looks like this:"
978 LogFile "------------------------------------"
979 cat $MY_FSTAB >> $LOGFILE
980 LogAll "Your mountlist will look like this:"
981 LogAll "-----------------------------------"
982
983# scratchdir, mountlist(OUT)
984 scratchdir=$MINDI_TMP
985 mountlist=$1
986
987# NB: partition = device
988# NB: mountpt = where the device is mounted
989
990 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
991
992 [ "$mountlist" != "" ] && rm -Rf $mountlist
993 > $mountlist
994 all_partitions=""
995
996 if [ $LVM != "false" ]; then
997 echo -en "Analyzing LVM...\n"
998 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
999 if [ $? -ne 0 ]; then
1000 LVM="false"
1001 fi
1002 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-32`
1003 fi
1004 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1005# echo "all partitions = $all_partitions" > /dev/stderr
1006 for i in $IMAGE_DEVS ; do
1007 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1008 done
1009 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
1010 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
1011 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"
1012 for c_p in $all_partitions ; do
1013 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] && continue
1014 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1015 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
1016 current_partition=`readlink -f $c_p`
1017 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1018 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1019 else
1020 current_partition="$c_p"
1021 fi
1022 [ "$c_p" = "none" ] && continue
1023 # Debian 5 does that
1024 [ "$c_p" = "proc" ] && continue
1025 redhat_label=""
1026 label=""
1027 uuid=""
1028 absolute_partition=`readlink -f $c_p`
1029 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1030
1031 # Detects noauto partitions not mounted and exclude them
1032 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1033 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1034 continue
1035 fi
1036
1037 # set default in case we dont't find it
1038 str_to_find_fmt_with=$current_partition
1039
1040 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1041 # current_partition contains only first column of /etc/fstab
1042 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1043 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1044 actual_dev=""
1045
1046 # 1st try, findfs - the RHEL way of finding labels and their partitions
1047 if [ -x "/sbin/findfs" ]; then
1048 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1049 fi
1050
1051 # 2nd try : blkid, the good way for all LABEL except swap
1052 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1053 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1054 # For LVM FS it will give a /dev/dm-# which should then be converted
1055 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1056 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1057 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1058 for dev in `ls /dev/mapper/*`; do
1059 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1060 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1061 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1062 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1063 break
1064 fi
1065 done
1066 fi
1067 fi
1068
1069 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1070 # For LVM gives a /dev/mapper entry
1071 if [ "x$actual_dev" = "x" ]; then
1072 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1073 fi
1074
1075 # 4th try, with vol_id
1076 # SWAP only
1077 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1078 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1079 for dev_swap in $list_swaps ; do
1080 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1081 if [ "x$dev_exists" != "x" ]; then
1082 actual_dev=$dev_swap
1083 break;
1084 fi
1085 done
1086 fi
1087
1088 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1089 # LABEL=SW-cciss/c0d0p3 (RDP)
1090 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1091 # SWAP only
1092 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1093 skip=""
1094 uname=$KERVERRUN
1095 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1096 # 2.6.12 needs 16 (FC3)
1097 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1098 # 2.6.19 and upper needs 1052
1099 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1100 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1101 if [ $skip = "" ]; then
1102 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1103 fi
1104 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1105 do
1106 # Location of the swap label for kernel 2.6
1107 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1108 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1109 actual_dev=$try_dev
1110 fi
1111 done
1112 fi
1113
1114 # Check if one of all those tries has known success
1115 if [ "x$actual_dev" != "x" ]; then
1116 current_partition=$actual_dev
1117 else
1118 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"
1119 fi
1120 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1121 # current_partition contains only first column of /etc/fstab
1122 elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1123 uuid=`echo "$current_partition" | cut -d'=' -f2`
1124 actual_dev=""
1125
1126 # 1st try, findfs - the RHEL way of finding labels and their partitions
1127 if [ -x "/sbin/findfs" ]; then
1128 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1129 fi
1130
1131 # 2nd try : blkid, the good way for all UUID except swap
1132 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1133 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1134 # For LVM FS it will give a /dev/dm-# which should then be converted
1135 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1136 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1137 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1138 for dev in `ls /dev/mapper/*`; do
1139 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1140 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1141 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1142 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1143 break
1144 fi
1145 done
1146 fi
1147 fi
1148
1149 # 3th try, with vol_id
1150 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1151 list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1152 for dev in $list_dev ; do
1153 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1154 if [ "x$dev_exists" != "x" ]; then
1155 actual_dev=$dev
1156 break;
1157 fi
1158 done
1159 fi
1160
1161 # 4th try, with dumpuuid (VMWare only ?) for swap
1162 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1163 list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1164 for dev in $list_dev ; do
1165 dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1166 if [ "x$dev_exists" != "x" ]; then
1167 actual_dev=$dev
1168 break;
1169 fi
1170 done
1171 fi
1172
1173 # Check if one of all those tries has known success
1174 if [ "x$actual_dev" != "x" ]; then
1175 current_partition=$actual_dev
1176 else
1177 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."
1178 fi
1179 else
1180 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1181 # they use symlinks in fstab unrelated to what is shown in mount !
1182 if [ _"$partition_mountpt" = _"" ]; then
1183 # set default in case we dont't find it
1184 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1185 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1186 str_to_find_fmt_with=$tmpp
1187 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1188 break;
1189 fi
1190 done
1191 fi
1192 fi
1193
1194 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1195 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1196 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1197 # the former is then a link to the latter, so we test whether
1198 # $current_partition is actually such a link or not and set
1199 # $current_lvolume accordingly. On Debian you may find more than one answer
1200 # so we remove the one corresponding to /dev/.static
1201 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1202 # principle is the same and we need to find the link to it as well.
1203 # Note that $current_lvolume may well be an
1204 # ordinary device. It is just to make sure that we feed the right value
1205 # into any of the LVM tools if possible.
1206
1207 current_lvolume="$current_partition"
1208 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1209 # .static dir are a Debian specificity
1210 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1211 echo $current_lvolume | grep -q ' '
1212 if [ $? -eq 0 ]; then
1213 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1214 fi
1215 # if it's not found, it may well be a real device such as a multipath one
1216 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1217 if [ _"$current_lvolume" = _"" ]; then
1218 current_lvolume="$current_partition"
1219 fi
1220 fi
1221 #
1222 # End of LVM device style variation code (other than $current_lvolume).
1223
1224 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1225 # Size computed via LVM not directly
1226 partition_size="lvm"
1227 else
1228 partition_size=`SizeOfPartition $current_partition`
1229 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1230 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1231 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1232 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1233 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1234 [ "$partition_format" != "swap" ] && partition_format="swap"
1235 if [ "$partition_size" = "" ] ; then
1236 totalsize=0
1237 items=0
1238 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1239 totalsize=$(($totalsize+$i))
1240 items=$(($items+1))
1241 done
1242 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1243 [ "$partition_size" -lt "125000" ] && partition_size=125000
1244 LogFile "I'm guessing $c_p is $(($partition_size/1024))MB"
1245 fi
1246 fi
1247 fi
1248 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1249 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1250 if [ "$partition_mountpt" = "" ] ; then
1251 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1252 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1253 partition_mountpt="raid"
1254 partition_format="raid"
1255 else
1256 partition_mountpt="lvm"
1257 partition_format="lvm"
1258 fi
1259 fi
1260 fi
1261 psz=$partition_size
1262 LogFile "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1263 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1264 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1265 partition_mountpt="image"
1266 old_partition_fmt=$partition_format
1267 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1268 partition_size=$(($partition_size+1)); # just in case
1269 if [ "$partition_format" = "Linux" ] ; then
1270 LogFile "Are you imaging a mounted swap partition? Silly..."
1271 LogFile "Reverting format from $old_partition_fmt to $partition_format"
1272 partition_format=$old_partition_fmt
1273 fi
1274 fi
1275 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1276 LogFile "Excluding $current_partition from mountlist"
1277 continue
1278 fi
1279 if [ ! "$partition_mountpt" ] ; then
1280 LogFile "------- $FDISK -l $qq log ------------"
1281 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1282 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1283 [ "$partition_format" ] && break
1284 done
1285 LogFile "------- $FDISK log end ------------"
1286 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1287 partition_format="compaq"
1288 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1289 LogAll "Unable to find mountpoint of $current_partition - ignoring"
1290 continue
1291 fi
1292 fi
1293 if [ "$redhat_label" ]; then
1294 label="$redhat_label"
1295 elif [ "$uuid" ]; then
1296 label="$uuid"
1297 fi
1298 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1299 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1300 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1301 if [ "$current_partition" = "" ] ; then
1302 LogFile "Unknown partition (outstring = $unofficial_outstring)"
1303 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1304 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1305 partition_mountpt=raid
1306 partition_format=raid
1307 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1308 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1309 else
1310 LogFile "Unknown mountpoint (outstring = $unofficial_outstring)"
1311 fi
1312 elif [ "$partition_format" = "" ] ; then
1313 LogFile "Unknown format (outstring = $unofficial_outstring)"
1314 elif [ "$partition_size" = "" ] ; then
1315 LogFile "Unknown partition size (outstring = $unofficial_outstring)"
1316 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1317 continue
1318 else
1319 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1320 LogFile "Stupid bastard..."
1321 partition_format="vfat"
1322 fi
1323 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1324 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1325 fi
1326 done
1327}
1328
1329
1330MakeSureNumberIsInteger() {
1331 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1332 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1333 echo "result = '$res'"
1334 Die "$1 should be an integer"
1335 fi
1336}
1337
1338
1339OfferToMakeBootableISO() {
1340 local i old_pwd
1341 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1342 echo -en "Shall I make a bootable CD image? (y/[n]) "
1343 read i
1344 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1345 fi
1346 rm -Rf $MINDI_TMP/iso
1347 mkdir -p $MINDI_TMP/iso/{images,archives}
1348 cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogAll "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1349 LogFile "mindi_lib = $MINDI_LIB"
1350 for i in memdisk memtest.bin memtest.img ; do
1351 j=$MINDI_LIB/$i
1352 k=$MINDI_TMP/iso
1353 if [ -e "$j" ] ; then
1354 LogAll "Copying $j to $k"
1355 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1356 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1357 if [ _"$MONDO_SHARE" != _"" ]; then
1358 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1359 fi
1360 fi
1361 done
1362 MakeMessageFile > $MINDI_TMP/iso/message.txt
1363 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?"
1364 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?"
1365 if [ _"$MONDO_SHARE" != _"" ]; then
1366 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?"
1367 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?"
1368 fi
1369 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1370 if [ "$ARCH" != "ia64" ] ; then
1371 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?"
1372 fi
1373 old_pwd=`pwd`
1374 cd $MINDI_TMP/iso
1375 if [ "$ARCH" != "ia64" ] ; then
1376 if [ _"$MONDO_SHARE" != _"" ]; then
1377 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?"
1378 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1379 fi
1380 $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
1381 else
1382 $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
1383 rm -f images/mindi-bootroot.$BOOT_SIZE.img
1384 fi
1385 if [ "$?" -ne "0" ] ; then
1386 LogFile "----------- $ISO_CMD's errors --------------"
1387 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1388 echo "$ISO_CMD returned the following errors:-"
1389 cat $MINDI_TMP/mkisofs.log
1390 LogAll "Failed to create ISO image."
1391 else
1392 LogAll "Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1393 fi
1394 rm -f $MINDI_TMP/mkisofs.log
1395 cd $old_pwd
1396}
1397
1398
1399OfferToMakeBootableUSB() {
1400 local i
1401 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1402 echo -n "Shall I make a bootable USB image ? (y/[n]) "
1403 read i
1404 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1405 if [ "$USBDEVICE" = "" ]; then
1406 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1407 read dev
1408 USBDEVICE=$dev
1409 fi
1410 echo "WARNING: This will erase all content on $USBDEVICE"
1411 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1412 read i
1413 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1414 fi
1415 rm -Rf $MINDI_TMP/usb
1416 mkdir -p $MINDI_TMP/usb
1417 USBPART="${USBDEVICE}1"
1418
1419 echo -en "Transforming $USBDEVICE in a Bootable device "
1420 echo -en "."
1421 LogFile "Transforming $USBDEVICE in a Bootable device"
1422 LogFile "Checking $USBDEVICE"
1423 $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1424 if [ $? -ne 0 ]; then
1425 LogAll "Unable to access $USBDEVICE"
1426 LogAll "Make sure your USB device is pluged in"
1427 exit -1
1428 fi
1429 echo -en "."
1430 LogFile "Unmounting $USBDEVICE just in case"
1431 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1432 # If your key has no MBR it may cause an issue
1433 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1434 LogFile "Preparing $USBDEVICE"
1435 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1436d
1437d
1438d
1439d
1440n
1441p
14421
1443
1444
1445t
1446b
1447a
14481
1449w
1450EOF
1451 if [ $? -ne 0 ]; then
1452 LogAll "Unable to create a vfat Filesystem on $USBDEVICE"
1453 LogAll "Make sure your USB device is pluged in"
1454 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1455 MindiExit -1
1456 fi
1457 LogFile "The USB device $USBDEVICE now looks like this:"
1458 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1459 echo -en "."
1460 LogFile "Creating a vfat filesystem on $USBPART"
1461 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1462 if [ $? -ne 0 ]; then
1463 LogAll "Unable to create a vfat filesystem on $USBPART"
1464 LogAll "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)"
1465 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1466 MindiExit -1
1467 fi
1468 echo -en "."
1469 LogFile "Mounting $USBPART on $MINDI_TMP/usb"
1470 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1471 if [ $? -ne 0 ]; then
1472 LogAll "Unable to mount $USBPART on $MINDI_TMP/usb"
1473 LogAll "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)"
1474 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1475 MindiExit -1
1476 fi
1477 echo -en "."
1478 mkdir -p $MINDI_TMP/usb/images
1479 cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogAll "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1480 echo -en "."
1481 LogFile "mindi_lib = $MINDI_LIB"
1482 for i in memdisk memtest.bin memtest.img ; do
1483 j=$MINDI_LIB/$i
1484 k=$MINDI_TMP/usb
1485 if [ -e "$j" ] ; then
1486 LogAll "Copying $j to $k"
1487 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1488 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1489 fi
1490 done
1491 echo -en "."
1492 MakeMessageFile > $MINDI_TMP/usb/message.txt
1493 echo -en "."
1494 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?"
1495 echo -en "."
1496 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1497 echo -en "."
1498 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1499 echo -en "."
1500 umount $MINDI_TMP/usb
1501 if [ "$ARCH" != "ia64" ] ; then
1502 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1503 if [ "$?" -ne "0" ] ; then
1504 LogAll "----------- syslinux's errors --------------" |tee -a $LOGFILE
1505 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1506 LogAll "Failed to create USB image."
1507 else
1508 echo -e "$DONE"
1509 LogFile "Created bootable USB image on $USBDEVICE"
1510 fi
1511 rm -f $MINDI_TMP/syslinux.log
1512 else
1513 echo "No USB boot support for ia64"
1514 MindiExit -1
1515 fi
1516}
1517
1518
1519MakeMessageFile() {
1520
1521 if [ -x "/bin/lsb_release" ]; then
1522 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1523 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1524 # For pb >= 0.9.8
1525 DESC=`/usr/bin/pbdistrocheck -d`
1526 else
1527 iss="/dev/null"
1528 [ -r /etc/issue.net ] && iss="/etc/issue.net"
1529 [ -r /etc/issue ] && iss="/etc/issue"
1530 DESC=`head -1 $iss`
1531 fi
1532 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/"
1533 if [ _"$MONDO_SHARE" != _"" ]; then
1534 if [ "$CDRECOVERY" != "yes" ] ; then
1535 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1536 echo -en "Press <enter> to continue.\n"
1537 elif [ ! "$MINDI_TMP" ] ; then
1538 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1539 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1540 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1541 fi
1542 else
1543 echo -en "$BOOT_MEDIA_MESSAGE"
1544 fi
1545 else
1546 echo -en "\
1547To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1548CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1549 fi
1550 fi
1551 echo -en "\n\n\n"
1552}
1553
1554
1555MakeBootConfFile() {
1556 local options i ooo
1557 options=""
1558 # Type of boot file (elilo or syslinux/isolinux)
1559 type=$1
1560 if [ "$type" = "elilo" ]; then
1561 sep="="
1562 else
1563 sep=" "
1564 fi
1565
1566 # Generic header for conf file
1567 if [ "$type" != "elilo" ] ; then
1568 echo -en "prompt 1\ndisplay message.txt\n"
1569 else
1570 echo -en "prompt\n"
1571 fi
1572
1573 # Compute which default option to boot from
1574 if [ "$CDRECOVERY" = "yes" ] ; then
1575 echo -en "default${sep}RESTORE\n"
1576 # In case it's mondoarchive
1577 elif [ _"$MONDO_SHARE" != _"" ]; then
1578 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1579 echo -en "default${sep}iso\n"
1580 else
1581 echo -en "default${sep}interactive\n"
1582 fi
1583 else
1584 echo -en "default${sep}expert\n"
1585 fi
1586
1587 # Handle timeout
1588 if [ "$CDRECOVERY" != "yes" ] ; then
1589 echo -en "timeout${sep}300\n"
1590 else
1591 echo -en "timeout${sep}10000\n"
1592 fi
1593 echo -en "\n"
1594
1595 # prepare which labels will be generated
1596 if [ "$CDRECOVERY" = "yes" ] ; then
1597 options="RESTORE expert"
1598 else
1599 if [ _"$MONDO_SHARE" != _"" ]; then
1600 options="interactive expert compare iso nuke isonuke"
1601 else
1602 options="expert"
1603 fi
1604 fi
1605
1606 # Generate rest of conf file
1607 for i in $options ; do
1608 ooo=$i
1609 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1610 if [ "$type" = "elilo" ]; then
1611 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"
1612 else
1613 ps="/"
1614 if [ "$type" = "syslinux" ]; then
1615 ps=""
1616 fi
1617 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"
1618 fi
1619 echo -en "$outstr"
1620 done
1621
1622 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1623 if [ "$type" = "elilo" ]; then
1624 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1625 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1626 else
1627 ps="/"
1628 if [ "$type" = "syslinux" ]; then
1629 ps=""
1630 fi
1631 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1632 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1633 fi
1634 fi
1635}
1636
1637
1638PrepareBootDiskImage_LILO() {
1639 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1640 imagesdir=$MINDI_CACHE
1641 kernelpath=$1
1642
1643 retval=0
1644 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1645 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1646 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?"
1647 echo -en "..."
1648 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1649 mountpoint=$MINDI_TMP/mountpoint.$$
1650 mkdir -p $mountpoint
1651 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1652 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1653 mount -t vfat -o loop $imagefile $mountpoint || LogAll "Cannot mount (PBDI)"
1654 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1655 mkdir -p $mountpoint/etc
1656 liloconf=$mountpoint/elilo.conf
1657
1658 MakeBootConfFile elilo > $liloconf
1659
1660 # Copy it so that CD-ROM menu entry is satisfied
1661 mountefi=0
1662 df -T | grep /boot/efi | grep -q vfat
1663 if [ $? -ne 0 ]; then
1664 mount /boot/efi
1665 if [ $? -ne 0 ]; then
1666 echo "You have to mount your EFI partition when using mindi"
1667 MindiExit -1
1668 fi
1669 mountefi=1
1670 fi
1671 el=`find /boot/efi -name elilo.efi`
1672 cp $el $mountpoint
1673 cp $liloconf $mountpoint
1674 if [ $mountefi -eq 1 ]; then
1675 umount /boot/efi 2>&1 > /dev/null
1676 fi
1677
1678 LogFile "Copying $MINDI_TMP/initrd.img to $mountpoint..."
1679 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1680 if [ "$?" -ne "0" ] ; then
1681 LogAll "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1682 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1683 LogAll "Please unload some of your modules and try again."
1684 rm -f $MINDI_TMP/mtpt.$$
1685 LogAll "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1686 retval=$(($retval+1))
1687 fi
1688 MakeMessageFile > $mountpoint/message.txt
1689
1690 mkdir -p $mountpoint/tmp
1691 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1692 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1693 fi
1694
1695 # copy the kernel across
1696 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1697 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1698 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1699 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1700 if [ "$?" -ne "0" ] ; then
1701 LogFile "Files at mountpoint ($mountpoint) :-"
1702 du -sk $mountpoint/* >> $LOGFILE
1703 LogFile "--- end of list of files ---"
1704 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1705Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1706 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1707 cd $old_pwd
1708 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1709 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1710 # losetup /dev/loop0 -d
1711 [ "$imagefile" != "" ] && rm -f $imagefile
1712 return 0
1713 fi
1714 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1715 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1716 LogFile "Free space left on image = $free_space KB"
1717 LogFile "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1718 # make it bootable
1719 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1720 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1721 if [ "$KERN_DISK_MADE" ] ; then
1722 LogFile "Not running LILO. It's not that kind of disk."
1723 fi
1724
1725 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1726 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1727 echo -en "..."
1728 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1729 if [ "$retval" -eq "0" ] ; then
1730 echo -en "...$DONE\n"
1731 if [ "$KERN_DISK_MADE" ] ; then
1732 LogAll "$BOOT_SIZE KB boot disks were created OK\n"
1733 fi
1734 else
1735 echo -en "...failed\n"
1736 LogAll $BOOT_SIZE"KB boot disk was NOT created\n"
1737 [ "$imagefile" != "" ] && rm -f $imagefile
1738 fi
1739 [ "$retval" -ne "0" ] && LogAll "PrepareBootDiskImage() is returning nonzero"
1740 return $retval
1741}
1742
1743
1744PrepareBootDiskImage_ISOLINUX() {
1745 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1746 imagesdir=$MINDI_CACHE
1747 kernelpath=$1
1748 do_boot_root_thingy=""
1749 local retval old_pwd
1750 retval=0
1751
1752 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1753 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1754 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?"
1755 echo -en "..."
1756 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1757 mountpoint=$MINDI_TMP/mountpoint.$$
1758 mkdir -p $mountpoint
1759 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1760 LogFile "Creating vfat filesystem on $imagefile"
1761 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1762 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
1763 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1764
1765 # Only move it now to its final destination abd use it now
1766 mv $imagefile $imagesdir
1767 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1768
1769 mount -t vfat -o loop $imagefile $mountpoint || LogAll "Cannot mount (PBDI)"
1770
1771 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1772 MakeMessageFile > $mountpoint/message.txt
1773 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1774 LogFile "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
1775 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1776 if [ "$?" -ne "0" ] ; then
1777 LogAll "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1778 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1779 LogAll "Please unload some of your modules and try again."
1780 rm -f $MINDI_TMP/mtpt.$$
1781 LogAll "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1782 retval=$(($retval+1))
1783 fi
1784
1785 mkdir -p $mountpoint/tmp
1786 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1787 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1788 fi
1789
1790 # copy the kernel across
1791 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1792 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1793 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1794 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1795 if [ "$?" -ne "0" ] ; then
1796 LogFile "Files at mountpoint ($mountpoint) :-"
1797 du -sk $mountpoint/* >> $LOGFILE
1798 LogFile "--- end of list of files ---"
1799 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1800Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1801 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1802 cd $old_pwd
1803 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1804 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1805
1806 [ "$imagefile" != "" ] && rm -f $imagefile
1807 return 0
1808 fi
1809 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1810 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1811 LogFile "Free space left on image = $free_space KB"
1812 LogFile "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
1813
1814 # make it bootable
1815 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1816 mkdir -p $mountpoint/etc
1817 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1818 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1819 echo -en "..."
1820 rmdir $mountpoint || LogAll "Cannot rmdir (PBDI)"
1821
1822 if [ "$retval" -eq "0" ] ; then
1823 echo -en "...$DONE\n"
1824 if [ "$KERN_DISK_MADE" ] ; then
1825 [ "$imagefile" != "" ] && rm -f $imagefile
1826 LogAll "$BOOT_SIZE KB boot disks were created OK\n"
1827 fi
1828 else
1829 echo -en "...failed\n"
1830 LogAll $BOOT_SIZE"KB boot disk was NOT created\n"
1831 [ "$imagefile" != "" ] && rm -f $imagefile
1832 fi
1833 [ "$retval" -ne "0" ] && LogAll "PrepareBootDiskImage() is returning nonzero"
1834 return $retval
1835}
1836
1837
1838ParseModprobeForIncludes() {
1839local MODPROBE_CONF mpincfile includes include
1840
1841MODPROBE_CONF=/etc/modprobe.conf
1842mpincfile=$1
1843touch $mpincfile
1844if [ -a $MODPROBE_CONF ]; then
1845 includes=$(awk '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
1846 if [ -n "$includes" ]; then
1847 for include in $includes
1848 do
1849 if [ -a "$include" ]; then
1850 echo $include >> $mpincfile
1851 fi
1852 done
1853 fi
1854fi
1855}
1856
1857
1858PrepareDataDiskImages() {
1859 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
1860
1861 imagesdir=$MINDI_CACHE
1862 rm -f $imagesdir/mindi.iso
1863 needlist=$MINDI_TMP/what-we-need.txt
1864 bigdir=$MINDI_TMP/bigdir
1865 mkdir -p $bigdir/usr/bin
1866 mkdir -p $bigdir/usr/sbin
1867 includefile=$MINDI_TMP/$$.includefile.txt
1868
1869 lfiles="$DEPLIST_FILE"
1870 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1871 ParseModprobeForIncludes $includefile
1872 lines=$(($lines+`cat $includefile | wc -l`))
1873 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
1874 res=$?
1875 rm -f $includefile
1876 if [ "$YOUR_KERNEL_SUCKS" ]; then
1877 pwd=`pwd`
1878 cd $MINDI_TMP
1879 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1880 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
1881 done
1882 for i in $EXTRA_MODS ; do
1883 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1884 [ ! "$j" ] && LogFile "WARNING - cannot find failsafe module $i.o.gz"
1885 for k in $j ; do
1886 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogAll "ERROR on module $k" $MINDI_TMP/$$.log
1887 LogFile "Added failsafe module $k to ramdisk"
1888 done
1889 done
1890 cd $pwd
1891 else
1892 ListKernelModulePaths >> $needlist
1893 fi
1894 if [ "$res" -ne "0" ] ; then
1895 Die "You have $res files present in dependency list\nbut absent from filesystem."
1896 fi
1897 FindAndAddUserKeyboardMappingFile
1898 mkdir -p $bigdir/tmp
1899 if [ _"$MONDO_SHARE" != _"" ]; then
1900 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1901 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1902 fi
1903 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1904 DropOptimizedLibraries $needlist $bigdir
1905 echo -en "Assembling dependency files"
1906 CopyDependenciesToDirectory < $needlist $bigdir
1907
1908 # also copy io.sys and msdos.sys, if we can find them
1909 for i in `mount | cut -d' ' -f3` ; do
1910 for j in io.sys msdos.sys ; do
1911 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1912 done
1913 done
1914
1915 # master boot record, too
1916 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1917 if [ "$i" ] ; then
1918 LogAll "Backing up $i's MBR"
1919 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1920 sleep 1
1921 sync
1922 j=$i
1923 [ -h "$j" ] && j=`readlink -f $j`
1924 LogAll "Creating /dev/boot_device ($j)"
1925 mkdir -p $bigdir/dev
1926 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
1927 fi
1928
1929 old_pwd=`pwd`
1930 cd $bigdir
1931
1932 # Get terminfo content
1933 ti="usr/share/terminfo/l"
1934 if [ -d /$ti ]; then
1935 mkdir -p $ti
1936 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogAll "WARNING - error occurred while copying terminfo"
1937 fi
1938 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1939 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1940 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1941 fi
1942 if [ -d "/lib/dev-state" ]; then
1943 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1944 fi
1945 cd $old_pwd
1946 echo -e "$DONE"
1947 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1948 MakeMountlist $MINDI_TMP/mountlist.txt
1949 mkdir -p $bigdir/tmp
1950 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1951 if [ _"$MONDO_SHARE" != _"" ]; then
1952 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1953 fi
1954 if [ $LVM != "false" ]; then
1955 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1956 if [ "$?" -ne "0" ]; then
1957 LVM="false"
1958 rm -f $bigdir/tmp/i-want-my-lvm
1959 fi
1960 fi
1961 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
1962 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1963 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
1964 if [ _"$MONDO_SHARE" != _"" ]; then
1965 for q in filelist.full.gz biggielist.txt ; do
1966 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1967 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1968 done
1969 fi
1970
1971 echo -en "Tarring and zipping the data content..."
1972 size_of_all_tools=`du -sk $bigdir | cut -f1`
1973 (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)
1974 du -sk $imagesdir/*gz >> $LOGFILE
1975 echo -e "$DONE"
1976
1977 FRIENDLY_OUTSTRING="Boot and data disk images were created."
1978 rm -rf $bigdir
1979 rm -f $needlist
1980}
1981
1982
1983ProcessLDD() {
1984 local incoming f d nd bd bnd
1985 read incoming
1986 while [ "$incoming" != "" ]; do
1987 # We take the full path name of the dyn. lib. we want
1988 incoming=`echo "$incoming" | awk '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1989 for f in $incoming ; do
1990 # echo modified file name if one of the parent dir is a link
1991 # by replacing the original dirname by the destination of the link
1992 d="`dirname $f`"
1993 found="false"
1994 while [ "$d" != "/" ]; do
1995 if [ -h "$d" ]; then
1996 nd=`readlink -f $d`
1997 bd=`basename $d`
1998 bnd=`basename $nd`
1999 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2000 echo $d
2001 fi
2002 d="`dirname $d`"
2003 done
2004
2005 echo "$f"
2006 echo "`ReadAllLink $f`"
2007 done
2008 read incoming
2009 done
2010}
2011
2012
2013Prompt() {
2014 echo -en "$1"
2015 read line
2016}
2017
2018
2019ReadLine() {
2020 local i incoming
2021 read incoming
2022 i=0
2023 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2024 i=$(($i+1))
2025 read incoming
2026 done
2027 echo "$incoming"
2028}
2029
2030
2031SizeOfPartition() {
2032 local devpath drive res stub
2033 device=$1
2034 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2035 res=`SizeOfRaidPartition $device`
2036 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2037 echo "$res"
2038 return 0
2039 fi
2040 # patch from Bill <bill@iwizard.biz> - 2003/08/25
2041 res=`$FDISK -s $device 2>> $LOGFILE`
2042 # end patch
2043 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2`
2044 [ "$res" = "" ] && res="-1"
2045 echo $res
2046 return 0
2047}
2048
2049
2050SizeOfRaidPartition() {
2051 local real_dev smallest_size silly tmp
2052
2053 silly=999999999
2054 smallest_size=$silly
2055
2056 for real_dev in `GetRaidDevMembers $1` ; do
2057 tmp=`SizeOfPartition $real_dev`
2058 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2059 done
2060
2061 if [ "$smallest_size" = "$silly" ] ; then
2062 echo "-1"
2063 return 1
2064 else
2065 echo "$smallest_size"
2066 return 0
2067 fi
2068}
2069
2070
2071StripComments()
2072{
2073 local tempfile
2074
2075 tempfile=$MINDI_TMP/$$.strip.txt
2076 cp -f $1 $tempfile 2>> $LOGFILE
2077 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2078 rm -f $tempfile
2079 LogFile "Stripped comments from $2"
2080}
2081
2082
2083
2084StripExecutable()
2085{
2086 local tmpfile
2087
2088 tmpfile=$MINDI_TMP/stripped.$$.dat
2089 [ -d "$1" ] || [ -h "$1" ] && return
2090 cp -f $1 $tmpfile 2>> $LOGFILE
2091 strip $tmpfile 2> /dev/null
2092 if [ "$?" -eq "0" ] ; then
2093 cp -f $tmpfile $1 2>> $LOGFILE
2094 LogFile "Stripped binary $2"
2095 fi
2096 rm -f $tmpfile
2097}
2098
2099KernelVer() {
2100 local fkern_ver fname
2101
2102 fname=$1
2103 file $fname | grep -q gzip
2104 if [ "$?" -eq "0" ] ; then
2105 # Used by ia64
2106 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2107 else
2108 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2109 fi
2110 echo "$fkern_ver"
2111}
2112
2113
2114TryToFindKernelPath() {
2115 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2116
2117 we_want_version=$KERVERRUN
2118 possible_kernels=""
2119 duff_kernels=""
2120
2121 if [ "$ARCH" = "ia64" ] ; then
2122 root="/boot/efi/efi"
2123 else
2124 root="/"
2125 fi
2126 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2127 [ ! -e "$fname" ] && continue
2128 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2129 fkern_ver=`KernelVer $fname`
2130 [ "$fkern_ver" = "" ] && continue
2131 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2132 [ -f "$fname" ] || continue
2133 [ -h "$fname" ] && continue
2134 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2135 file $fname | grep -q gzip
2136 if [ "$?" -eq "0" ] ; then
2137 # Used by ia64
2138 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2139 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2140 duff_kernels="$fname $duff_kernels"
2141 else
2142 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2143 possible_kernels="$fname $possible_kernels"
2144 fi
2145 else
2146 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2147 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2148 duff_kernels="$fname $duff_kernels"
2149 else
2150 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2151 possible_kernels="$fname $possible_kernels"
2152 fi
2153 fi
2154 done
2155 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2156 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2157 fi
2158 if [ ! "$possible_kernels" ] ; then
2159 LogAll "No kernel matches exactly. Are there any duff kernels?"
2160 possible_kernels="$duff_kernels"
2161 if [ ! "$possible_kernels" ] ; then
2162 LogAll "Sorry, no duff kernels either"
2163 else
2164 LogAll "I bet you're running Debian or Gentoo, aren't you?"
2165 LogAll "Your kernel doesn't have a sane builddate. Oh well..."
2166 fi
2167 fi
2168 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2169 noof_kernels=`CountItemsIn "$possible_kernels"`
2170 if [ "$noof_kernels" -eq "0" ] ; then
2171 LogAll "Could not find your kernel."
2172 if [ -e "/boot/vmlinuz" ] ; then
2173 LogAll "Using /boot/vmlinuz as a last resort."
2174 output=/boot/vmlinuz
2175 else
2176 output=""
2177 fi
2178 elif [ "$noof_kernels" -eq "1" ] ; then
2179 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2180 LogFile "Your kernel is $kernelpath (v$KERVERRUN)"
2181 output="$kernelpath"
2182 else
2183 for i in $possible_kernels ; do
2184 if echo $i | grep "$KERVERRUN" ; then
2185 LogAll "OK, I used my initiative and found that "
2186 LogAll "$i is probably your kernel. "
2187 output="$i"
2188 return
2189 fi
2190 done
2191 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2192 output=/boot/vmlinuz
2193 LogFile "Schlomo, this one's for you."
2194 else
2195 LogAll "Two or more possible kernels found. You may specify any one of them and the "
2196 LogAll "boot disks will still work, probably. If one does not work, try another."
2197 LogAll "$possible_kernels"
2198 echo ""
2199 fi
2200 fi
2201 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2202}
2203
2204
2205TurnTgzIntoRdz() {
2206 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2207
2208 tgz_dir_fname=$1
2209 rdz_fname=$2
2210 kernelsize=$3
2211 maxsize=$(($BOOT_SIZE-$kernelsize))
2212 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2213 tempfile=$MINDI_TMP/temp.rd
2214 mountpoint=$MINDI_TMP/mnt1
2215 res=0
2216 echo -en "..."
2217 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2218 echo -en "..."
2219 LogFile "Creating ext2 filesystem on $tempfile"
2220 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2221 echo -en "..."
2222 mkdir -p $mountpoint
2223 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."
2224 echo -en "..."
2225 old_pwd=`pwd`
2226 cd $mountpoint
2227
2228 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2229 if [ -h "/lib64" ]; then
2230 mkdir -p lib || LogAll "Unable to create lib in $mountpoint."
2231 ln -s lib lib64 || LogAll "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2232 fi
2233
2234 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2235 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2236
2237 cd dev || Die "Can't cd to dev"
2238 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2239 rm -f dev-entries.tgz
2240 cd ..
2241
2242 for w in insmod.static insmod.static.old ; do
2243 s=`which $w 2> /dev/null`
2244 if [ -e "$s" ] ; then
2245 tar cf - -C / $s 2> /dev/null | tar xf -
2246 fi
2247 done
2248
2249 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2250
2251 # Handle the case where busybox and mount are dynamically linked
2252 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2253 if [ $? -eq 0 ]; then
2254 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2255 rm -f bin/mount $MINDI_TMP/busy.lis
2256 mountlis=`grep mount $DEPLIST_FILE`
2257 for f in $MINDI_LIB/rootfs/bin/busybox $mountlis ; do
2258 if [ -f $f ]; then
2259 LocateDeps $f >> $MINDI_TMP/busy.lis
2260 fi
2261 done
2262 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in mount analysis" $MINDI_TMP/$$.log
2263 rm -f $MINDI_TMP/busy.lis
2264 fi
2265
2266 # Copy of files mandatory for ld.so
2267 cp -rp /etc/ld.so.c* $mountpoint/etc
2268
2269 # Avoid an issue on some distro (RHEL5)
2270 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2271
2272 mkdir -p $mountpoint/tmp
2273 # Management of udev (which includes modprobe in rules)
2274 ps auxww | grep -v grep | grep -qw udevd
2275 if [ $? -eq 0 ]; then
2276 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2277 LogAll "udev device manager found"
2278 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2279 # This avoids NIC remapping if on another machine at restore time on Debian at least
2280 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2281 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2282 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2283 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2284 if [ -x /sbin/udevd ]; then
2285 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2286 lis=""
2287 # Get only the files which exist in that list
2288 # and potentially their symlink structure
2289 for i in $lis2; do
2290 if [ -h $i ]; then
2291 j=$i
2292 while [ -h $j ]; do
2293 lis="$lis $j"
2294 j=`readlink $j`
2295 done
2296 lis="$lis $j"
2297 elif [ -f $i ]; then
2298 lis="$lis $i"
2299 fi
2300 done
2301 # And their deps
2302 LocateDeps $lis > $MINDI_TMP/udev.lis
2303 for i in $lis; do
2304 if [ "`echo $i | cut -c1`" = "/" ]; then
2305 j=`echo $i | cut -c2-`
2306 [ "$j" != "" ] && rm -f $j
2307 fi
2308 done
2309 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
2310 rm -f $MINDI_TMP/udev.lis
2311 else
2312 LogAll "udevd daemon not in standard place (/sbin)"
2313 LogAll "mindi will use static devices which may cause problems"
2314 rm -f $mountpoint/tmp/USE-UDEV
2315 fi
2316 fi
2317
2318 # Management of potential HW info (Proliant only at the moment)
2319 rm -rf $MINDI_CACHE/bkphw
2320 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2321 if [ -d $MINDI_CACHE/bkphw ]; then
2322 LogAll "Hardware Information found and saved ..."
2323 cp -rp $MINDI_CACHE/bkphw .
2324 if [ -f $MINDI_CACHE/tools.files ]; then
2325 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2326 LocateDeps $lis > $MINDI_TMP/tools.lis
2327 tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2328 fi
2329 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2330 mv -f $MINDI_CACHE/mindi-rsthw .
2331 chmod 755 ./mindi-rsthw
2332 fi
2333 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2334 fi
2335
2336 # Management of perl scripts delivered needed at restore time
2337 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2338 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogAll "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2339
2340 for w in cdrom groovy-stuff ; do
2341 mkdir -p mnt/$w
2342 done
2343
2344 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
2345
2346 cd $old_pwd
2347 echo -en "..."
2348 old_pwd=`pwd`
2349 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2350 cd $MINDI_TMP
2351 needed_modules_path=lib/modules/$FAILSAFE_KVER
2352 else
2353 cd /
2354 if [ "${kernelname}" != "" ]
2355 then
2356 needed_modules_path=lib/modules/${kernelname}
2357 else
2358 needed_modules_path=lib/modules/$KERVERRUN
2359 fi
2360 fi
2361
2362 needed_modules=""
2363 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2364
2365 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2366 # For PXE boot
2367 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2368 fi
2369 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2370 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2371 fi
2372 for i in $DENY_MODS; do
2373 LogFile "Removing $i from the list of modules to load"
2374 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2375 done
2376
2377 [ -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."
2378 for i in $list_of_groovy_mods ; do
2379 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2380 done
2381
2382 for i in $needed_modules ; do
2383 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2384 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2385 LogFile "Adding $i ($s KB) to the rootfs"
2386 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogAll "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2387 # Uncompress modules if not using udev and native modprobe
2388 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2389 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2390 LogFile "Uncompressing $i"
2391 gunzip -f $mountpoint/$i
2392 fi
2393 fi
2394 done
2395
2396 # Also copy modules.dep in case of udev so that normal modprobe works
2397 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
2398
2399 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2400 LogFile "Deleting devfsd daemon from ramdisk"
2401 [ ! -e "/sbin/devfsd" ] && LogFile "...because /sbin/devfsd not found"
2402 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile "...because kernel is failsafe"
2403 rm -f $mountpoint/sbin/devfsd
2404 fi
2405 cd $old_pwd
2406 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2407 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2408 rm -f $mountpoint/zero
2409 if [ _"$MONDO_SHARE" != _"" ]; then
2410 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2411 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2412 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2413 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2414 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2415 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2416 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2417 [ "$USE_LZMA" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-LZMA
2418 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2419 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2420 fi
2421 mkdir -p $mountpoint/proc
2422 echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2423 # Determine what filesystem to use for initrd image
2424 LogFile "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2425 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2426 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2427 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2428 # say what will be used
2429 LogFile "Creating an $gvFileSystem initrd image..."
2430 # kernel expects linuxrc in ext2 filesystem
2431 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2432 # unmount loop filesystem and create image file using the standard approach
2433 umount $mountpoint || Die "Cannot unmount $tempfile"
2434 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2435 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2436 ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2437 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2438 rm -f ${rdz_fname}.tmp
2439 # log that we are done
2440 LogFile "...done."
2441 elif [ "$gvFileSystem" = "initramfs" ]; then
2442 # say what will be used
2443 LogFile "Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2444 # make sure that cpio is there
2445 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2446 # go into filesystem
2447 cd $mountpoint
2448 # kernel expects init in cpio filesystem
2449 ln -sf sbin/init init
2450 # create cpio image file and unmount loop filesystem
2451 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2452 cd $old_pwd
2453 umount $mountpoint || Die "Cannot unmount $tempfile"
2454 # log that we are done
2455 LogFile "...done."
2456 else
2457 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2458 fi
2459
2460 if [ "$res" -eq "0" ] ; then
2461 echo -en "..."
2462 else
2463 echo -en "\rMade an rdz WITH ERRORS. \n"
2464 fi
2465 return 0
2466}
2467
2468
2469##############################################################################
2470#----------------------------------- Main -----------------------------------#
2471##############################################################################
2472
2473# Now we can create what we need
2474mkdir -p $MINDI_TMP
2475
2476# Purge from potential old run
2477if [ _"$MINDI_CACHE" = _"" ]; then
2478 Die "MINDI_CACHE undefined"
2479fi
2480
2481if [ "$1" = "--printvar" ] ; then
2482 shift
2483 if [ _"$1" != _"" ] ; then
2484 set | grep -Ew "^$1" | cut -d= -f2
2485 fi
2486 exit 0
2487fi
2488
2489> $LOGFILE
2490LogFile "mindi v$MINDI_VERSION"
2491LogFile "$ARCH architecture detected"
2492LogFile "mindi called with the following arguments:"
2493LogFile "$@"
2494LogFile "Start date : `date`"
2495LogFile "-----------------------------"
2496
2497[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2498
2499# Log some capital variables
2500[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2501LogFile "MONDO_SHARE = $MONDO_SHARE"
2502LogFile "MINDI_LIB = $MINDI_LIB"
2503LogFile "MINDI_SBIN = $MINDI_SBIN"
2504[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2505LogFile "MINDI_CONF = $MINDI_CONF"
2506if [ -f $MINDI_CONFIG ]; then
2507 LogFile "-----------------------------"
2508 LogFile " Mindi configuration file "
2509 LogFile "-----------------------------"
2510 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2511 LogFile "-----------------------------"
2512fi
2513
2514
2515trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2516
2517# Sanity checks
2518which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2519which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2520which 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."
2521which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2522if which awk &> /dev/null ; then
2523 if ! which gawk &> /dev/null ; then
2524 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"
2525 fi
2526fi
2527which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2528[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2529
2530[ "`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"
2531
2532# Update the PATH variable if incomplete
2533if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2534 PATH=$PATH:/sbin:/usr/sbin
2535 export PATH
2536 LogFile "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2537 LogFile "However, you may wish to ask your vendor to provide a permanent fix..."
2538 LogFile " Or you might like to call 'su -' instead of 'su', for example."
2539fi
2540
2541# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2542if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2543 source $MINDI_LIB/FindDistroFailsafe
2544 # Log kernel image
2545 LogAll "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2546else
2547 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2548fi
2549
2550if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2551 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2552fi
2553
2554### BERLIOS
2555### Fix as it's not mandatory on ia64
2556if [ "$ARCH" = "ia64" ] ; then
2557 if which elilo &> /dev/null ; then
2558 LILO_EXE=elilo
2559 else
2560 LILO_EXE=`which false 2> /dev/null`
2561 fi
2562else
2563 FindIsolinuxBinary
2564fi
2565trap "Aborted" SIGTERM
2566DONE="\r\t\t\t\t\t\t\t\tDone. "
2567kernelpath=""
2568MONDO_ROOT=/var/cache/mondo
2569mkdir -p $MONDO_ROOT
2570
2571if [ -d "/proc/lvm" ]; then
2572 # LVM v1
2573 LVMCMD=""
2574 LVM="v1"
2575elif [ -d "/dev/mapper" ]; then
2576 # LVM v2
2577 LVMCMD="lvm"
2578 LVM="v2"
2579else
2580 LVM="false"
2581fi
2582
2583if [ -e "/proc/cmdline" ]; then
2584 CMDLINE="/proc/cmdline"
2585elif [ -e "/tmp/cmdline" ]; then
2586 CMDLINE="/tmp/cmdline"
2587else
2588 CMDLINE="/dev/null"
2589fi
2590
2591LogFile "LVM set to $LVM"
2592LogFile "----------"
2593LogFile "mount result:"
2594LogFile "-------------"
2595mount >> $LOGFILE
2596LogFile "-------------"
2597if [ -e /etc/raidtab ]; then
2598 LogFile "-------------"
2599 LogFile "/etc/raidtab content:"
2600 LogFile "-------------"
2601 cat /etc/raidtab >> $LOGFILE
2602fi
2603LogFile "-------------"
2604LogFile "cat $CMDLINE"
2605LogFile "-------------"
2606cat $CMDLINE >> $LOGFILE
2607LogFile "-------------"
2608LogFile "cat /proc/swaps:"
2609LogFile "-------------"
2610cat /proc/swaps >> $LOGFILE
2611LogFile "-------------"
2612LogFile "cat /proc/partitions:"
2613LogFile "-------------"
2614cat /proc/partitions >> $LOGFILE
2615LogFile "-------------"
2616LogFile "cat /proc/filesystems:"
2617LogFile "-------------"
2618cat /proc/filesystems >> $LOGFILE
2619LogFile "-------------"
2620LogFile "lsmod result:"
2621LogFile "-------------"
2622lsmod >> $LOGFILE
2623MODULES="`cat /proc/modules | awk '{print $1}'`"
2624if [ -x /usr/sbin/esxcfg-module ]; then
2625 LogFile "-------------"
2626 LogFile "VMWare ESX server detected - Enabling dedicated support"
2627 LogFile "-------------"
2628 LogFile "VMWare modules"
2629 LogFile "-------------"
2630 /usr/sbin/esxcfg-module -l >> $LOGFILE
2631 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | awk '{print $1}'`"
2632fi
2633LogFile "FORCE_MODS:"
2634LogFile "-------------"
2635LogFile $FORCE_MODS
2636LogFile "-------------"
2637LogFile "DENY_MODS:"
2638LogFile "-------------"
2639LogFile $DENY_MODS
2640LogFile "-------------"
2641LogFile "df result:"
2642LogFile "----------"
2643df -T >> $LOGFILE
2644LogFile "-------------"
2645LogFile "Liste of extra modules is:"
2646LogFile "$EXTRA_MODS"
2647LogFile "-------------"
2648
2649# Compute libata version
2650laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
2651# If libata v2 is used then remove ide-generic as it will perturbate boot
2652if [ "`echo $MODULES | grep libata`" ]; then
2653 if [ "$laver" = "2" ]; then
2654 DENY_MODS="$DENY_MODS ide-generic"
2655 LogFile "ide-generic removed from module list as your system uses libata v2+"
2656 LogFile "-------------"
2657 fi
2658fi
2659
2660FLOPPY_WAS_MOUNTED=""
2661for mtpt in /media/floppy /mnt/floppy /floppy ; do
2662 if mount | grep -w $mtpt &> /dev/null ; then
2663 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2664 umount $mtpt
2665 fi
2666done
2667
2668#
2669# If we have a USB device we need to store info
2670# and remove it from the parameters line
2671#
2672if [ "$#" -ne "0" ] ; then
2673 if [ "$1" = "--usb" ] ; then
2674 shift
2675 USBDEVICE=$1
2676 if [ _"$USBDEVICE" = _"" ]; then
2677 Die "No USB device specified"
2678 fi
2679 shift
2680 fi
2681fi
2682
2683if [ "$#" -ne "0" ] ; then
2684 if [ "$1" = "--findkernel" ] ; then
2685 res=`TryToFindKernelPath`
2686 # Avoids logfile content for mondo
2687 export MONDO_SHARE=""
2688 if [ "$res" = "" ] ; then
2689 MindiExit -1
2690 else
2691 echo "$res"
2692 MindiExit 0
2693 fi
2694 elif [ "$1" = "--locatedeps" ] ; then
2695 [ ! "$2" ] && Die "Please specify the binary to look at"
2696 LocateDeps $2
2697 # Avoids logfile content for mondo
2698 export MONDO_SHARE=""
2699 MindiExit $?
2700 elif [ "$1" = "--readalllink" ] ; then
2701 [ ! "$2" ] && Die "Please specify the binary to look at"
2702 ReadAllLink $2
2703 # Avoids logfile content for mondo
2704 export MONDO_SHARE=""
2705 MindiExit $?
2706 elif [ "$1" = "--makemountlist" ] ; then
2707 [ ! "$2" ] && Die "Please specify the output file"
2708 MakeMountlist $2
2709 # Avoids logfile content for mondo
2710 export MONDO_SHARE=""
2711 MindiExit $?
2712 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2713 echo "Mindi v$MINDI_VERSION"
2714 # Avoids logfile content for mondo
2715 export MONDO_SHARE=""
2716 MindiExit 0
2717 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2718 MONDO_TMP=$2
2719 # Change MINDI_TMP for the one provided by mondo
2720 # So that it can get back the built files
2721 if [ _"$MONDO_TMP" = _"" ]; then
2722 Die "MONDO_TMP is empty, aborting"
2723 fi
2724 if [ _"$MONDO_TMP" = _"/" ]; then
2725 Die "MONDO_TMP is /, aborting"
2726 fi
2727 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2728 rmdir $MINDI_TMP
2729 export MINDI_TMP=$MONDO_TMP
2730 mkdir -p $MINDI_TMP
2731
2732 # This is the scratch dir in mondo - subdir images
2733 MINDI_CACHE=$3
2734
2735 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2736###
2737### Sq-Modification...
2738### Attempt to locate kernel specific module path
2739### if module path is found then use it other wise use uname -r to set it...
2740###
2741 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2742 LogAll "kernelname = $kernelname"
2743 LogAll "kernelpath = $kernelpath"
2744 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2745 then
2746 LogAll "Module path for ${kernelpath} not found..."
2747 LogAll "using running kernel\'s modules."
2748 kernelname=$KERVERRUN
2749 else
2750 LogAll "Using modules for kernel: ${kernelname}"
2751 fi
2752###
2753### end of Sq-Modification
2754###
2755 TAPEDEV=$5
2756 TAPESIZE=$6
2757 FILES_IN_FILELIST=$7
2758 USE_LZO=$8
2759 CDRECOVERY=$9
2760 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2761 IMAGE_DEVS=""
2762 else
2763 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2764 fi
2765 if [ "${11}" ] ; then
2766 LILO_OPTIONS=""
2767 # LogAll "LILO will use conservative settings, to be compatible with older BIOSes."
2768 fi
2769 LAST_FILELIST_NUMBER=${12}
2770 ESTIMATED_TOTAL_NOOF_SLICES=${13}
2771 EXCLUDE_DEVS="${14}"
2772 USE_COMP="${15}"
2773 USE_LILO="${16}"
2774 USE_STAR="${17}"
2775 INTERNAL_TAPE_BLOCK_SIZE="${18}"
2776 DIFFERENTIAL="${19}"
2777 USE_GZIP="${20}"
2778 USE_LZMA="${21}"
2779 NOT_BOOT="${22}"
2780 [ "$USE_COMP" = "" ] && USE_COMP=yes
2781 [ "$USE_GZIP" = "" ] && USE_GZIP=no
2782 [ "$USE_LZMA" = "" ] && USE_LZMA=no
2783 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2784 [ "$TAPEDEV" ] && LogAll "This is a tape-based backup. Fine."
2785 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2786 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2787 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2788 then
2789 LogAll "Module path for ${kernelpath} not found..."
2790 LogAll "using running kernel\'s modules."
2791 kernelname=$KERVERRUN
2792 else
2793 LogAll "Using modules for kernel: ${kernelname}"
2794 fi
2795 # MONDO_ROOT is the real scratchdir
2796 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2797 if [ _"$MONDO_ROOT" != _"" ]; then
2798 mkdir -p $MONDO_ROOT
2799 else
2800 Die "MONDO_ROOT is undefined"
2801 fi
2802 else
2803 LogScreen "Syntax: mindi (--custom ....)"
2804 MindiExit -1
2805 fi
2806fi
2807
2808if [ _"$MINDI_CACHE" != _"" ]; then
2809 rm -rf $MINDI_CACHE/* 2> /dev/null
2810 mkdir -p $MINDI_CACHE
2811fi
2812
2813[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2814
2815if [ _"$MONDO_SHARE" = _"" ]; then
2816 LogAll "Mindi Linux mini-distro generator v$MINDI_VERSION"
2817 LogAll "Latest Mindi is available from http://www.mondorescue.org"
2818 LogAll "BusyBox sources are available from http://www.busybox.net"
2819 LogAll "------------------------------------------------------------------------------"
2820else
2821 LogFile "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
2822fi
2823if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2824 LogAll "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2825else
2826 LogAll "Unable to find mindi-busybox, please install it"
2827 MindiExit -1
2828fi
2829
2830# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2831insmod /lib/modules/$KERVERRUN/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2832for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2833 insmod $i >> $LOGFILE 2>> $LOGFILE
2834done
2835
2836KERN_DISK_MADE=""
2837
2838LogFile "DIFFERENTIAL = $DIFFERENTIAL"
2839LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
2840LogFile "NOT_BOOT = '$NOT_BOOT'"
2841if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2842 LogAll "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2843 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2844 MakeMountlist $MINDI_TMP/mountlist.txt
2845 mkdir -p $MINDI_TMP/small-all/tmp
2846 cd $MINDI_TMP/small-all
2847 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
2848 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
2849 sleep 2
2850 LogAll "Done. Exiting."
2851 MindiExit 0
2852fi
2853
2854if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2855 LogAll "Including the generation of a Bootable USB device on $USBDEVICE"
2856fi
2857
2858if [ "$kernelpath" = "" ] ; then
2859 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2860 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2861 read ch
2862 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2863 USE_OWN_KERNEL="yes"
2864 else
2865 USE_OWN_KERNEL="no"
2866 fi
2867 if [ "$USE_OWN_KERNEL" = "yes" ]; then
2868 YOUR_KERNEL_SUCKS=""
2869 kernelpath=`TryToFindKernelPath`
2870 if [ "$kernelpath" = "" ] ; then
2871 echo -n "Please enter kernel path : "
2872 read kernelpath
2873 fi
2874 else
2875 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2876 fi
2877fi
2878if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2879 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2880 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2881 source $MINDI_LIB/FindDistroFailsafe
2882 # Log kernel image
2883 LogAll "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2884 kernelpath="$FAILSAFE_KBIN"
2885 LogAll "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2886 LogAll "The failsafe kernel is $kernelpath.\n"
2887 LogAll "However, you are still running your kernel. If Mindi fails to create your\n"
2888 LogAll "disks then it may still be a result of a problem with your kernel.\n"
2889 pwd=`pwd`
2890 cd $MINDI_TMP
2891 mkdir -p lib/modules
2892 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2893 cd $pwd
2894 else
2895 kernelpath=$MINDI_LIB/vmlinuz
2896 LogAll "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2897 LogAll "However, you are still running your kernel. If Mindi fails to create your"
2898 LogAll "disks then it may still be a result of a problem with your kernel."
2899 pwd=`pwd`
2900 cd $MINDI_TMP
2901 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2902 cd $pwd
2903 fi
2904 YOUR_KERNEL_SUCKS="Your kernel sucks"
2905fi
2906LogFile "Mindi's temp dir=$MINDI_TMP"
2907LogFile "Mindi's output dir=$MINDI_CACHE"
2908[ "$(($RANDOM%64))" -eq "0" ] && LogAll "Dude, I've looked inside your computer and it's really dusty..."
2909
2910[ "$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."
2911
2912PrepareDataDiskImages
2913
2914ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2915rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2916export ramdisk_size=$rds
2917
2918LogFile "Ramdisk will be $ramdisk_size KB"
2919if [ "$ARCH" = "ia64" ] ; then
2920 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2921else
2922 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2923fi
2924
2925[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2926...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2927
2928if [ _"$MONDO_SHARE" = _"" ]; then
2929 ListImagesForUser
2930 OfferToMakeBootableISO
2931 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2932 OfferToMakeBootableUSB
2933 fi
2934 LogAll "Finished."
2935elif [ "$TAPEDEV" ] ; then
2936 if [ "$ARCH" != "ia64" ] ; then
2937 # We need to keep the img file as boot file for ia64 platform
2938 rm -f $MINDI_CACHE/{*img,*iso}
2939 else
2940 rm -f $MINDI_CACHE/*iso
2941 fi
2942 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2943 OfferToMakeBootableUSB
2944 fi
2945 OfferToMakeBootableISO
2946 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2947 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2948 else
2949 Die "Cannot find all.tar.gz, to be written to tape"
2950 fi
2951elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2952 OfferToMakeBootableUSB
2953else
2954 OfferToMakeBootableISO
2955fi
2956# cleanup
2957LogAll "$FRIENDLY_OUTSTRING"
2958for mtpt in $FLOPPY_WAS_MOUNTED ; do
2959 mount $mtpt
2960done
2961MindiExit 0
Note: See TracBrowser for help on using the repository browser.