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

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