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

Last change on this file since 2406 was 2406, checked in by Bruno Cornec, 15 years ago

Remove useless conf files created under /tmp and never used

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