source: MondoRescue/branches/2.2.10/mindi/mindi@ 2588

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

r3715@localhost: bruno | 2010-03-03 11:01:10 +0100

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