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

Last change on this file since 2471 was 2471, checked in by Bruno Cornec, 14 years ago

Improve analysis of kernel modules by printing whether it's a live or extra module which has not been found (Matthew Cline) as reported in #362

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