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

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