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

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

r3783@localhost: bruno | 2010-04-11 11:57:27 +0200

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