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

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