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

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