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

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

cosmetic display fix

  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 107.1 KB
Line 
1#!/bin/bash
2
3# $Id: mindi 2495 2009-11-27 14:55:55Z 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 diskdumplib"
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" >> $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 echo "----------- syslinux's conf --------------" |tee -a $LOGFILE
1520 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1521 echo "------------------------------------------" |tee -a $LOGFILE
1522 umount $MINDI_TMP/usb
1523 if [ "$ARCH" != "ia64" ] ; then
1524 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1525 if [ "$?" -ne "0" ] ; then
1526 echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1527 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
1528 echo "------------------------------------------" |tee -a $LOGFILE
1529 LogIt "Failed to create USB image."
1530 else
1531 echo -e "$DONE"
1532 echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1533 fi
1534 rm -f $MINDI_TMP/syslinux.log
1535 else
1536 echo "No USB boot support for ia64" | tee -a $LOGFILE
1537 MindiExit -1
1538 fi
1539}
1540
1541
1542MakeMessageFile() {
1543
1544 if [ -x "/bin/lsb_release" ]; then
1545 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1546 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1547 # For pb >= 0.9.8
1548 DESC=`/usr/bin/pbdistrocheck -d`
1549 else
1550 iss="/dev/null"
1551 [ -r /etc/issue.net ] && iss="/etc/issue.net"
1552 [ -r /etc/issue ] && iss="/etc/issue"
1553 DESC=`head -1 $iss`
1554 fi
1555 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/"
1556 if [ _"$MONDO_SHARE" != _"" ]; then
1557 if [ "$CDRECOVERY" != "yes" ] ; then
1558 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1559 echo -en "Press <enter> to continue.\n"
1560 elif [ ! "$MINDI_TMP" ] ; then
1561 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
1562 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1563 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1564 fi
1565 else
1566 echo -en "$BOOT_MEDIA_MESSAGE"
1567 fi
1568 else
1569 echo -en "\
1570To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1571CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
1572 fi
1573 fi
1574 echo -en "\n\n\n"
1575}
1576
1577
1578MakeBootConfFile() {
1579 local options i ooo
1580 options=""
1581 # Type of boot file (elilo or syslinux/isolinux)
1582 type=$1
1583 if [ "$type" = "elilo" ]; then
1584 sep="="
1585 else
1586 sep=" "
1587 fi
1588
1589 # Generic header for conf file
1590 if [ "$type" != "elilo" ] ; then
1591 echo -en "prompt 1\ndisplay message.txt\n"
1592 else
1593 echo -en "prompt\n"
1594 fi
1595
1596 # Compute which default option to boot from
1597 if [ "$CDRECOVERY" = "yes" ] ; then
1598 echo -en "default${sep}RESTORE\n"
1599 # In case it's mondoarchive
1600 elif [ _"$MONDO_SHARE" != _"" ]; then
1601 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
1602 echo -en "default${sep}iso\n"
1603 else
1604 echo -en "default${sep}interactive\n"
1605 fi
1606 else
1607 echo -en "default${sep}expert\n"
1608 fi
1609
1610 # Handle timeout
1611 if [ "$CDRECOVERY" != "yes" ] ; then
1612 echo -en "timeout${sep}300\n"
1613 else
1614 echo -en "timeout${sep}10000\n"
1615 fi
1616 echo -en "\n"
1617
1618 # prepare which labels will be generated
1619 if [ "$CDRECOVERY" = "yes" ] ; then
1620 options="RESTORE expert"
1621 else
1622 if [ _"$MONDO_SHARE" != _"" ]; then
1623 options="interactive expert compare iso nuke isonuke"
1624 else
1625 options="expert"
1626 fi
1627 fi
1628
1629 # Generate rest of conf file
1630 for i in $options ; do
1631 ooo=$i
1632 [ "$ooo" = "RESTORE" ] && ooo="nuke"
1633 if [ "$type" = "elilo" ]; then
1634 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"
1635 else
1636 ps="/"
1637 if [ "$type" = "syslinux" ]; then
1638 ps=""
1639 fi
1640 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"
1641 fi
1642 echo -en "$outstr"
1643 done
1644
1645 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1646 if [ "$type" = "elilo" ]; then
1647 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
1648 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
1649 else
1650 ps="/"
1651 if [ "$type" = "syslinux" ]; then
1652 ps=""
1653 fi
1654 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1655 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
1656 fi
1657 fi
1658}
1659
1660
1661PrepareBootDiskImage_LILO() {
1662 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1663 imagesdir=$MINDI_CACHE
1664 kernelpath=$1
1665
1666 retval=0
1667 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1668 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1669 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?"
1670 echo -en "..."
1671 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1672 mountpoint=$MINDI_TMP/mountpoint.$$
1673 mkdir -p $mountpoint
1674 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1675 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1676 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1677 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1678 mkdir -p $mountpoint/etc
1679 liloconf=$mountpoint/elilo.conf
1680
1681 MakeBootConfFile elilo > $liloconf
1682
1683 # Copy it so that CD-ROM menu entry is satisfied
1684 mountefi=0
1685 df -T | grep /boot/efi | grep -q vfat
1686 if [ $? -ne 0 ]; then
1687 mount /boot/efi
1688 if [ $? -ne 0 ]; then
1689 echo "You have to mount your EFI partition when using mindi"
1690 MindiExit -1
1691 fi
1692 mountefi=1
1693 fi
1694 el=`find /boot/efi -name elilo.efi`
1695 cp $el $mountpoint
1696 cp $liloconf $mountpoint
1697 if [ $mountefi -eq 1 ]; then
1698 umount /boot/efi 2>&1 > /dev/null
1699 fi
1700
1701 echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1702 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
1703 if [ "$?" -ne "0" ] ; then
1704 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1705 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1706 LogIt "Please unload some of your modules and try again."
1707 rm -f $MINDI_TMP/mtpt.$$
1708 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1709 retval=$(($retval+1))
1710 fi
1711 MakeMessageFile > $mountpoint/message.txt
1712
1713 mkdir -p $mountpoint/tmp
1714 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1715 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1716 fi
1717
1718 # copy the kernel across
1719 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1720 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1721 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1722 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
1723 if [ "$?" -ne "0" ] ; then
1724 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1725 du -sk $mountpoint/* >> $LOGFILE
1726 echo "--- end of list of files ---" >> $LOGFILE
1727 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1728Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1729 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1730 cd $old_pwd
1731 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1732 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1733 # losetup /dev/loop0 -d
1734 [ "$imagefile" != "" ] && rm -f $imagefile
1735 return 0
1736 fi
1737 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1738 echo "Free space left on image = $free_space KB" >> $LOGFILE
1739 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1740 # make it bootable
1741 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1742 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1743 if [ "$KERN_DISK_MADE" ] ; then
1744 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
1745 fi
1746
1747 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
1748 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1749 echo -en "..."
1750 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1751 if [ "$retval" -eq "0" ] ; then
1752 echo -en "...$DONE\n"
1753 if [ "$KERN_DISK_MADE" ] ; then
1754 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1755 fi
1756 else
1757 echo -en "...failed\n"
1758 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1759 [ "$imagefile" != "" ] && rm -f $imagefile
1760 fi
1761 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1762 return $retval
1763}
1764
1765
1766PrepareBootDiskImage_ISOLINUX() {
1767 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1768 imagesdir=$MINDI_CACHE
1769 kernelpath=$1
1770 do_boot_root_thingy=""
1771 local retval old_pwd
1772 retval=0
1773
1774 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
1775 echo -en "Making "$BOOT_SIZE"KB boot disk..."
1776 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?"
1777 echo -en "..."
1778 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
1779 mountpoint=$MINDI_TMP/mountpoint.$$
1780 mkdir -p $mountpoint
1781 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1782 echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1783 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
1784 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
1785 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1786
1787 # Only move it now to its final destination abd use it now
1788 mv $imagefile $imagesdir
1789 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1790
1791 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
1792
1793 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
1794 MakeMessageFile > $mountpoint/message.txt
1795 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
1796 echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1797 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
1798 if [ "$?" -ne "0" ] ; then
1799 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
1800 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
1801 LogIt "Please unload some of your modules and try again."
1802 rm -f $MINDI_TMP/mtpt.$$
1803 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
1804 retval=$(($retval+1))
1805 fi
1806
1807 mkdir -p $mountpoint/tmp
1808 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1809 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1810 fi
1811
1812 # copy the kernel across
1813 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
1814 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
1815 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
1816 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1817 if [ "$?" -ne "0" ] ; then
1818 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1819 du -sk $mountpoint/* >> $LOGFILE
1820 echo "--- end of list of files ---" >> $LOGFILE
1821 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
1822Sorry, your kernel is too big for your image.\n" >> $LOGFILE
1823 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
1824 cd $old_pwd
1825 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1826 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1827
1828 [ "$imagefile" != "" ] && rm -f $imagefile
1829 return 0
1830 fi
1831 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
1832 echo "Free space left on image = $free_space KB" >> $LOGFILE
1833 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
1834
1835 # make it bootable
1836 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
1837 mkdir -p $mountpoint/etc
1838 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
1839 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1840 echo -en "..."
1841 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
1842
1843 if [ "$retval" -eq "0" ] ; then
1844 echo -en "...$DONE\n"
1845 if [ "$KERN_DISK_MADE" ] ; then
1846 [ "$imagefile" != "" ] && rm -f $imagefile
1847 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
1848 fi
1849 else
1850 echo -en "...failed\n"
1851 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
1852 [ "$imagefile" != "" ] && rm -f $imagefile
1853 fi
1854 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
1855 return $retval
1856}
1857
1858
1859ParseModprobeForIncludes() {
1860local MODPROBE_CONF mpincfile includes include
1861
1862MODPROBE_CONF=/etc/modprobe.conf
1863mpincfile=$1
1864touch $mpincfile
1865if [ -a $MODPROBE_CONF ]; then
1866 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
1867 if [ -n "$includes" ]; then
1868 for include in $includes
1869 do
1870 if [ -a "$include" ]; then
1871 echo $include >> $mpincfile
1872 fi
1873 done
1874 fi
1875fi
1876}
1877
1878
1879PrepareDataDiskImages() {
1880 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
1881
1882 imagesdir=$MINDI_CACHE
1883 rm -f $imagesdir/mindi.iso
1884 needlist=$MINDI_TMP/what-we-need.txt
1885 bigdir=$MINDI_TMP/bigdir
1886 mkdir -p $bigdir/usr/bin
1887 mkdir -p $bigdir/usr/sbin
1888 includefile=$MINDI_TMP/$$.includefile.txt
1889
1890 if [ -e "$DEPLIST_FILE" ]; then
1891 lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
1892 else
1893 lfiles="$DEPLIST_DIR/*"
1894 fi
1895 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
1896 ParseModprobeForIncludes $includefile
1897 lines=$(($lines+`cat $includefile | wc -l`))
1898 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
1899 res=$?
1900 rm -f $includefile
1901 if [ "$YOUR_KERNEL_SUCKS" ]; then
1902 pwd=`pwd`
1903 cd $MINDI_TMP
1904 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
1905 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
1906 done
1907 for i in $EXTRA_MODS ; do
1908 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1909 [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
1910 for k in $j ; do
1911 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
1912 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
1913 done
1914 done
1915 cd $pwd
1916 else
1917 ListKernelModulePaths >> $needlist
1918 fi
1919 if [ "$res" -ne "0" ] ; then
1920 Die "You have $res files present in dependency list\nbut absent from filesystem."
1921 fi
1922 FindAndAddUserKeyboardMappingFile
1923 mkdir -p $bigdir/tmp
1924 if [ _"$MONDO_SHARE" != _"" ]; then
1925 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1926 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
1927 fi
1928 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1929 DropOptimizedLibraries $needlist $bigdir
1930 echo -en "Assembling dependency files"
1931 CopyDependenciesToDirectory < $needlist $bigdir
1932
1933 # also copy io.sys and msdos.sys, if we can find them
1934 for i in `mount | cut -d' ' -f3` ; do
1935 for j in io.sys msdos.sys ; do
1936 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
1937 done
1938 done
1939
1940 # master boot record, too
1941 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
1942 if [ "$i" ] ; then
1943 LogIt "Backing up $i's MBR"
1944 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1945 sleep 1
1946 sync
1947 j=$i
1948 [ -h "$j" ] && j=`readlink -f $j`
1949 LogIt "Creating /dev/boot_device ($j)"
1950 mkdir -p $bigdir/dev
1951 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
1952 fi
1953
1954 old_pwd=`pwd`
1955 cd $bigdir
1956
1957 # Get terminfo content
1958 ti="usr/share/terminfo/l"
1959 if [ -d /$ti ]; then
1960 mkdir -p $ti
1961 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
1962 fi
1963 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
1964 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
1965 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
1966 fi
1967 if [ -d "/lib/dev-state" ]; then
1968 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1969 fi
1970 cd $old_pwd
1971 echo -e "$DONE"
1972 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
1973 MakeMountlist $MINDI_TMP/mountlist.txt
1974 CheckMountlist $MINDI_TMP/mountlist.txt
1975 mkdir -p $bigdir/tmp
1976 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
1977 if [ _"$MONDO_SHARE" != _"" ]; then
1978 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
1979 fi
1980 if [ $LVM != "false" ]; then
1981 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1982 if [ "$?" -ne "0" ]; then
1983 LVM="false"
1984 rm -f $bigdir/tmp/i-want-my-lvm
1985 fi
1986 fi
1987 echo "Your mountlist.txt file content is:" >> $LOGFILE
1988 echo "-----------------------------------" >> $LOGFILE
1989 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
1990 echo "-----------------------------------" >> $LOGFILE
1991
1992 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1993 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
1994 if [ _"$MONDO_SHARE" != _"" ]; then
1995 for q in filelist.full.gz biggielist.txt ; do
1996 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1997 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1998 done
1999 fi
2000
2001 echo -en "Tarring and zipping the data content..."
2002 size_of_all_tools=`du -sk $bigdir | cut -f1`
2003 (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)
2004 du -sk $imagesdir/*gz >> $LOGFILE
2005 echo -e "$DONE"
2006
2007 FRIENDLY_OUTSTRING="Boot and data disk images were created."
2008 rm -rf $bigdir
2009 rm -f $needlist
2010}
2011
2012
2013ProcessLDD() {
2014 local incoming f d nd bd bnd
2015 read incoming
2016 while [ "$incoming" != "" ]; do
2017 # We take the full path name of the dyn. lib. we want
2018 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
2019 for f in $incoming ; do
2020 # echo modified file name if one of the parent dir is a link
2021 # by replacing the original dirname by the destination of the link
2022 d="`dirname $f`"
2023 found="false"
2024 while [ "$d" != "/" ]; do
2025 if [ -h "$d" ]; then
2026 nd=`readlink -f $d`
2027 bd=`basename $d`
2028 bnd=`basename $nd`
2029 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2030 echo $d
2031 fi
2032 d="`dirname $d`"
2033 done
2034
2035 echo "$f"
2036 echo "`ReadAllLink $f`"
2037 done
2038 read incoming
2039 done
2040}
2041
2042
2043Prompt() {
2044 echo -en "$1"
2045 read line
2046}
2047
2048
2049ReadLine() {
2050 local i incoming
2051 read incoming
2052 i=0
2053 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
2054 i=$(($i+1))
2055 read incoming
2056 done
2057 echo "$incoming"
2058}
2059
2060
2061SizeOfPartition() {
2062 local devpath drive res stub
2063 device=$1
2064 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
2065 res=`SizeOfRaidPartition $device`
2066 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2067 echo "$res"
2068 return 0
2069 fi
2070 # patch from Bill <bill@iwizard.biz> - 2003/08/25
2071 res=`$FDISK -s $device 2>> $LOGFILE`
2072 # end patch
2073 # take only the first in case of multiple mount (cifs, nfs, ...)
2074 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
2075 [ "$res" = "" ] && res="-1"
2076 echo $res
2077 return 0
2078}
2079
2080
2081SizeOfRaidPartition() {
2082 local real_dev smallest_size silly tmp
2083
2084 silly=999999999
2085 smallest_size=$silly
2086
2087 for real_dev in `GetRaidDevMembers $1` ; do
2088 tmp=`SizeOfPartition $real_dev`
2089 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
2090 done
2091
2092 if [ "$smallest_size" = "$silly" ] ; then
2093 echo "-1"
2094 return 1
2095 else
2096 echo "$smallest_size"
2097 return 0
2098 fi
2099}
2100
2101
2102StripComments()
2103{
2104 local tempfile
2105
2106 tempfile=$MINDI_TMP/$$.strip.txt
2107 cp -f $1 $tempfile 2>> $LOGFILE
2108 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2109 rm -f $tempfile
2110 echo "Stripped comments from $2" >> $LOGFILE
2111}
2112
2113
2114
2115StripExecutable()
2116{
2117 local tmpfile
2118
2119 tmpfile=$MINDI_TMP/stripped.$$.dat
2120 [ -d "$1" ] || [ -h "$1" ] && return
2121 cp -f $1 $tmpfile 2>> $LOGFILE
2122 strip $tmpfile 2> /dev/null
2123 if [ "$?" -eq "0" ] ; then
2124 cp -f $tmpfile $1 2>> $LOGFILE
2125 echo "Stripped binary $2" >> $LOGFILE
2126 fi
2127 rm -f $tmpfile
2128}
2129
2130KernelVer() {
2131 local fkern_ver fname
2132
2133 fname=$1
2134 file $fname | grep -q gzip
2135 if [ "$?" -eq "0" ] ; then
2136 # Used by ia64
2137 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2138 else
2139 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2140 fi
2141 echo "$fkern_ver"
2142}
2143
2144
2145TryToFindKernelPath() {
2146 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2147
2148 we_want_version=$KERVERRUN
2149 possible_kernels=""
2150 duff_kernels=""
2151
2152 if [ "$ARCH" = "ia64" ] ; then
2153 root="/boot/efi/efi"
2154 else
2155 root="/"
2156 fi
2157 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2158 [ ! -e "$fname" ] && continue
2159 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2160 fkern_ver=`KernelVer $fname`
2161 [ "$fkern_ver" = "" ] && continue
2162 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2163 [ -f "$fname" ] || continue
2164 [ -h "$fname" ] && continue
2165 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2166 file $fname | grep -q gzip
2167 if [ "$?" -eq "0" ] ; then
2168 # Used by ia64
2169 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2170 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2171 duff_kernels="$fname $duff_kernels"
2172 else
2173 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2174 possible_kernels="$fname $possible_kernels"
2175 fi
2176 else
2177 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2178 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2179 duff_kernels="$fname $duff_kernels"
2180 else
2181 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2182 possible_kernels="$fname $possible_kernels"
2183 fi
2184 fi
2185 done
2186 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2187 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2188 fi
2189 if [ ! "$possible_kernels" ] ; then
2190 LogIt "No kernel matches exactly. Are there any duff kernels?"
2191 possible_kernels="$duff_kernels"
2192 if [ ! "$possible_kernels" ] ; then
2193 LogIt "Sorry, no duff kernels either"
2194 else
2195 LogIt "I bet you're running Debian or Gentoo, aren't you?"
2196 LogIt "Your kernel doesn't have a sane builddate. Oh well..."
2197 fi
2198 fi
2199 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2200 noof_kernels=`CountItemsIn "$possible_kernels"`
2201 if [ "$noof_kernels" -eq "0" ] ; then
2202 LogIt "Could not find your kernel."
2203 if [ -e "/boot/vmlinuz" ] ; then
2204 LogIt "Using /boot/vmlinuz as a last resort."
2205 output=/boot/vmlinuz
2206 else
2207 output=""
2208 fi
2209 elif [ "$noof_kernels" -eq "1" ] ; then
2210 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2211 echo "Your kernel is $kernelpath (v$KERVERRUN)" >> $LOGFILE
2212 output="$kernelpath"
2213 else
2214 for i in $possible_kernels ; do
2215 if echo $i | grep "$KERVERRUN" ; then
2216 LogIt "OK, I used my initiative and found that "
2217 LogIt "$i is probably your kernel. "
2218 output="$i"
2219 return
2220 fi
2221 done
2222 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2223 output=/boot/vmlinuz
2224 echo "Schlomo, this one's for you." >> $LOGFILE
2225 else
2226 LogIt "Two or more possible kernels found. You may specify any one of them and the "
2227 LogIt "boot disks will still work, probably. If one does not work, try another."
2228 LogIt "$possible_kernels"
2229 echo ""
2230 fi
2231 fi
2232 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2233}
2234
2235
2236TurnTgzIntoRdz() {
2237 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize maxsize res currsize not_copied j k s w needed_modules_path
2238
2239 tgz_dir_fname=$1
2240 rdz_fname=$2
2241 kernelsize=$3
2242 maxsize=$(($BOOT_SIZE-$kernelsize))
2243 maxsize=$(($maxsize*2)); # to allow for compression of 50%
2244 tempfile=$MINDI_TMP/temp.rd
2245 mountpoint=$MINDI_TMP/mnt1
2246 res=0
2247 echo -en "..."
2248 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2249 echo -en "..."
2250 echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2251 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2252 echo -en "..."
2253 mkdir -p $mountpoint
2254 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."
2255 echo -en "..."
2256 old_pwd=`pwd`
2257 cd $mountpoint
2258
2259 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2260 if [ -h "/lib64" ]; then
2261 mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2262 ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2263 fi
2264
2265 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
2266 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
2267
2268 cd dev || Die "Can't cd to dev"
2269 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2270 rm -f dev-entries.tgz
2271 cd ..
2272
2273 for w in insmod.static insmod.static.old ; do
2274 s=`which $w 2> /dev/null`
2275 if [ -e "$s" ] ; then
2276 tar cf - -C / $s 2> /dev/null | tar xf -
2277 fi
2278 done
2279
2280 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
2281
2282 # Handle the case where busybox and mount are dynamically linked
2283 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2284 if [ $? -eq 0 ]; then
2285 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2286 rm -f bin/mount $MINDI_TMP/busy.lis
2287 mountlis=`grep -E "mount|fuse|ssh" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2 | sort -u`
2288 LocateDeps $MINDI_LIB/rootfs/bin/busybox $mountlis >> $MINDI_TMP/busy.lis
2289 # Special for libs
2290 for f in `grep -E "libnss" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2`; do
2291 echo "`ReadAllLink $f`" >> $MINDI_TMP/busy.lis
2292 done
2293 # Initial / are trucated by tar
2294 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
2295 rm -f $MINDI_TMP/busy.lis
2296 fi
2297
2298 # Copy of files mandatory for ssh to automate mount if sshfs is used
2299 mkdir $mountpoint/.ssh
2300 cp -rp ~root/.ssh/*.pub ~root/.ssh/config ~root/.ssh/known* $mountpoint/.ssh 2> /dev/null
2301 echo > $mountpoint/tmp/myssh << EOF
2302ssh -o StrictHostKeyChecking=no $*
2303EOF
2304 chmod 755 $mountpoint/tmp/myssh
2305
2306 # Copy of files mandatory for ld.so
2307 cp -rp /etc/ld.so.c* $mountpoint/etc
2308
2309 # Avoid an issue on some distro (RHEL5)
2310 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2311
2312 mkdir -p $mountpoint/tmp
2313 # Management of udev (which includes modprobe in rules)
2314 ps auxww | grep -v grep | grep -qw udevd
2315 if [ $? -eq 0 ]; then
2316 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
2317 LogIt "udev device manager found"
2318 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
2319 # This avoids NIC remapping if on another machine at restore time on Debian at least
2320 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2321 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2322 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
2323 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
2324 if [ -x /sbin/udevd ]; then
2325 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2326 lis=""
2327 # Get only the files which exist in that list
2328 # and potentially their symlink structure
2329 for i in $lis2; do
2330 if [ -h $i ]; then
2331 j=$i
2332 while [ -h $j ]; do
2333 lis="$lis $j"
2334 j=`readlink $j`
2335 done
2336 lis="$lis $j"
2337 elif [ -f $i ]; then
2338 lis="$lis $i"
2339 fi
2340 done
2341 # And their deps
2342 LocateDeps $lis > $MINDI_TMP/udev.lis
2343 for i in $lis; do
2344 if [ "`echo $i | cut -c1`" = "/" ]; then
2345 j=`echo $i | cut -c2-`
2346 [ "$j" != "" ] && rm -f $j
2347 fi
2348 done
2349 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
2350 rm -f $MINDI_TMP/udev.lis
2351 else
2352 echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
2353 echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
2354 rm -f $mountpoint/tmp/USE-UDEV
2355 fi
2356 fi
2357
2358 # Management of potential HW info (Proliant only at the moment)
2359 rm -rf $MINDI_CACHE/bkphw
2360 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2361 if [ -d $MINDI_CACHE/bkphw ]; then
2362 LogIt "Hardware Information found and saved ..."
2363 cp -rp $MINDI_CACHE/bkphw .
2364 if [ -f $MINDI_CACHE/tools.files ]; then
2365 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2366 LocateDeps $lis > $MINDI_TMP/tools.lis
2367 tar cf - $lis `sort -u $MINDI_TMP/tools.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in tools.lis analysis" $MINDI_TMP/$$.log
2368 fi
2369 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2370 mv -f $MINDI_CACHE/mindi-rsthw .
2371 chmod 755 ./mindi-rsthw
2372 fi
2373 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2374 fi
2375
2376 # Management of perl scripts delivered needed at restore time
2377 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2378 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2379
2380 for w in cdrom groovy-stuff ; do
2381 mkdir -p mnt/$w
2382 done
2383
2384 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
2385
2386 cd $old_pwd
2387 echo -en "..."
2388 old_pwd=`pwd`
2389 if [ "$YOUR_KERNEL_SUCKS" ] ; then
2390 cd $MINDI_TMP
2391 needed_modules_path=lib/modules/$FAILSAFE_KVER
2392 else
2393 cd /
2394 if [ "${kernelname}" != "" ]
2395 then
2396 needed_modules_path=lib/modules/${kernelname}
2397 else
2398 needed_modules_path=lib/modules/$KERVERRUN
2399 fi
2400 fi
2401
2402 needed_modules=""
2403 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2404
2405 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2406 # For PXE boot
2407 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2408 fi
2409 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2410 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2411 fi
2412 for i in $DENY_MODS; do
2413 echo "Removing $i from the list of modules to load" >> $LOGFILE
2414 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2415 done
2416
2417 [ -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."
2418 for i in $list_of_groovy_mods ; do
2419 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2420 done
2421
2422 for i in $needed_modules ; do
2423 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2424 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
2425 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
2426 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
2427 # Uncompress modules if not using udev and native modprobe
2428 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2429 if [ "`echo "$i" | grep -F ".gz"`" ]; then
2430 echo "Uncompressing $i" >> $LOGFILE
2431 gunzip -f $mountpoint/$i
2432 fi
2433 fi
2434 done
2435
2436 # Also copy modules.dep in case of udev so that normal modprobe works
2437 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
2438
2439 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
2440 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2441 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2442 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2443 rm -f $mountpoint/sbin/devfsd
2444 fi
2445 cd $old_pwd
2446 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2447 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2448 rm -f $mountpoint/zero
2449 if [ _"$MONDO_SHARE" != _"" ]; then
2450 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
2451 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2452 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
2453 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2454 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2455 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
2456 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
2457 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2458 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2459 fi
2460 mkdir -p $mountpoint/proc
2461 echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
2462
2463 echo "---------------------------" >> $LOGFILE
2464 echo "Content of initial ramdisk:" >> $LOGFILE
2465 echo "---------------------------" >> $LOGFILE
2466 (cd $mountpoint ; ls -Rla ) >> $LOGFILE
2467 echo "---------------------------" >> $LOGFILE
2468
2469 # Determine what filesystem to use for initrd image
2470 echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2471 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2472 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2473 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2474 # say what will be used
2475 echo "Creating an $gvFileSystem initrd image..." >> $LOGFILE
2476 # kernel expects linuxrc in ext2 filesystem
2477 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2478 # unmount loop filesystem and create image file using the standard approach
2479 umount $mountpoint || Die "Cannot unmount $tempfile"
2480 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2481 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2482 ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2483 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2484 rm -f ${rdz_fname}.tmp
2485 # log that we are done
2486 echo "...done." >> $LOGFILE
2487 elif [ "$gvFileSystem" = "initramfs" ]; then
2488 # say what will be used
2489 echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
2490 # make sure that cpio is there
2491 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2492 # go into filesystem
2493 cd $mountpoint
2494 # kernel expects init in cpio filesystem
2495 ln -sf sbin/init init
2496 # create cpio image file and unmount loop filesystem
2497 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2498 cd $old_pwd
2499 umount $mountpoint || Die "Cannot unmount $tempfile"
2500 # log that we are done
2501 echo "...done." >> $LOGFILE
2502 else
2503 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2504 fi
2505
2506 if [ "$res" -eq "0" ] ; then
2507 echo -en "..."
2508 else
2509 echo -en "\rMade an rdz WITH ERRORS. \n"
2510 fi
2511 return 0
2512}
2513
2514
2515##############################################################################
2516#----------------------------------- Main -----------------------------------#
2517##############################################################################
2518
2519# Now we can create what we need
2520mkdir -p $MINDI_TMP
2521
2522# Purge from potential old run
2523if [ _"$MINDI_CACHE" = _"" ]; then
2524 Die "MINDI_CACHE undefined"
2525fi
2526
2527if [ "$1" = "--printvar" ] ; then
2528 shift
2529 if [ _"$1" != _"" ] ; then
2530 set | grep -Ew "^$1" | cut -d= -f2
2531 fi
2532 exit 0
2533fi
2534
2535> $LOGFILE
2536echo "mindi v$MINDI_VERSION" >> $LOGFILE
2537echo "$ARCH architecture detected" >> $LOGFILE
2538echo "mindi called with the following arguments:" >> $LOGFILE
2539echo "$@" >> $LOGFILE
2540echo "Start date : `date`" >> $LOGFILE
2541echo "-----------------------------" >> $LOGFILE
2542
2543[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2544
2545# Log some capital variables
2546[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2547echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
2548echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2549echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2550[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2551echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
2552if [ -f $MINDI_CONFIG ]; then
2553 echo "-----------------------------" >> $LOGFILE
2554 echo " Mindi configuration file " >> $LOGFILE
2555 echo "-----------------------------" >> $LOGFILE
2556 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2557 echo "-----------------------------" >> $LOGFILE
2558fi
2559
2560
2561trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2562
2563# Sanity checks
2564which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2565which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2566which 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."
2567which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2568if which awk &> /dev/null ; then
2569 if ! which gawk &> /dev/null ; then
2570 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"
2571 fi
2572fi
2573which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2574[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2575
2576[ "`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"
2577
2578# Update the PATH variable if incomplete
2579if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2580 PATH=$PATH:/sbin:/usr/sbin
2581 export PATH
2582 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2583 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2584 echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2585fi
2586
2587# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2588if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2589 source $MINDI_LIB/FindDistroFailsafe
2590 # Log kernel image
2591 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2592else
2593 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2594fi
2595
2596if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2597 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2598fi
2599
2600### BERLIOS
2601### Fix as it's not mandatory on ia64
2602if [ "$ARCH" = "ia64" ] ; then
2603 if which elilo &> /dev/null ; then
2604 LILO_EXE=elilo
2605 else
2606 LILO_EXE=`which false 2> /dev/null`
2607 fi
2608else
2609 FindIsolinuxBinary
2610fi
2611trap "Aborted" SIGTERM
2612DONE="\r\t\t\t\t\t\t\t\tDone. "
2613kernelpath=""
2614MONDO_ROOT=/var/cache/mondo
2615mkdir -p $MONDO_ROOT
2616
2617if [ -d "/proc/lvm" ]; then
2618 # LVM v1
2619 LVMCMD=""
2620 LVM="v1"
2621elif [ -d "/dev/mapper" ]; then
2622 # LVM v2
2623 LVMCMD="lvm"
2624 LVM="v2"
2625else
2626 LVM="false"
2627fi
2628echo "LVM set to $LVM" >> $LOGFILE
2629echo "----------" >> $LOGFILE
2630echo "mount result:" >> $LOGFILE
2631echo "-------------" >> $LOGFILE
2632mount >> $LOGFILE
2633echo "-------------" >> $LOGFILE
2634if [ -e /etc/raidtab ]; then
2635 echo "-------------" >> $LOGFILE
2636 echo "/etc/raidtab content:" >> $LOGFILE
2637 echo "-------------" >> $LOGFILE
2638 cat /etc/raidtab >> $LOGFILE
2639fi
2640echo "-------------" >> $LOGFILE
2641echo "cat /proc/cmdline:" >> $LOGFILE
2642echo "-------------" >> $LOGFILE
2643cat /proc/cmdline >> $LOGFILE
2644echo "-------------" >> $LOGFILE
2645echo "cat /proc/swaps:" >> $LOGFILE
2646echo "-------------" >> $LOGFILE
2647cat /proc/swaps >> $LOGFILE
2648echo "-------------" >> $LOGFILE
2649echo "cat /proc/partitions:" >> $LOGFILE
2650echo "-------------" >> $LOGFILE
2651cat /proc/partitions >> $LOGFILE
2652echo "-------------" >> $LOGFILE
2653echo "cat /proc/filesystems:" >> $LOGFILE
2654echo "-------------" >> $LOGFILE
2655cat /proc/filesystems >> $LOGFILE
2656echo "-------------" >> $LOGFILE
2657echo "lsmod result:" >> $LOGFILE
2658echo "-------------" >> $LOGFILE
2659lsmod >> $LOGFILE
2660MODULES="`cat /proc/modules | $AWK '{print $1}'`"
2661if [ -x /usr/sbin/esxcfg-module ]; then
2662 echo "-------------" >> $LOGFILE
2663 echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2664 echo "-------------" >> $LOGFILE
2665 echo "VMWare modules" >> $LOGFILE
2666 echo "-------------" >> $LOGFILE
2667 /usr/sbin/esxcfg-module -l >> $LOGFILE
2668 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
2669fi
2670echo "FORCE_MODS:" >> $LOGFILE
2671echo "-------------" >> $LOGFILE
2672echo $FORCE_MODS >> $LOGFILE
2673echo "-------------" >> $LOGFILE
2674echo "DENY_MODS:" >> $LOGFILE
2675echo "-------------" >> $LOGFILE
2676echo $DENY_MODS >> $LOGFILE
2677echo "-------------" >> $LOGFILE
2678echo "df result:" >> $LOGFILE
2679echo "----------" >> $LOGFILE
2680df -T >> $LOGFILE
2681echo "-------------" >> $LOGFILE
2682echo "Liste of extra modules is:" >> $LOGFILE
2683echo "$EXTRA_MODS" >> $LOGFILE
2684echo "-------------" >> $LOGFILE
2685
2686# Compute libata version
2687laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
2688# If libata v2 is used then remove ide-generic as it will perturbate boot
2689if [ "`echo $MODULES | grep libata`" ]; then
2690 if [ "$laver" = "2" ]; then
2691 DENY_MODS="$DENY_MODS ide-generic"
2692 echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
2693 echo "-------------" >> $LOGFILE
2694 fi
2695fi
2696
2697# Check for ISO_CMD command
2698if [ ! -x $ISO_CMD ]; then
2699 echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2700fi
2701
2702FLOPPY_WAS_MOUNTED=""
2703for mtpt in /media/floppy /mnt/floppy /floppy ; do
2704 if mount | grep -w $mtpt &> /dev/null ; then
2705 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2706 umount $mtpt
2707 fi
2708done
2709
2710#
2711# If we have a USB device we need to store info
2712# and remove it from the parameters line
2713#
2714if [ "$#" -ne "0" ] ; then
2715 if [ "$1" = "--usb" ] ; then
2716 shift
2717 USBDEVICE=$1
2718 if [ _"$USBDEVICE" = _"" ]; then
2719 Die "No USB device specified"
2720 fi
2721 shift
2722 fi
2723fi
2724
2725if [ "$#" -ne "0" ] ; then
2726 if [ "$1" = "--findkernel" ] ; then
2727 res=`TryToFindKernelPath`
2728 # Avoids logfile content for mondo
2729 export MONDO_SHARE=""
2730 if [ "$res" = "" ] ; then
2731 MindiExit -1
2732 else
2733 echo "$res"
2734 MindiExit 0
2735 fi
2736 elif [ "$1" = "--locatedeps" ] ; then
2737 [ ! "$2" ] && Die "Please specify the binary to look at"
2738 LocateDeps $*
2739 # Avoids logfile content for mondo
2740 export MONDO_SHARE=""
2741 MindiExit $?
2742 elif [ "$1" = "--readalllink" ] ; then
2743 [ ! "$2" ] && Die "Please specify the binary to look at"
2744 ReadAllLink $2
2745 # Avoids logfile content for mondo
2746 export MONDO_SHARE=""
2747 MindiExit $?
2748 elif [ "$1" = "--makemountlist" ] ; then
2749 [ ! "$2" ] && Die "Please specify the output file"
2750 MakeMountlist $2
2751 CheckMountlist $2
2752 # Avoids logfile content for mondo
2753 export MONDO_SHARE=""
2754 MindiExit $?
2755 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2756 echo "Mindi v$MINDI_VERSION"
2757 # Avoids logfile content for mondo
2758 export MONDO_SHARE=""
2759 MindiExit 0
2760 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2761 MONDO_TMP=$2
2762 # Change MINDI_TMP for the one provided by mondo
2763 # So that it can get back the built files
2764 if [ _"$MONDO_TMP" = _"" ]; then
2765 Die "MONDO_TMP is empty, aborting"
2766 fi
2767 if [ _"$MONDO_TMP" = _"/" ]; then
2768 Die "MONDO_TMP is /, aborting"
2769 fi
2770 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2771 rmdir $MINDI_TMP
2772 export MINDI_TMP=$MONDO_TMP
2773 mkdir -p $MINDI_TMP
2774
2775 # This is the scratch dir in mondo - subdir images
2776 MINDI_CACHE=$3
2777
2778 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2779###
2780### Sq-Modification...
2781### Attempt to locate kernel specific module path
2782### if module path is found then use it other wise use uname -r to set it...
2783###
2784 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2785 LogIt "kernelname = $kernelname"
2786 LogIt "kernelpath = $kernelpath"
2787 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2788 then
2789 LogIt "Module path for ${kernelpath} not found..."
2790 LogIt "using running kernel\'s modules."
2791 kernelname=$KERVERRUN
2792 else
2793 LogIt "Using modules for kernel: ${kernelname}"
2794 fi
2795###
2796### end of Sq-Modification
2797###
2798 TAPEDEV=$5
2799 TAPESIZE=$6
2800 FILES_IN_FILELIST=$7
2801 USE_LZO=$8
2802 CDRECOVERY=$9
2803 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2804 IMAGE_DEVS=""
2805 else
2806 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2807 fi
2808 if [ "${11}" ] ; then
2809 LILO_OPTIONS=""
2810 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2811 fi
2812 LAST_FILELIST_NUMBER=${12}
2813 ESTIMATED_TOTAL_NOOF_SLICES=${13}
2814 export EXCLUDE_DEVS="${14}"
2815 USE_COMP="${15}"
2816 USE_LILO="${16}"
2817 USE_STAR="${17}"
2818 INTERNAL_TAPE_BLOCK_SIZE="${18}"
2819 DIFFERENTIAL="${19}"
2820 USE_GZIP="${20}"
2821 NOT_BOOT="${21}"
2822 [ "$USE_COMP" = "" ] && USE_COMP=yes
2823 [ "$USE_GZIP" = "" ] && USE_GZIP=no
2824 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
2825 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
2826 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2827 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2828 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2829 then
2830 LogIt "Module path for ${kernelpath} not found..."
2831 LogIt "using running kernel\'s modules."
2832 kernelname=$KERVERRUN
2833 else
2834 LogIt "Using modules for kernel: ${kernelname}"
2835 fi
2836 # MONDO_ROOT is the real scratchdir
2837 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2838 if [ _"$MONDO_ROOT" != _"" ]; then
2839 mkdir -p $MONDO_ROOT
2840 else
2841 Die "MONDO_ROOT is undefined"
2842 fi
2843 else
2844 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2845 MindiExit -1
2846 fi
2847fi
2848
2849if [ _"$MINDI_CACHE" != _"" ]; then
2850 rm -rf $MINDI_CACHE/* 2> /dev/null
2851 mkdir -p $MINDI_CACHE
2852fi
2853
2854[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2855
2856if [ _"$MONDO_SHARE" = _"" ]; then
2857 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2858 LogIt "Latest Mindi is available from http://www.mondorescue.org"
2859 LogIt "BusyBox sources are available from http://www.busybox.net"
2860 LogIt "------------------------------------------------------------------------------"
2861else
2862 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
2863fi
2864if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2865 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2866else
2867 LogIt "Unable to find mindi-busybox, please install it"
2868 MindiExit -1
2869fi
2870
2871# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
2872insmod /lib/modules/$KERVERRUN/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
2873for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2874 insmod $i >> $LOGFILE 2>> $LOGFILE
2875done
2876
2877KERN_DISK_MADE=""
2878
2879echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2880echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2881echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2882if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
2883 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
2884 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2885 MakeMountlist $MINDI_TMP/mountlist.txt
2886 CheckMountlist $MINDI_TMP/mountlist.txt
2887 mkdir -p $MINDI_TMP/small-all/tmp
2888 cd $MINDI_TMP/small-all
2889 cp -f $MINDI_TMP/{mountlist.txt,mondo-restore.cfg,filelist.full.gz,biggielist.txt} tmp 2>> $LOGFILE || Die "Cannot copy small all.tar.gz"
2890 tar -cv ./tmp | gzip -9 > $MINDI_TMP/all.tar.gz 2>> $MINDI_TMP/$$.log || Die "Cannot make small all.tar.gz" $MINDI_TMP/$$.log
2891 sleep 2
2892 LogIt "Done. Exiting."
2893 MindiExit 0
2894fi
2895
2896if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2897 LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
2898fi
2899
2900if [ "$kernelpath" = "" ] ; then
2901 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2902 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2903 read ch
2904 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2905 USE_OWN_KERNEL="yes"
2906 else
2907 USE_OWN_KERNEL="no"
2908 fi
2909 if [ "$USE_OWN_KERNEL" = "yes" ]; then
2910 YOUR_KERNEL_SUCKS=""
2911 kernelpath=`TryToFindKernelPath`
2912 if [ "$kernelpath" = "" ] ; then
2913 echo -n "Please enter kernel path : "
2914 read kernelpath
2915 fi
2916 else
2917 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
2918 fi
2919fi
2920if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
2921 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2922 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2923 source $MINDI_LIB/FindDistroFailsafe
2924 # Log kernel image
2925 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2926 kernelpath="$FAILSAFE_KBIN"
2927 LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2928 LogIt "The failsafe kernel is $kernelpath.\n"
2929 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2930 LogIt "disks then it may still be a result of a problem with your kernel.\n"
2931 pwd=`pwd`
2932 cd $MINDI_TMP
2933 mkdir -p lib/modules
2934 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2935 cd $pwd
2936 else
2937 kernelpath=$MINDI_LIB/vmlinuz
2938 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2939 LogIt "However, you are still running your kernel. If Mindi fails to create your"
2940 LogIt "disks then it may still be a result of a problem with your kernel."
2941 pwd=`pwd`
2942 cd $MINDI_TMP
2943 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2944 cd $pwd
2945 fi
2946 YOUR_KERNEL_SUCKS="Your kernel sucks"
2947fi
2948echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
2949[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
2950
2951[ "$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."
2952
2953PrepareDataDiskImages
2954
2955ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2956rds=$(($ramdisk_size-$((ramdisk_size%4096))))
2957export ramdisk_size=$rds
2958
2959echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
2960if [ "$ARCH" = "ia64" ] ; then
2961 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
2962else
2963 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2964fi
2965
2966[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2967...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2968
2969if [ _"$MONDO_SHARE" = _"" ]; then
2970 ListImagesForUser
2971 OfferToMakeBootableISO
2972 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2973 OfferToMakeBootableUSB
2974 fi
2975 LogIt "Finished."
2976elif [ "$TAPEDEV" ] ; then
2977 if [ "$ARCH" != "ia64" ] ; then
2978 # We need to keep the img file as boot file for ia64 platform
2979 rm -f $MINDI_CACHE/{*img,*iso}
2980 else
2981 rm -f $MINDI_CACHE/*iso
2982 fi
2983 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2984 OfferToMakeBootableUSB
2985 fi
2986 OfferToMakeBootableISO
2987 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2988 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2989 else
2990 Die "Cannot find all.tar.gz, to be written to tape"
2991 fi
2992elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2993 OfferToMakeBootableUSB
2994else
2995 OfferToMakeBootableISO
2996fi
2997# cleanup
2998LogIt "$FRIENDLY_OUTSTRING"
2999for mtpt in $FLOPPY_WAS_MOUNTED ; do
3000 mount $mtpt
3001done
3002MindiExit 0
Note: See TracBrowser for help on using the repository browser.