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

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

svn merge -r 2523:2545 /mondorescue/branches/2.2.9

  • Adds the --rescue flag to ntfsclone (Andree Leidenfrost andree_at_debian.org)
  • Fix 2 typos in the HOWTO (reported by Bram Mertens bram-mertens_at_linux.be)
  • Patch from Rogério Brito rbrito_at_ime.usp.br which fixes errors in man pages format
  • Fix syntax issue in analyze-my-lvm
  • Better doc for pre and post
  • Finally the function ListLvmDrivesAndPartitions is used, as it creates info parsed by mindi !! So reverting back to filter excluded devices in it
  • Better exclusion of the LVs from the mountlist at restore time if excludedevs used
  • Exclude LVs whose VGs are excluded now in analyze-my-lvm
  • First attempt to support device exclusion at restore time through a new boot param excludedevs
  • Fix a bug preventing execution of the pre script in init
  • LVM exclusion based on devices was flawed as the function targeted was not really useful. That script shold be fully rewritten to have a data structure contaiing what is needed. Anyway the current patch should allow to have some improvements
  • Do not report Duplicate mount point when lvm is used
  • each device of the EXCLUDE_DEVS list is now used correctly and partitions found on this device are excluded
  • Fix the way the dsf is declared in the linked list to have it work
  • Fix #383 by using pvdisplay instead of relying on 8e as partition type
  • Try to fix #384 by always excluding the dfs per users wish
  • Also use the exclude dev feature in case of multipath and exclude resulting /dev/mapper/mpath type of files
  • Fix #381 by postfixing spaces at the end of the strings to be cheked in strstr
  • 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 2546 2010-01-21 19:50:00Z bruno $
4#
5#-----------------------------------------------------------------------------
6# mindi - mini-Linux distro based on the user's filesystem & distribution
7#
8# Mindi can create a multi-image boot/root kit. The first image is the boot
9# disk: it contains a kernel, a ramdisk etc. The second disk is data disk #1;
10# the third disk is data disk #2; and so it goes.
11#
12# See http://www.mondorescue.org for details.
13#-----------------------------------------------------------------------------
14
15### Which arch are we on (useful for ia64 port)
16ARCH=`/bin/uname -m`
17KERVERRUN=`/bin/uname -r`
18# By default we use the running kernel as a reference
19KERVER=$KERVERRUN
20
21# In case of problem with udev you can try to add udevdebug
22ADDITIONAL_BOOT_PARAMS="devfs=nomount noresume selinux=0 barrier=off udevtimeout=10"
23
24MINDI_REV=PBREV
25MINDI_VER=PBVER
26
27MINDI_VERSION=${MINDI_VER}-r$MINDI_REV
28MINDI_PREFIX=XXX
29MINDI_CONF=YYY
30MINDI_SBIN=${MINDI_PREFIX}/sbin
31MINDI_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 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"
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"
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 vmnet exportfs fuse libcrc32c crc32c"
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"
65# Replace with that line for HP OCMP e.g.
66#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
67DENY_MODS="kqemu"
68# Force some modules to be included
69FORCE_MODS=""
70
71LOGFILE=/var/log/mindi.log
72BOOT_MEDIA_MESSAGE="\
73To format and restore all files automatically, type 'nuke' <enter>.\n\
74To restore some/all files interactively, type 'interactive' <enter>.\n\
75To compare the archives with your filesystem, type 'compare' <enter>.\n\
76To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
77You may add one or more of the following parameters as well:-\n\n\
78 donteject - mondorestore will not eject the CD; this is useful if, for\n\
79 instance, your PC's case has a concealed CD-ROM drive\n\
80 noresize - your mountlist will not be adjusted to use your unallocated\n\
81 hard disk space\n\
82 textonly - do not call any Newt library routines; this is unattractive\n\
83 but valuable if you find your Newt library has bugs in it\n\n\
84e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
85a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
86"
87FDISK=$MINDI_SBIN/parted2fdisk
88
89# Using a config file allow to overwrite some values
90MINDI_CONFIG="$MINDI_CONF/mindi.conf"
91if [ -f $MINDI_CONFIG ]; then
92 . $MINDI_CONFIG
93fi
94DEPLIST_FILE="$MINDI_CONF/deplist.conf"
95DEPLIST_FILE_MIN="$MINDI_CONF/deplist-minimal.conf"
96DEPLIST_DIR="$MINDI_CONF/deplist.d"
97
98ISO_CMD="/usr/bin/mkisofs"
99ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
100
101# Mandriva system e.g. use cdrkit, which uses genisoimage instead of mkisofs.
102# However, they use exactly the same command line parameters, so just
103# use genisoimage if it's available.
104if [ ! -x $ISO_CMD ]; then
105 ISO_CMD=/usr/bin/genisoimage
106fi
107
108# Now we can create what we need
109MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
110if [ $? -ne 0 ]; then
111 df $TMPDIR
112 Die "Unable to create a temporary directory ! Check space on $TMPDIR"
113fi
114if [ _"$MINDI_TMP" = _"" ]; then
115 Die "MINDI_TMP is empty, aborting"
116fi
117if [ _"$MINDI_TMP" = _"/" ]; then
118 Die "MINDI_TMP is /, aborting"
119fi
120export MINDI_TMP
121
122# ----------------------------------------------------------------------------
123
124
125AbortHere() {
126 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
127 Die "Program is terminating in response to signal received from OS/user"
128}
129
130
131Aborted() {
132 trap SIGHUP SIGTERM SIGTRAP SIGINT
133 [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
134 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
135 Die "User abort."
136}
137
138
139AddFileToCfgIfExists() {
140 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
141}
142
143
144AddKeyboardMappingFile() {
145 local mappath r included_list included_item i res ii sss
146 mappath=$1
147 KBDEPTH=$(($KBDEPTH+1))
148 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
149 if [ -e "$bigdir/$mappath" ] ; then
150 LogFile "$mappath already added"
151 return
152 elif [ -d "$bigdir/$mappath" ] ; then
153 echo "Cannot add $mappath: it's a directory. Sorry."
154 return
155 fi
156 LogFile "Added kbd map $mappath"
157 if [ ! -e "$mappath" ] ; then
158 mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
159 if [ ! -e "$mappath" ] ; then
160 LogAll "Cannot add $mappath: kbd map file not found"
161 return
162 fi
163 fi
164
165 mkdir -p $bigdir/etc
166 tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogAll "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
167 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
168 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
169 else
170 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
171 fi
172 for included_item in $included_list ; do
173 if [ ! -e "$included_item" ] ; then
174 sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
175 [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
176 for ii in $sss ; do
177 [ -e "$ii" ] && AddKeyboardMappingFile $ii
178 done
179 else
180 AddKeyboardMappingFile $included_item
181 fi
182 done
183}
184
185
186CopyDependenciesToDirectory() {
187 local outdir incoming fname counter d found
188 outdir=$1
189 noof_lines=$2
190 mkdir -p $outdir
191 incoming=`ReadLine`
192 progress=0
193 while [ "$incoming" != "" ] ; do
194 # Non absolute file names should not arrive till here => skipped
195 if [ `echo "$incoming" | cut -c1` != '/' ]; then
196 LogAll "Unable to handle $incoming"
197 incoming=`ReadLine`
198 continue
199 fi
200 # no parent directory of incoming should be a link, copy is not possible in that case
201 d=`dirname "$incoming"`
202 found="false"
203 while [ $d != "/" -a $found = "false" ]; do
204 [ -h "$d" ] && found="true"
205 d=`dirname "$d"`
206 done
207 if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
208 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir 0
209 elif [ -e "$incoming" ] && [ $found = "false" ]; then
210 tar cf - -C / $incoming 2>> $MINDI_TMP/$$.log | (cd $outdir ; tar xf -) || Die "Cannot copy $incoming to $outdir - did you run out of disk space?" $MINDI_TMP/$$.log
211
212 # Only uncompress modules if not using udevd
213 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
214 gunzip -f $outdir/$incoming || LogAll "Cannot gunzip $outdir/$incoming"
215 fi
216 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
217 progress=$(($progress+1))
218 LogProgress $progress $noof_lines
219 fi
220 incoming=`ReadLine`
221 done
222}
223
224
225CountItemsIn() {
226 local r
227 r=0
228 for q in $1 ; do
229 r=$(($r+1))
230 done
231 echo $r
232}
233
234
235# Last function called before exiting
236# Parameter is exit code value
237MindiExit() {
238 local my_partitions
239
240 LogFile "Mindi $MINDI_VERSION is exiting"
241 LogFile "End date : `date`"
242 if [ _"$MONDO_SHARE" != _"" ] ; then
243 echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
244 cat $LOGFILE >> /var/log/mondoarchive.log
245 echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
246 fi
247
248 cd /
249 sync&
250
251 # Unmount what could remain mounted
252 my_partitions=`mount | grep -F $MINDI_TMP | cut -f1 -d' '`
253 [ "$my_partitions" != "" ] && umount $my_partitions
254 # Clean temporary files only when standalone mindi
255 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
256 rm -Rf $MINDI_TMP
257 fi
258 exit $1
259}
260
261Die() {
262 local i
263 if [ "$1" = "" ] ; then
264 LogAll "FATAL ERROR"
265 else
266 LogAll "FATAL ERROR. $1"
267 fi
268 if [ _"$2" != _"" ]; then
269 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
270 fi
271 rm -f "$2"
272
273 LogAll "Please e-mail a copy of $LOGFILE to the mailing list."
274 LogAll "See http://www.mondorescue.org for more information."
275 LogAll "WE CANNOT HELP unless you enclose that file.\n"
276 MindiExit -1
277}
278
279
280DropOptimizedLibraries() {
281 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res progress
282 filelist=$1
283 outdir=$2
284
285 progress=0
286 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
287 if [ "$list_of_optimized_libraries" = "" ] ; then
288 return 0
289 else
290 noof_lines=`echo $list_of_optimized_libraries | tr ' ' '\n' | wc -l`
291 fi
292 echo -en "Dropping i686-optimized libraries if appropriate"
293 for optimized_lib_name in $list_of_optimized_libraries ; do
294 reason=""
295 vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
296 echo "$vanilla_lib_name" >> $filelist
297 LogFile "Adding $vanilla_lib_name to filelist"
298 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
299 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
300
301 # This may return multiple files
302 for resolved in `ReadAllLink $vanilla_lib_name`; do
303 LogFile "Adding as deps $resolved to filelist"
304 vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
305 mkdir -p $outdir$resolved> /dev/null 2> /dev/null
306 rmdir $outdir$resolved > /dev/null 2> /dev/null
307 ln -sf $vanilla_resolved_name $outdir$resolved
308 LogFile "Excluding deps $resolved"
309 grep -Fvx "$resolved" "$filelist" > $filelist.tmp
310 LogFile "Replacing it with $vanilla_resolved_name"
311 echo "$vanilla_resolved_name" >> $filelist.tmp
312 mv -f $filelist.tmp $filelist
313 done
314 progress=$(($progress+1))
315 LogProgress $progress $noof_lines
316 done
317 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
318 mv -f $filelist.tmp $filelist
319 echo -e "$DONE"
320}
321
322
323FindAndAddUserKeyboardMappingFile() {
324 local r res mapfile mappath included_item included_list keyfile mp locale
325 LogFile "Analyzing your keyboard's configuration."
326 KEYDIR=/lib/kbd
327 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
328 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
329 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
330 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
331 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
332 if [ ! -e "$KEYDIR" ] ; then
333 LogAll "Keyboard mapping directory not found. I shall use default map at boot-time."
334 return 0
335 fi
336 LogFile "Adding the following keyboard mapping tables: "
337 if [ -e "/etc/sysconfig/keyboard" ] ; then
338 LogFile "Red Hat-style config detected."
339 keyfile=/etc/sysconfig/keyboard
340 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
341 LogFile "Slackware-style config detected."
342 keyfile=/etc/rc.d/rc.keymap
343 elif [ -e "/etc/rc.config" ] ; then
344 LogFile "Debian-style config detected."
345 keyfile=/etc/rc.config
346 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
347 LogFile "Debian-style config detected."
348 mkdir -p $bigdir/tmp
349 echo "/etc/console/boottime.kmap.gz" > $MINDI_CACHE/KEYMAP-LIVES-HERE
350 KBDEPTH=0
351 mkdir -p $bigdir/etc/console
352 cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
353 echo -e "$DONE"
354 return 0
355 elif [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
356 LogFile "Ubuntu-style config detected."
357 mkdir -p $bigdir/tmp
358 echo "/etc/console-setup/boottime.kmap.gz" > $MINDI_CACHE/KEYMAP-LIVES-HERE
359 KBDEPTH=0
360 mkdir -p $bigdir/etc/console-setup
361 cp /etc/console-setup/boottime.kmap.gz $bigdir/etc/console-setup 2>> $LOGFILE
362 echo -e "$DONE"
363 return 0
364 elif [ -e "/etc/conf.d/keymaps" ] ; then
365 LogFile "Gentoo-style config detected."
366 keyfile=/etc/conf.d/keymaps
367 else
368 LogAll "Searching for rc.config ..."
369 keyfile=`find /etc -name rc.config | head -n1`
370 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
371 LogAll "Unknown config detected. Default keyboard map will be used."
372 return
373 else
374 LogFile "Found $keyfile"
375 fi
376 fi
377 if [ ! -e "$KEYDIR/keymaps" ] ; then
378 LogAll "Keyboard mapping directory not found. Default keyboard map will be used."
379 return
380 fi
381 LogFile "keyfile=$keyfile"
382 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
383 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
384 [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2` # Gentoo
385 LogFile "locale=$locale"
386 #
387 # Process the keymaps dir once for all
388 # AddKeyboardMappingFile will use it recursively
389 #
390 find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
391 mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
392 [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
393 # If we have multiple keymaps then log it !!
394 echo "$mp" | grep -q " " >> $LOGFILE
395 if [ $? -eq 0 ]; then
396 LogAll "WARNING: Multiple keymaps found: $mp"
397 LogFile "The following one will be used"
398 fi
399 for i in $mp ; do
400 mappath=$i
401 [ -e "$i" ] && [ ! -d "$i" ] && break
402 done
403 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
404 mappath=$(find / -name "*/kbd/keymaps/*/$locale")
405 fi
406 LogFile "mappath = $mappath"
407 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
408 LogAll "Keyboard mapping file not found. Default keyboard map will be used."
409 return
410 fi
411 mkdir -p $bigdir/tmp
412 echo "$mappath" > $MINDI_CACHE/KEYMAP-LIVES-HERE
413 KBDEPTH=0
414 AddKeyboardMappingFile $mappath
415 echo -e "$DONE"
416 rm -f $MINDI_TMP/keymaps.find
417 return 0
418}
419
420
421FindIsolinuxBinary() {
422 ISOLINUX=/usr/lib/isolinux.bin
423 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
424 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
425 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
426 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
427 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
428 [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
429 [ ! -e "$ISOLINUX" ] && Die "Please install isolinux first. If your syslinux RPM doesn't include isolinux, you may download an isolinux RPM from Mondo's website - go to http://www.mondorescue.com and click on 'Download'"
430 LogFile "Found isolinux.bin at $ISOLINUX"
431}
432
433
434FindSpecificModuleInPath() {
435 local modpaths line
436
437 if [ ! -e "$1" ] ; then
438 LogAll "WARNING - cannot search specific path '$1'"
439 return 1
440 fi
441 modpaths=`find $1 -name $2.*o -type f`
442 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.o.gz -type f`
443 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2.ko.gz -type f`
444 [ "$modpaths" = "" ] && modpaths=`find $1 -name $2 -type f`
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
604GetHomeDir() {
605 local res loc
606 loc=`which $1 2>/dev/null`
607 res=`file $loc | $AWK '{print $NF;}'`
608 dirname $res
609}
610
611
612# Check kernel filesystem capabilites for accessing initrd image
613# Could be ext2 FS (old mode) or initramfs (new mode)
614#
615# Interface definition:
616# param #1: absolute path to kernel image
617GetInitrdFilesystemToUse() {
618
619 # interface test: make sure we have one parameter
620 if [ $# -ne 1 ]; then
621 Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
622 fi
623
624 # interface parameters
625 local lvKernelImage=$1
626
627 # local constants (filesystem magic strings)
628 local lcMagicCramfs="<3>cramfs: wrong magic"
629 local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
630 local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
631 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
632initramfs"
633
634 # local variables
635 local lvOffset
636 local lvScanRes
637 local lvUseFilesystem
638
639 # say where we are.
640 LogFile " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage"
641
642 # verify that file exists
643 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
644
645 # Kernel may be gzip compressed
646 file $lvKernelImage 2>&1 | grep -q gzip
647 if [ $? -eq 0 ]; then
648 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
649
650 # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
651 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
652 lvUseFilesystem="ext2fs"
653 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
654 lvUseFilesystem="ext3fs"
655 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
656 lvUseFilesystem="initramfs"
657 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
658 lvUseFilesystem="cramfs"
659 else
660 lvUseFilesystem="UNSUPPORTED"
661 fi
662
663 else
664 # In that case, we are after 2.6.30 and use the supported initramfs
665 lvUseFilesystem="initramfs"
666 fi
667 # say what we are using
668 LogFile " GetInitrdFilesystemToUse(): Filesytem to use for initial ramdisk is $lvUseFilesystem."
669
670 # return file system to use
671 echo "$lvUseFilesystem"
672
673}
674
675# Searches parent raid device of given disk device
676# $1: disk device (i.e. /dev/hda1)
677GetParentRaidDev() {
678 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
679}
680
681
682# Searches members of raid device
683# $1: raid device (/dev/md...)
684GetRaidDevMembers() {
685 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
686}
687
688
689ListAllPartitions() {
690 local res currline partition all_partitions ap_orig remaining i j
691
692 grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
693 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
694 if [ -e "/vmfs/volumes" ]; then
695 # For VMWare ESX 3 get the device names of these volumes
696 vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
697 fi
698 return
699}
700
701
702ListImagesForUser() {
703 local path fname
704 path=$MINDI_CACHE
705 echo -en "In the directory '$path' you will find the images:-\n"
706 for fname in `ls $path | grep -F mindi-` ; do
707 printf "%19s " $fname
708 done
709 echo " "
710}
711
712
713ListKernelModulePaths() {
714 local module_list module fname oss r kern
715 outfile=$1
716 echo -en "Analyzing modules requirements"
717 oss="/root/oss/modules"
718 module_list="$MODULES"
719 # Remove unwanted modules from list
720 for i in $DENY_MODS; do
721 module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
722 EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
723 done
724###
725### Sq-Modification ... Use kernelname for module search path if specified
726###
727 if [ "${kernelname}" != "" ]
728 then
729 kern=${kernelname}
730 else
731 kern="$KERVERRUN"
732 fi
733 export KERVER=$kern
734###
735### Sq-Mod End
736###
737 noof_lines=0
738 # Get rid of duplicates, so that if a live kernel module also appears
739 # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
740 for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
741 noof_lines=$(($noof_lines+1))
742 done
743 progress=0
744 for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
745 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
746 if [ -z "$r" ]; then
747 if [ "`echo "$MODULES" | grep -w $module`" ]; then
748 r="[live module file not found]"
749 else
750 r="[extra module file not found]"
751 fi
752 fi
753 LogFile "module $module --> $r"
754 [ -f "$r" ] && echo "$r" >> $outfile
755 [ -f "$oss" ] && find $oss | grep -F $module >> $outfile
756 progress=$(($progress+1))
757 LogProgress $progress $noof_lines
758 done
759 find /lib/modules/$kern/modules.* -type f 2> /dev/null >> $outfile
760 [ -f "$oss" ] && find $oss.* 2> /dev/null >> $outfile
761}
762
763#
764# Critical function which computes all dependencies (dyn. lib.)
765# for a list of binaries
766#
767LocateDeps() {
768 local incoming fname deps
769 incoming="$*"
770 for fname in $incoming ; do
771 if [ ! -e "$fname" ] ; then
772 LogFile "WARNING - $fname does not exist; cannot be LDD'd."
773 if echo $fname | grep lvm &> /dev/null ; then
774 LogFile "This warning only affects you if you are using LVM."
775 if echo "$MODULES" | grep lvm &> /dev/null ; then
776 LogFile "I think you are, so please take heed!"
777 else
778 LogFile "I don't think you are, so don't worry about it."
779 fi
780 fi
781 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
782 LogFile "$fname is softlink"
783 else
784 ldd $fname 2> /dev/null | ProcessLDD
785 fi
786 done
787}
788
789
790# Give all symlinks recursively of a full path name
791ReadAllLink() {
792
793 incoming="$*"
794
795 for file in $incoming ; do
796 if [ ! -f $file ]; then
797 continue
798 fi
799 echo "$file"
800 if [ ! -h $file ]; then
801 continue
802 fi
803
804 link=`readlink -e $file`
805 d=`dirname $file`
806 fchar=`echo $link | cut -c1`
807 # If mother dir is a link print it
808 if [ -h "$d" ]; then
809 echo "$d"
810 d=`readlink -e $d`
811 fi
812 if [ "$fchar" != "/" ]; then
813 # Relative or local link
814 ReadAllLink "$d/$link"
815 else
816 # Absolute path
817 ReadAllLink $link
818 fi
819 done
820}
821
822
823LocateFile() {
824 local i path fname_to_find location output resolved tmp stub cache_id loclist
825 fname_to_find="$1"
826 # It's an absolute path
827 if echo "$fname_to_find" | grep -x "/.*" ; then
828 output="$fname_to_find"
829 if [ -h "$output" ] ; then
830 output="`ReadAllLink $output` $output"
831 fi
832 echo "$output"
833 return 0
834 fi
835 # It's not an absolute path
836 output=""
837 for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin `find /usr/lib /lib /usr/local/lib /usr/X11R6/lib /usr/lib64 /lib64 /usr/local/lib64 /usr/X11R6/lib64 -type d -maxdepth 1 2> /dev/null` ; do
838 #for path in /etc /usr /usr/bin /usr/sbin /bin /usr/X11R6/bin /sbin /usr/local/bin /usr/local/sbin /usr/lib /usr/lib64 /usr/lib64/* /lib /lib64 /lib64/* /usr/local/lib /usr/local/lib64 /usr/local/lib64/* /usr/X11R6/lib /usr/X11R6/lib64 /usr/X11R6/lib64/* ; do
839 [ -h "$path" ] && continue
840 [ ! -e "$path/$fname_to_find" ] && continue
841 output="$path/$fname_to_find $output"
842 if [ -h "$path/$fname_to_find" ] ; then
843 output="`ReadAllLink $path/$fname_to_find` $output"
844 fi
845 done
846 if [ "$output" = "" ] ; then
847 return 1
848 fi
849 echo "$output"
850 return 0
851}
852
853LogProgress() {
854 local i progress modres noof_lines
855
856 progress=$1
857 noof_lines=$2
858
859 echo -en "\r\t\t\t\t\t\t\t\t"
860 i=$(($progress*100))
861 i=$(($i/$noof_lines))
862 echo -en "$i"
863 echo -en "%"
864 modres=$(($progress%4))
865 [ "$modres" -eq "0" ] && echo -en "\t/"
866 [ "$modres" -eq "1" ] && echo -en "\t-"
867 [ "$modres" -eq "2" ] && echo -en "\t\\"
868 [ "$modres" -eq "3" ] && echo -en "\t|"
869}
870
871# Function to log on screen only
872LogScreen() {
873 if [ -e /dev/stderr ] ; then
874 echo -e "$1" >> /dev/stderr
875 elif [ -e /usr/bin/logger ] ; then
876 /usr/bin/logger -s $1
877 fi
878}
879
880# Function to log in log file only
881LogFile() {
882
883 echo -e "$1" >> $LOGFILE
884 if [ _"$2" != _"" ]; then
885 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
886 fi
887 rm -f "$2"
888}
889
890# Function to log in both screen and logfile
891LogAll() {
892 LogScreen "$1"
893 LogFile "$1" "$2"
894}
895
896
897# Called by TurnTgzIntoRdz, to make mondorestore.cfg
898MakeMondoConfigFile() {
899 local outfile use_lzo use_comp use_star
900 outfile=$1
901 > $outfile
902 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
903 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
904 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
905 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
906 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
907 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
908 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
909 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
910 use_lzma=$USE_LZMA; [ "$use_lzma" = "" ] && use_lzma="no"
911 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
912 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
913 echo "use-lzo $use_lzo" >> $outfile
914 echo "use-lzma $use_lzma" >> $outfile
915 echo "use-star $use_star" >> $outfile
916 echo "use-comp $use_comp" >> $outfile
917 echo "datestamp `date`" >> $outfile
918 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
919 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
920 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
921 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
922 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
923 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
924 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
925}
926
927
928MakeMountlist() {
929 local scratchdir mountlist all_partitions current_partition \
930partition_size partition_format outstring partition_number \
931partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
932absolute_partition old_partition_fmt current_lvolume uname skip
933
934 LogFile "------------------------------------"
935 LogFile "Your raw fstab file looks like this:"
936 LogFile "------------------------------------"
937 cat $MY_FSTAB >> $LOGFILE
938 LogAll "-----------------------------------"
939 LogAll "Your mountlist will look like this:"
940 LogAll "-----------------------------------"
941
942# scratchdir, mountlist(OUT)
943 scratchdir=$MINDI_TMP
944 mountlist=$1
945
946# NB: partition = device
947# NB: mountpt = where the device is mounted
948
949 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
950
951 [ "$mountlist" != "" ] && rm -Rf $mountlist
952 > $mountlist
953 all_partitions=""
954
955 if [ $LVM != "false" ]; then
956 LogFile "Analyzing LVM..."
957 $MINDI_DATA/analyze-my-lvm > $MINDI_TMP/lvm.res
958 if [ $? -ne 0 ]; then
959 LVM="false"
960 fi
961 # Excluded LVs and GVs are not reported here
962 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
963 fi
964 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
965 for i in $IMAGE_DEVS ; do
966 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
967 done
968 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
969 printf "%-15s %-15s %-15s %-15s %s\n" DEVICE MOUNTPOINT FORMAT "SIZE MB" LABEL/UUID | tee -a $LOGFILE
970 printf "%-15s %-15s %-15s %-15s %s\n" ------ ---------- ------ ------- ---------- | tee -a $LOGFILE
971 useless_dev="/dev/floppy /dev/fd0h1440 /dev/fd0H1440 /dev/cdrom /dev/cdrom/cdrom /dev/cdrom/cdrom1 /dev/cdrom/cdrom2 /dev/cdrom0 /dev/cdrom1 /dev/cdrom2 /dev/cdrom3 /dev/cdrw /dev/scd /dev/ram :/ /dev/sr0 /dev/sr1 /dev/cdrom1"
972 for c_p in $all_partitions ; do
973 # Skip evices, network FS, cisf
974 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
975 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
976 if [ -h "$c_p" ] && [ "`echo "$c_p" | grep -F "/dev/hd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/sd"`" = "" ] && [ "`echo "$c_p" | grep -F "/dev/md"`" = "" ] ; then
977 current_partition=`readlink -f $c_p`
978 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
979 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
980 else
981 current_partition="$c_p"
982 fi
983 [ "$c_p" = "none" ] && continue
984 # Debian 5 does that
985 [ "$c_p" = "proc" ] && continue
986 redhat_label=""
987 label=""
988 uuid=""
989 absolute_partition=`readlink -f $c_p`
990 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
991
992 # Detects noauto partitions not mounted and exclude them
993 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
994 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
995 continue
996 fi
997
998 # set default in case we dont't find it
999 str_to_find_fmt_with=$current_partition
1000
1001 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1002 # current_partition contains only first column of /etc/fstab
1003 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
1004 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
1005 actual_dev=""
1006
1007 # 1st try, findfs - the RHEL way of finding labels and their partitions
1008 if [ -x "/sbin/findfs" ]; then
1009 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
1010 fi
1011
1012 # 2nd try : blkid, the good way for all LABEL except swap
1013 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1014 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
1015 # For LVM FS it will give a /dev/dm-# which should then be converted
1016 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1017 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1018 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1019 for dev in `ls /dev/mapper/*`; do
1020 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1021 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1022 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1023 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1024 break
1025 fi
1026 done
1027 fi
1028 fi
1029
1030 # 3rd try, which works on a standard partition (ext2/3), but not on swap
1031 # For LVM gives a /dev/mapper entry
1032 if [ "x$actual_dev" = "x" ]; then
1033 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
1034 fi
1035
1036 # 4th try, with vol_id
1037 # SWAP only
1038 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1039 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
1040 for dev_swap in $list_swaps ; do
1041 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1042 if [ "x$dev_exists" != "x" ]; then
1043 actual_dev=$dev_swap
1044 break;
1045 fi
1046 done
1047 fi
1048
1049 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
1050 # LABEL=SW-cciss/c0d0p3 (RDP)
1051 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
1052 # SWAP only
1053 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
1054 skip=""
1055 uname=$KERVERRUN
1056 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1057 # 2.6.12 needs 16 (FC3)
1058 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1059 # 2.6.19 and upper needs 1052
1060 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1061 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1062 if [ $skip = "" ]; then
1063 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1064 fi
1065 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1066 do
1067 # Location of the swap label for kernel 2.6
1068 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
1069 if [ "x$try_dev_label" = "x$redhat_label" ]; then
1070 actual_dev=$try_dev
1071 fi
1072 done
1073 fi
1074
1075 # Check if one of all those tries has known success
1076 if [ "x$actual_dev" != "x" ]; then
1077 current_partition=$actual_dev
1078 else
1079 Die "Your system uses a LABEL partition ($current_partition), but you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or install findfs|blkid|vol_id"
1080 fi
1081 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1082 # current_partition contains only first column of /etc/fstab
1083 elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
1084 uuid=`echo "$current_partition" | cut -d'=' -f2`
1085 actual_dev=""
1086
1087 # 1st try, findfs - the RHEL way of finding labels and their partitions
1088 if [ -x "/sbin/findfs" ]; then
1089 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1090 fi
1091
1092 # 2nd try : blkid, the good way for all UUID except swap
1093 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
1094 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
1095 # For LVM FS it will give a /dev/dm-# which should then be converted
1096 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
1097 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1098 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
1099 for dev in `ls /dev/mapper/*`; do
1100 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1101 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
1102 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
1103 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
1104 break
1105 fi
1106 done
1107 fi
1108 fi
1109
1110 # 3th try, with vol_id
1111 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
1112 list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1113 for dev in $list_dev ; do
1114 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1115 if [ "x$dev_exists" != "x" ]; then
1116 actual_dev=$dev
1117 break;
1118 fi
1119 done
1120 fi
1121
1122 # 4th try, with dumpuuid (VMWare only ?) for swap
1123 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1124 list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1125 for dev in $list_dev ; do
1126 dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1127 if [ "x$dev_exists" != "x" ]; then
1128 actual_dev=$dev
1129 break;
1130 fi
1131 done
1132 fi
1133
1134 # Check if one of all those tries has known success
1135 if [ "x$actual_dev" != "x" ]; then
1136 current_partition=$actual_dev
1137 else
1138 Die "Your system uses a UUID partition ($current_partition),\nbut you lack the tool to support it.\nPlease replace labels with their correct devices in $MY_FSTAB or\ninstall findfs|blkid|vol_id or\nrelabel the partition with the correct UUID if it's a swap partition."
1139 fi
1140 else
1141 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1142 # they use symlinks in fstab unrelated to what is shown in mount !
1143 if [ _"$partition_mountpt" = _"" ]; then
1144 # set default in case we dont't find it
1145 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
1146 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
1147 str_to_find_fmt_with=$tmpp
1148 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1149 break;
1150 fi
1151 done
1152 fi
1153 fi
1154
1155 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1156 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1157 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1158 # the former is then a link to the latter, so we test whether
1159 # $current_partition is actually such a link or not and set
1160 # $current_lvolume accordingly. On Debian you may find more than one answer
1161 # so we remove the one corresponding to /dev/.static
1162 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1163 # principle is the same and we need to find the link to it as well.
1164 # Note that $current_lvolume may well be an
1165 # ordinary device. It is just to make sure that we feed the right value
1166 # into any of the LVM tools if possible.
1167
1168 current_lvolume="$current_partition"
1169 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
1170 # .static dir are a Debian specificity
1171 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
1172 echo $current_lvolume | grep -q ' '
1173 if [ $? -eq 0 ]; then
1174 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
1175 fi
1176 # if it's not found, it may well be a real device such as a multipath one
1177 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1178 if [ _"$current_lvolume" = _"" ]; then
1179 current_lvolume="$current_partition"
1180 fi
1181 fi
1182 #
1183 # End of LVM device style variation code (other than $current_lvolume).
1184
1185 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1186 # Size computed via LVM not directly
1187 partition_size="lvm"
1188 else
1189 partition_size=`SizeOfPartition $current_partition`
1190 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1191 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1192 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1193 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1194 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1195 [ "$partition_format" != "swap" ] && partition_format="swap"
1196 if [ "$partition_size" = "" ] ; then
1197 totalsize=0
1198 items=0
1199 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1200 totalsize=$(($totalsize+$i))
1201 items=$(($items+1))
1202 done
1203 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1204 [ "$partition_size" -lt "125000" ] && partition_size=125000
1205 LogFile "I'm guessing $c_p is $(($partition_size/1024))MB"
1206 fi
1207 fi
1208 fi
1209 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1210 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1211 if [ "$partition_mountpt" = "" ] ; then
1212 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1213 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1214 partition_mountpt="raid"
1215 partition_format="raid"
1216 else
1217 partition_mountpt="lvm"
1218 partition_format="lvm"
1219 fi
1220 fi
1221 fi
1222 psz=$partition_size
1223 LogFile "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
1224 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1225 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1226 partition_mountpt="image"
1227 old_partition_fmt=$partition_format
1228 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1229 partition_size=$(($partition_size+1)); # just in case
1230 if [ "$partition_format" = "Linux" ] ; then
1231 LogFile "Are you imaging a mounted swap partition? Silly..."
1232 LogFile "Reverting format from $old_partition_fmt to $partition_format"
1233 partition_format=$old_partition_fmt
1234 fi
1235 fi
1236 skip=0
1237 if [ "$EXCLUDE_DEVS" ] ; then
1238 for d in $EXCLUDE_DEVS ; do
1239 if [ "`echo " $current_partition " | grep " $d"`" != "" ]; then
1240 LogFile "Excluding $current_partition from mountlist (due to excluded device $d)"
1241 skip=1
1242 continue
1243 fi
1244 done
1245 fi
1246 if [ $skip -eq 1 ]; then
1247 continue
1248 fi
1249 if [ ! "$partition_mountpt" ] ; then
1250 LogFile "------- $FDISK -l $qq log ------------"
1251 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
1252 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1253 [ "$partition_format" ] && break
1254 done
1255 LogFile "------- $FDISK log end ------------"
1256 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1257 partition_format="compaq"
1258 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1259 LogAll "Unable to find mountpoint of $current_partition - ignoring"
1260 continue
1261 fi
1262 fi
1263 if [ "$redhat_label" ]; then
1264 label="$redhat_label"
1265 elif [ "$uuid" ]; then
1266 label="$uuid"
1267 fi
1268 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
1269 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
1270 unofficial_outstring=`printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
1271 if [ "$current_partition" = "" ] ; then
1272 LogFile "Unknown partition (outstring = $unofficial_outstring)"
1273 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1274 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1275 partition_mountpt=raid
1276 partition_format=raid
1277 printf "%-15s %-15s %-15s %7s %15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1278 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1279 else
1280 LogFile "Unknown mountpoint (outstring = $unofficial_outstring)"
1281 fi
1282 elif [ "$partition_format" = "" ] ; then
1283 LogFile "Unknown format (outstring = $unofficial_outstring)"
1284 elif [ "$partition_size" = "" ] ; then
1285 LogFile "Unknown partition size (outstring = $unofficial_outstring)"
1286 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1287 continue
1288 else
1289 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
1290 LogFile "vfat should be used instead of dos/msdos as a partition format"
1291 partition_format="vfat"
1292 fi
1293 printf "%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1294 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
1295 fi
1296 done
1297 LogAll "-----------------------------------"
1298}
1299
1300CheckMountlist() {
1301 local file=$1
1302 # Coherency verification
1303 ML01=`cat $file | wc -l`
1304 ML02=`cat $file | grep -v ' lvm ' | wc -l`
1305 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1306 ML2=`$AWK '{print $2}' $file | grep -v ' lvm ' | sort -u | wc -l`
1307 if [ "$ML01" -ne "$ML1" ]; then
1308 LogFile "--------------------------------------------"
1309 echo "WARNING: Duplicate device entry in mountlist" | tee -a $LOGFILE
1310 LogFile "--------------------------------------------"
1311 fi
1312 if [ "$ML02" -ne "$ML2" ]; then
1313 LogFile "--------------------------------------------"
1314 echo "WARNING: Duplicate mountpoint entry in mountlist" | tee -a $LOGFILE
1315 LogFile "------------------------------------------------"
1316 fi
1317}
1318
1319MakeSureNumberIsInteger() {
1320 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1321 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1322 echo "result = '$res'"
1323 Die "$1 should be an integer"
1324 fi
1325}
1326
1327
1328OfferToMakeBootableISO() {
1329 local i old_pwd
1330 if [ -z "$ISO_CMD" ]; then
1331 LogIt "Neither mkisofs nor genisoimage found, unable to make CD image"
1332 return
1333 fi
1334 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1335 echo -en "Shall I make a bootable CD image? (y/[n]) "
1336 read i
1337 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1338 fi
1339 rm -Rf $MINDI_TMP/iso
1340 mkdir -p $MINDI_TMP/iso/{images,archives}
1341 cp -f $MINDI_CACHE/{*.gz,*.img} $MINDI_TMP/iso/images 2>> $LOGFILE || LogAll "OfferToMakeBootableISO: Cannot copy $MINDI_CACHE/*.gz to $MINDI_TMP/iso/images"
1342 LogFile "mindi_lib = $MINDI_DATA"
1343 for i in memdisk memtest.bin memtest.img ; do
1344 j=$MINDI_DATA/$i
1345 k=$MINDI_TMP/iso
1346 if [ -e "$j" ] ; then
1347 LogAll "Copying $j to $k"
1348 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1349 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1350 if [ _"$MONDO_SHARE" != _"" ]; then
1351 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1352 fi
1353 fi
1354 done
1355 MakeMessageFile > $MINDI_TMP/iso/message.txt
1356 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?"
1357 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?"
1358 if [ _"$MONDO_SHARE" != _"" ]; then
1359 cp $kernelpath $MONDO_ROOT/vmlinuz 2>> $LOGFILE || Die "Cannot copy vmlinuz ($kernelpath) to mondo root ($MONDO_ROOT/vmlinuz). Did you run out of disk space?"
1360 cp $MINDI_TMP/initrd.img $MONDO_ROOT/initrd.img 2>> $LOGFILE || Die "Cannot copy initrd.img ($MINDI_TMP/initrd.img) to $MONDO_ROOT/initrd.img. Did you run out of disk space?"
1361 fi
1362 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
1363 if [ "$ARCH" != "ia64" ] ; then
1364 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?"
1365 fi
1366 old_pwd=`pwd`
1367 cd $MINDI_TMP/iso
1368 if [ "$ARCH" != "ia64" ] ; then
1369 if [ _"$MONDO_SHARE" != _"" ]; then
1370 cp -f $MINDI_TMP/iso/{isolinux.cfg,initrd.img,vmlinuz,isolinux.bin,message.txt} $MONDO_ROOT 2>> $LOGFILE || Die "Cannot copy core files to ramdisk for boot disk (under $MONDO_ROOT). Did you run out of disk space?"
1371 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
1372 fi
1373 $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
1374 else
1375 $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
1376 rm -f images/mindi-bootroot.$BOOT_SIZE.img
1377 fi
1378 if [ "$?" -ne "0" ] ; then
1379 LogFile "----------- $ISO_CMD's errors --------------"
1380 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
1381 echo "$ISO_CMD returned the following errors:-"
1382 cat $MINDI_TMP/mkisofs.log
1383 LogAll "Failed to create ISO image."
1384 else
1385 LogAll "Created bootable ISO image at $MINDI_CACHE/mindi.iso"
1386 fi
1387 rm -f $MINDI_TMP/mkisofs.log
1388 cd $old_pwd
1389}
1390
1391
1392OfferToMakeBootableUSB() {
1393 local i
1394 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
1395 echo -n "Shall I make a bootable USB image ? (y/[n]) "
1396 read i
1397 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1398 if [ "$USBDEVICE" = "" ]; then
1399 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1400 read dev
1401 USBDEVICE=$dev
1402 fi
1403 echo "WARNING: This will erase all content on $USBDEVICE"
1404 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
1405 read i
1406 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1407 fi
1408 rm -Rf $MINDI_TMP/usb
1409 mkdir -p $MINDI_TMP/usb
1410 USBPART="${USBDEVICE}1"
1411
1412 echo -en "Transforming $USBDEVICE in a Bootable device "
1413 echo -en "."
1414 LogFile "Transforming $USBDEVICE in a Bootable device"
1415 LogFile "Checking $USBDEVICE"
1416 $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
1417 if [ $? -ne 0 ]; then
1418 LogAll "Unable to access $USBDEVICE"
1419 LogAll "Make sure your USB device is pluged in"
1420 exit -1
1421 fi
1422 echo -en "."
1423 # Some distro do auto mount at that point (Ubuntu)
1424 LogFile "Unmounting $USBPART just in case"
1425 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1426 # If your key has no MBR it may cause an issue
1427 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
1428 LogFile "Preparing $USBDEVICE"
1429 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
1430d
1431d
1432d
1433d
1434n
1435p
14361
1437
1438
1439t
1440b
1441a
14421
1443w
1444EOF
1445 if [ $? -ne 0 ]; then
1446 LogAll "Unable to create a vfat Filesystem on $USBDEVICE"
1447 LogAll "Make sure your USB device is pluged in"
1448 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1449 MindiExit -1
1450 fi
1451 LogFile "The USB device $USBDEVICE now looks like this:"
1452 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1453 echo -en "."
1454 # Some distro do auto mount at that point (Ubuntu)
1455 LogFile "Unmounting $USBPART just in case again"
1456 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1457 echo -en "."
1458 LogFile "Creating a vfat filesystem on $USBPART"
1459 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
1460 if [ $? -ne 0 ]; then
1461 LogAll "Unable to create a vfat filesystem on $USBPART"
1462 LogAll "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)"
1463 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1464 MindiExit -1
1465 fi
1466 echo -en "."
1467 LogFile "Mounting $USBPART on $MINDI_TMP/usb"
1468 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1469 if [ $? -ne 0 ]; then
1470 LogAll "Unable to mount $USBPART on $MINDI_TMP/usb"
1471 LogAll "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)"
1472 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1473 MindiExit -1
1474 fi
1475 echo -en "."
1476 mkdir -p $MINDI_TMP/usb/images
1477 cp -f $MINDI_CACHE/*.img $MINDI_CACHE/*.gz $MINDI_TMP/usb/images 2>> $LOGFILE || LogAll "OfferToMakeBootableUSB: Cannot copy $i to $MINDI_TMP/usb/images"
1478 echo -en "."
1479 LogFile "mindi_lib = $MINDI_DATA"
1480 for i in memdisk memtest.bin memtest.img ; do
1481 j=$MINDI_DATA/$i
1482 k=$MINDI_TMP/usb
1483 if [ -e "$j" ] ; then
1484 LogAll "Copying $j to $k"
1485 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1486 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
1487 fi
1488 done
1489 echo -en "."
1490 MakeMessageFile > $MINDI_TMP/usb/message.txt
1491 echo -en "."
1492 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?"
1493 echo -en "."
1494 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
1495 echo -en "."
1496 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
1497 echo -en "."
1498 LogAll "----------- syslinux's conf --------------"
1499 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1500 LogAll "------------------------------------------"
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 $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} $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/tmp/i-want-my-lvm
1850 if [ "$?" -ne "0" ]; then
1851 LVM="false"
1852 rm -f $bigdir/tmp/i-want-my-lvm
1853 fi
1854 fi
1855
1856 if [ _"$MONDO_SHARE" != _"" ]; then
1857 for q in filelist.full.gz biggielist.txt ; do
1858 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1859 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1860 done
1861 fi
1862
1863 echo -en "Tarring and zipping the data content..."
1864 size_of_all_tools=`du -sk $bigdir | cut -f1`
1865 (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)
1866 LogFile "Size of the data content"
1867 LogFile "------------------------"
1868 du -sk $imagesdir/*gz >> $LOGFILE
1869 LogFile "------------------------"
1870 echo -e "$DONE"
1871
1872 FRIENDLY_OUTSTRING="Boot and data disk images were created."
1873 rm -rf $bigdir
1874 rm -f $needlist
1875}
1876
1877
1878ProcessLDD() {
1879 local incoming f d nd bd bnd
1880 read incoming
1881 while [ "$incoming" != "" ]; do
1882 # We take the full path name of the dyn. lib. we want
1883 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
1884 for f in $incoming ; do
1885 # echo modified file name if one of the parent dir is a link
1886 # by replacing the original dirname by the destination of the link
1887 d="`dirname $f`"
1888 found="false"
1889 while [ "$d" != "/" ]; do
1890 if [ -h "$d" ]; then
1891 nd=`readlink -f $d`
1892 bd=`basename $d`
1893 bnd=`basename $nd`
1894 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
1895 echo $d
1896 fi
1897 d="`dirname $d`"
1898 done
1899
1900 echo "$f"
1901 echo "`ReadAllLink $f`"
1902 done
1903 read incoming
1904 done
1905}
1906
1907
1908Prompt() {
1909 echo -en "$1"
1910 read line
1911}
1912
1913
1914ReadLine() {
1915 local i incoming
1916 read incoming
1917 i=0
1918 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
1919 i=$(($i+1))
1920 read incoming
1921 done
1922 echo "$incoming"
1923}
1924
1925
1926SizeOfPartition() {
1927 local devpath drive res stub
1928 device=$1
1929 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
1930 res=`SizeOfRaidPartition $device`
1931 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
1932 echo "$res"
1933 return 0
1934 fi
1935 # patch from Bill <bill@iwizard.biz> - 2003/08/25
1936 res=`$FDISK -s $device 2>> $LOGFILE`
1937 # end patch
1938 # take only the first in case of multiple mount (cifs, nfs, ...)
1939 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
1940 [ "$res" = "" ] && res="-1"
1941 echo $res
1942 return 0
1943}
1944
1945
1946SizeOfRaidPartition() {
1947 local real_dev smallest_size silly tmp
1948
1949 silly=999999999
1950 smallest_size=$silly
1951
1952 for real_dev in `GetRaidDevMembers $1` ; do
1953 tmp=`SizeOfPartition $real_dev`
1954 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
1955 done
1956
1957 if [ "$smallest_size" = "$silly" ] ; then
1958 echo "-1"
1959 return 1
1960 else
1961 echo "$smallest_size"
1962 return 0
1963 fi
1964}
1965
1966
1967StripComments()
1968{
1969 local tempfile
1970
1971 tempfile=$MINDI_TMP/$$.strip.txt
1972 cp -f $1 $tempfile 2>> $LOGFILE
1973 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
1974 rm -f $tempfile
1975 LogFile "Stripped comments from $2"
1976}
1977
1978
1979
1980StripExecutable()
1981{
1982 local tmpfile
1983
1984 tmpfile=$MINDI_TMP/stripped.$$.dat
1985 [ -d "$1" ] || [ -h "$1" ] && return
1986 cp -f $1 $tmpfile 2>> $LOGFILE
1987 strip $tmpfile 2> /dev/null
1988 if [ "$?" -eq "0" ] ; then
1989 cp -f $tmpfile $1 2>> $LOGFILE
1990 LogFile "Stripped binary $2"
1991 fi
1992 rm -f $tmpfile
1993}
1994
1995KernelVer() {
1996 local fkern_ver fname
1997
1998 fname=$1
1999 file $fname | grep -q gzip
2000 if [ "$?" -eq "0" ] ; then
2001 # Used by ia64
2002 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2003 else
2004 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2005 fi
2006 echo "$fkern_ver"
2007}
2008
2009
2010TryToFindKernelPath() {
2011 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
2012
2013 we_want_version=$KERVERRUN
2014 possible_kernels=""
2015 duff_kernels=""
2016
2017 if [ "$ARCH" = "ia64" ] ; then
2018 root="/boot/efi/efi"
2019 else
2020 root="/"
2021 fi
2022 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
2023 [ ! -e "$fname" ] && continue
2024 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
2025 fkern_ver=`KernelVer $fname`
2026 [ "$fkern_ver" = "" ] && continue
2027 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
2028 [ -f "$fname" ] || continue
2029 [ -h "$fname" ] && continue
2030 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2031 file $fname | grep -q gzip
2032 if [ "$?" -eq "0" ] ; then
2033 # Used by ia64
2034 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2035 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
2036 duff_kernels="$fname $duff_kernels"
2037 else
2038 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2039 possible_kernels="$fname $possible_kernels"
2040 fi
2041 else
2042 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
2043 LogAll "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
2044 duff_kernels="$fname $duff_kernels"
2045 else
2046 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2047 possible_kernels="$fname $possible_kernels"
2048 fi
2049 fi
2050 done
2051 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
2052 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
2053 fi
2054 if [ ! "$possible_kernels" ] ; then
2055 LogAll "No kernel matches exactly. Are there any duff kernels?"
2056 possible_kernels="$duff_kernels"
2057 if [ ! "$possible_kernels" ] ; then
2058 LogAll "Sorry, no duff kernels either"
2059 else
2060 LogAll "I bet you're running Debian or Gentoo, aren't you?"
2061 LogAll "Your kernel doesn't have a sane builddate. Oh well..."
2062 fi
2063 fi
2064 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2065 noof_kernels=`CountItemsIn "$possible_kernels"`
2066 if [ "$noof_kernels" -eq "0" ] ; then
2067 LogAll "Could not find your kernel."
2068 if [ -e "/boot/vmlinuz" ] ; then
2069 LogAll "Using /boot/vmlinuz as a last resort."
2070 output=/boot/vmlinuz
2071 else
2072 output=""
2073 fi
2074 elif [ "$noof_kernels" -eq "1" ] ; then
2075 kernelpath=`echo "$possible_kernels" | sed s/' '//`
2076 LogFile "Your kernel is $kernelpath (v$KERVERRUN)"
2077 output="$kernelpath"
2078 else
2079 for i in $possible_kernels ; do
2080 if echo $i | grep "$KERVERRUN" ; then
2081 LogAll "OK, I used my initiative and found that "
2082 LogAll "$i is probably your kernel. "
2083 output="$i"
2084 return
2085 fi
2086 done
2087 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2088 output=/boot/vmlinuz
2089 LogFile "Schlomo, this one's for you."
2090 else
2091 LogAll "Two or more possible kernels found. You may specify any one of them and the "
2092 LogAll "boot disks will still work, probably. If one does not work, try another."
2093 LogAll "$possible_kernels"
2094 echo ""
2095 fi
2096 fi
2097 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2098}
2099
2100
2101TurnTgzIntoRdz() {
2102 local tgz_dir_fname rdz_fname tempfile mountpoint old_pwd nodes kernelsize res currsize not_copied j k s w needed_modules_path
2103
2104 tgz_dir_fname=$1
2105 rdz_fname=$2
2106 kernelsize=$3
2107 # Compute the list of all that should be copied/created on the final mountpoint under MINDI_TMP
2108 # mkdir.lis will contain the list of directries to create
2109 # cp.lis will contain the list of files/dirs to copy
2110 # ln.lis will contain the list of files to link to existing files
2111 # rm.lis will contain the list of files to remove after the copies
2112 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
2113 if [ -h "/lib64" ]; then
2114 echo lib >> $MINDI_TMP/mkdir.lis
2115 echo ln -s lib lib64 >> $MINDI_TMP/ln.lis
2116 fi
2117
2118 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > $MINDI_CACHE/USE-DEVFS
2119 echo $MINDI_CACHE/USE-DEVFS >> $MIDI_TMP/cp.lis
2120
2121 # We need a minimal conf in the initial ramdisk
2122 mountlis=`grep -v "^#.*" $DEPLIST_FILE_MIN $DEPLIST_DIR/minimal*.conf | cut -d: -f2 | sort -u`
2123 ReadAllLink $mountlis >> $MINDI_TMP/mnt.lis
2124 LocateDeps `cat $MINDI_TMP/mnt.lis` >> $MINDI_TMP/deps.lis
2125 # Special for libs
2126 ReadAllLink `grep -E "/lib" $DEPLIST_FILE_MIN $DEPLIST_DIR/minimal*.conf | grep -v "^#.*" | cut -d: -f2` >> $MINDI_TMP/deps.lis
2127
2128 echo `cat $MINDI_TMP/mnt.lis` `sort -u $MINDI_TMP/deps.lis` >> $MINDI_TMP/cp.lis
2129 rm -f $MINDI_TMP/deps.lis $MINDI_TMP/mnt.lis
2130
2131 # Copy of files mandatory for ld.so
2132 echo /etc/ld.so.c* >> $MINDI_TMP/cp.lis
2133
2134 # Avoid an issue on some distro (RHEL5)
2135 echo ./etc/ld.so.conf.d/kernelcap* >> $MINDI_TMP/rm.lis
2136
2137 # Need for a tmp dir
2138 echo tmp >> $MINDI_TMP/mkdir.lis
2139
2140 # Management of udev (which includes modprobe in rules)
2141 ps auxww | grep -v grep | grep -qw udevd
2142 if [ $? -eq 0 ]; then
2143 echo "udev device manager found" > $MINDI_CACHE/USE-UDEV
2144 echo $MINDI_CACHE/USE-UDEV >> $MINDI_TMP/cp.lis
2145 LogFile "udev device manager found"
2146 echo /etc/udev /lib*/udev >> $MINDI_TMP/cp.lis
2147 # This avoids NIC remapping if on another machine at restore time on Debian at least
2148 echo ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules >> $MINDI_TMP/rm.lis
2149 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2150 echo ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules >> $MINDI_TMP/rm.lis
2151 if [ -x /sbin/udevd ]; then
2152 # Get only the files which exist in the udev.files list
2153 # and potentially their symlink structure and their deps
2154 mountlis=`grep -Ev "^#" $MINDI_CONF/udev.files`
2155 ReadAllLink $mountlis | sort -u >> $MINDI_TMP/udev.lis
2156 LocateDeps `cat $MINDI_TMP/udev.lis` | sort -u >> $MINDI_TMP/cp.lis
2157 cat $MINDI_TMP/udev.lis >> $MINDI_TMP/cp.lis
2158 rm -f $MINDI_TMP/udev.lis
2159 else
2160 LogAll "udevd daemon not in standard place (/sbin)"
2161 LogAll "mindi will use static devices which may cause problems"
2162 rm -f $MINDI_CACHE/USE-UDEV
2163 fi
2164 fi
2165
2166 # Management of potential HW info (Proliant only at the moment)
2167 rm -rf $MINDI_CACHE/bkphw
2168 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2169 if [ -d $MINDI_CACHE/bkphw ]; then
2170 LogAll "Hardware Information found and saved ..."
2171 echo $MINDI_CACHE/bkphw >> $MIDNDI_TMP/cp.lis
2172 if [ -f $MINDI_CACHE/tools.files ]; then
2173 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
2174 LocateDeps $lis > $MINDI_TMP/tools.lis
2175 echo $lis `sort -u $MINDI_TMP/tools.lis` >> $MINDI_TMP/cp.lis
2176 fi
2177 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2178 chmod 755 $MINDI_CACHE/mindi-rsthw
2179 echo $MINDI_CACHE/mindi-rsthw >> $MINDI_TMP/cp.lis
2180 fi
2181 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
2182 fi
2183
2184 # Management of perl scripts delivered needed at restore time
2185 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` >> $MINDI_TMP/cp.lis
2186
2187 echo mnt/cdrom >> $MINDI_TMP/mkdir.lis
2188
2189 ls /dev/fd0*[1,2][4,7,8]* >> $MINDI_TMP/cp.lis 2> /dev/null
2190
2191 if [ "${kernelname}" != "" ]
2192 then
2193 needed_modules_path=/lib/modules/${kernelname}
2194 else
2195 needed_modules_path=/lib/modules/$KERVERRUN
2196 fi
2197
2198 needed_modules=""
2199 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
2200
2201 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
2202 # For PXE boot
2203 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2204 fi
2205 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2206 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2207 fi
2208 for i in $DENY_MODS; do
2209 LogFile "Removing $i from the list of modules to load"
2210 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2211 done
2212
2213 [ -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."
2214 for i in $list_of_groovy_mods ; do
2215 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
2216 done
2217
2218 for i in $needed_modules ; do
2219 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
2220 LogFile "Adding $i ($s KB) to the rootfs"
2221 echo $i >> $MINDI_TMP/cp.lis
2222 done
2223
2224 # Also copy modules.dep in case of udev so that normal modprobe works
2225 echo $needed_modules_path/modules.dep >> $MINDI_TMP/cp.lis
2226
2227 # Manages mountlit.txt
2228 MakeMountlist $MINDI_CACHE/mountlist.txt
2229 CheckMountlist $MINDI_CACHE/mountlist.txt
2230 echo $MINDI_CACHE/mountlist.txt >> $MINDI_TMP/cp.lis
2231 cat $MINDI_CACHE/mountlist.txt >> $LOGFILE
2232 LogFile "-----------------------------------"
2233
2234 if [ ! -e "/sbin/devfsd" ] ; then
2235 LogFile "Deleting devfsd daemon from ramdisk because /sbin/devfsd not found"
2236 echo ./sbin/devfsd >> $MINDI_TMP/rm.lis
2237 fi
2238
2239 cd $old_pwd
2240 if [ _"$MONDO_SHARE" != _"" ]; then
2241 MakeMondoConfigFile $MINDI_CACHE/mondorestore.cfg
2242 echo $MINDI_CACHE/mondorestore.cfg >> $MINDI_TMP/cp.lis
2243 fi
2244 echo proc >> $MINDI_TMP/mkdir.lis
2245
2246 # Copy of files mandatory for ssh to automate mount if sshfs is used
2247 echo .ssh >> $MINDI_TMP/mkdir.lis
2248
2249 # Now create the container and do the job
2250 tempfile=$MINDI_TMP/temp.rd
2251 mountpoint=$MINDI_TMP/mnt1
2252 res=0
2253 echo -en "..."
2254 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk ($tempfile)"
2255 echo -en "..."
2256 LogFile "Creating ext2 filesystem on $tempfile"
2257 mke2fs -b 1024 -m 0 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
2258 echo -en "..."
2259 mkdir -p $mountpoint
2260 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."
2261 echo -en "..."
2262 old_pwd=`pwd`
2263
2264 # First create dirs
2265 for d in `cat $MINDI_TMP/mkdir.lis`; do
2266 mkdir -p $mountpoint/$d 2>&1 >> $LOGFILE
2267 done
2268
2269 # Then copy files needed
2270 LANGUAGE=C tar cf - `cat $MINDI_TMP/cp.lis` 2> /dev/null | (cd $mountpoint ; tar xf - ) 2>&1 | grep -Ev "tar: Removing.*/\'" >> $LOGFILE
2271
2272 # Then handle links
2273 if [ -f $MINDI_TMP/ln.lis ]; then
2274 (cd $mountpoint ; bash $MINDI_TMP/ln.lis) 2>&1 >> $LOGFILE
2275 fi
2276
2277 # Finally remove useless stff
2278 (cd $mountpoint ; rm -f `cat $MINDI_TMP/rm.lis`) 2>&1 >> $LOGFILE
2279
2280 # Copy of files mandatory for ssh to automate mount if sshfs is used
2281 cp -rp ~root/.ssh/*.pub ~root/.ssh/config ~root/.ssh/known* $mountpoint/.ssh 2> /dev/null
2282 cat > $mountpoint/bin/myssh << EOF
2283ssh -o StrictHostKeyChecking=no $*
2284EOF
2285 chmod 755 $mountpoint/bin/myssh
2286
2287 # Finally integrate what we provide statically as part of mindi
2288 (cd $tgz_dir_fname ; LANGUAGE=C tar cf - . ) | (cd $mountpoint ; tar xf - ) 2>&1 | grep -Ev "tar: Removing.*/\'" >> $LOGFILE
2289
2290 # Extracting devices
2291 (cd $mountpoint/dev ; tar -zxf dev-entries.tgz) || Die "Cannot untar dev-entries.tgz"
2292 rm -f $mountpoint/dev/dev-entries.tgz
2293
2294 LogFile "---------------------------"
2295 LogFile "Content of initial ramdisk:"
2296 LogFile "---------------------------"
2297 (cd $mountpoint ; ls -Rla ) >> $LOGFILE
2298 LogFile "---------------------------"
2299
2300 # Determine what filesystem to use for initrd image
2301 LogFile "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
2302 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2303 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
2304 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
2305 # say what will be used
2306 LogFile "Creating an $gvFileSystem initrd image..."
2307 # kernel expects linuxrc in ext2 filesystem
2308 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2309 # unmount loop filesystem and create image file using the standard approach
2310 umount $mountpoint || Die "Cannot unmount $tempfile"
2311 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
2312 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2313 ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
2314 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
2315 rm -f ${rdz_fname}.tmp
2316 # log that we are done
2317 LogFile "...done."
2318 elif [ "$gvFileSystem" = "initramfs" ]; then
2319 # say what will be used
2320 LogFile "Creating a gzip'ed cpio (AKA initramfs) initrd image..."
2321 # make sure that cpio is there
2322 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2323 # go into filesystem
2324 cd $mountpoint
2325 # kernel expects init in cpio filesystem
2326 ln -sf sbin/init init
2327 # create cpio image file and unmount loop filesystem
2328 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
2329 cd $old_pwd
2330 umount $mountpoint || Die "Cannot unmount $tempfile"
2331 # log that we are done
2332 LogFile "...done."
2333 else
2334 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
2335 fi
2336 ls -al $MINDI_TMP/initrd.img > /tmp/initrd.log
2337
2338 if [ "$res" -eq "0" ] ; then
2339 echo -en "..."
2340 else
2341 echo -en "\rMade an rdz WITH ERRORS. \n"
2342 fi
2343 return 0
2344}
2345
2346
2347##############################################################################
2348#----------------------------------- Main -----------------------------------#
2349##############################################################################
2350
2351# Now we can create what we need
2352mkdir -p $MINDI_TMP
2353
2354# Purge from potential old run
2355if [ _"$MINDI_CACHE" = _"" ]; then
2356 Die "MINDI_CACHE undefined"
2357fi
2358
2359if [ "$1" = "--printvar" ] ; then
2360 shift
2361 if [ _"$1" != _"" ] ; then
2362 set | grep -Ew "^$1" | cut -d= -f2
2363 fi
2364 exit 0
2365fi
2366
2367> $LOGFILE
2368LogFile "mindi v$MINDI_VERSION"
2369LogFile "$ARCH architecture detected"
2370LogFile "mindi called with the following arguments:"
2371LogFile "$*"
2372LogFile "Start date : `date`"
2373LogFile "-----------------------------"
2374
2375[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2376
2377# Log some capital variables
2378[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
2379LogFile "MONDO_SHARE = $MONDO_SHARE"
2380LogFile "MINDI_DATA = $MINDI_DATA"
2381LogFile "MINDI_SBIN = $MINDI_SBIN"
2382[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2383LogFile "MINDI_CONF = $MINDI_CONF"
2384if [ -f $MINDI_CONFIG ]; then
2385 LogFile "-----------------------------"
2386 LogFile " Mindi configuration file "
2387 LogFile "-----------------------------"
2388 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2389 LogFile "-----------------------------"
2390fi
2391
2392
2393trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
2394
2395# Sanity checks
2396which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2397which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2398which 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."
2399which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2400if which awk &> /dev/null ; then
2401 if ! which gawk &> /dev/null ; then
2402 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"
2403 fi
2404fi
2405which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
2406[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
2407
2408[ "`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"
2409
2410# Update the PATH variable if incomplete
2411if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2412 PATH=$PATH:/sbin:/usr/sbin
2413 export PATH
2414 LogFile "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2415 LogFile "However, you may wish to ask your vendor to provide a permanent fix..."
2416 LogFile " Or you might like to call 'su -' instead of 'su', for example."
2417fi
2418
2419if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
2420 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2421fi
2422
2423### BERLIOS
2424### Fix as it's not mandatory on ia64
2425if [ "$ARCH" = "ia64" ] ; then
2426 if which elilo &> /dev/null ; then
2427 LILO_EXE=elilo
2428 else
2429 LILO_EXE=`which false 2> /dev/null`
2430 fi
2431else
2432 FindIsolinuxBinary
2433fi
2434trap "Aborted" SIGTERM
2435DONE="\r\t\t\t\t\t\t\t\tDone. "
2436kernelpath=""
2437MONDO_ROOT=/var/cache/mondo
2438mkdir -p $MONDO_ROOT
2439
2440if [ -d "/proc/lvm" ]; then
2441 # LVM v1
2442 LVMCMD=""
2443 LVM="v1"
2444elif [ -d "/dev/mapper" ]; then
2445 # LVM v2
2446 LVMCMD="lvm"
2447 LVM="v2"
2448else
2449 LVM="false"
2450fi
2451
2452if [ -e "/proc/cmdline" ]; then
2453 CMDLINE="/proc/cmdline"
2454elif [ -e "/tmp/cmdline" ]; then
2455 CMDLINE="/tmp/cmdline"
2456else
2457 CMDLINE="/dev/null"
2458fi
2459
2460LogFile "LVM set to $LVM"
2461LogFile "----------"
2462LogFile "mount result:"
2463LogFile "-------------"
2464mount >> $LOGFILE
2465LogFile "-------------"
2466if [ -e /etc/raidtab ]; then
2467 LogFile "-------------"
2468 LogFile "/etc/raidtab content:"
2469 LogFile "-------------"
2470 cat /etc/raidtab >> $LOGFILE
2471fi
2472LogFile "-------------"
2473LogFile "cat $CMDLINE"
2474LogFile "-------------"
2475cat $CMDLINE >> $LOGFILE
2476LogFile "-------------"
2477LogFile "cat /proc/swaps:"
2478LogFile "-------------"
2479cat /proc/swaps >> $LOGFILE
2480LogFile "-------------"
2481LogFile "cat /proc/partitions:"
2482LogFile "-------------"
2483cat /proc/partitions >> $LOGFILE
2484LogFile "-------------"
2485LogFile "cat /proc/filesystems:"
2486LogFile "-------------"
2487cat /proc/filesystems >> $LOGFILE
2488LogFile "-------------"
2489LogFile "lsmod result:"
2490LogFile "-------------"
2491lsmod >> $LOGFILE
2492MODULES="`cat /proc/modules | $AWK '{print $1}'`"
2493if [ -x /usr/sbin/esxcfg-module ]; then
2494 LogFile "-------------"
2495 LogFile "VMWare ESX server detected - Enabling dedicated support"
2496 LogFile "-------------"
2497 LogFile "VMWare modules"
2498 LogFile "-------------"
2499 /usr/sbin/esxcfg-module -l >> $LOGFILE
2500 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
2501fi
2502LogFile "FORCE_MODS:"
2503LogFile "-------------"
2504LogFile $FORCE_MODS
2505LogFile "-------------"
2506LogFile "DENY_MODS:"
2507LogFile "-------------"
2508LogFile $DENY_MODS
2509LogFile "-------------"
2510LogFile "df result:"
2511LogFile "----------"
2512df -T >> $LOGFILE
2513LogFile "-------------"
2514LogFile "Liste of extra modules is:"
2515LogFile "$EXTRA_MODS"
2516LogFile "-------------"
2517
2518# Compute libata version
2519laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
2520# If libata v2 is used then remove ide-generic as it will perturbate boot
2521if [ "`echo $MODULES | grep libata`" ]; then
2522 if [ "$laver" = "2" ]; then
2523 DENY_MODS="$DENY_MODS ide-generic"
2524 LogFile "ide-generic removed from module list as your system uses libata v2+"
2525 LogFile "-------------"
2526 fi
2527fi
2528
2529# Check for ISO_CMD command
2530if [ ! -x $ISO_CMD ]; then
2531 echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2532fi
2533
2534FLOPPY_WAS_MOUNTED=""
2535for mtpt in /media/floppy /mnt/floppy /floppy ; do
2536 if mount | grep -w $mtpt &> /dev/null ; then
2537 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2538 umount $mtpt
2539 fi
2540done
2541
2542#
2543# If we have a USB device we need to store info
2544# and remove it from the parameters line
2545#
2546if [ "$#" -ne "0" ] ; then
2547 if [ "$1" = "--usb" ] ; then
2548 shift
2549 USBDEVICE=$1
2550 if [ _"$USBDEVICE" = _"" ]; then
2551 Die "No USB device specified"
2552 fi
2553 shift
2554 fi
2555fi
2556
2557if [ "$#" -ne "0" ] ; then
2558 if [ "$1" = "--findkernel" ] ; then
2559 res=`TryToFindKernelPath`
2560 # Avoids logfile content for mondo
2561 export MONDO_SHARE=""
2562 if [ "$res" = "" ] ; then
2563 MindiExit -1
2564 else
2565 echo "$res"
2566 MindiExit 0
2567 fi
2568 elif [ "$1" = "--locatedeps" ] ; then
2569 [ ! "$2" ] && Die "Please specify the binary to look at"
2570 LocateDeps $*
2571 # Avoids logfile content for mondo
2572 export MONDO_SHARE=""
2573 MindiExit $?
2574 elif [ "$1" = "--readalllink" ] ; then
2575 [ ! "$2" ] && Die "Please specify the binary to look at"
2576 shift
2577 ReadAllLink $*
2578 # Avoids logfile content for mondo
2579 export MONDO_SHARE=""
2580 MindiExit $?
2581 elif [ "$1" = "--makemountlist" ] ; then
2582 [ ! "$2" ] && Die "Please specify the output file"
2583 MakeMountlist $2
2584 CheckMountlist $2
2585 # Avoids logfile content for mondo
2586 export MONDO_SHARE=""
2587 MindiExit $?
2588 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2589 echo "Mindi v$MINDI_VERSION"
2590 # Avoids logfile content for mondo
2591 export MONDO_SHARE=""
2592 MindiExit 0
2593 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
2594 MONDO_TMP=$2
2595 # Change MINDI_TMP for the one provided by mondo
2596 # So that it can get back the built files
2597 if [ _"$MONDO_TMP" = _"" ]; then
2598 Die "MONDO_TMP is empty, aborting"
2599 fi
2600 if [ _"$MONDO_TMP" = _"/" ]; then
2601 Die "MONDO_TMP is /, aborting"
2602 fi
2603 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
2604 rmdir $MINDI_TMP
2605 export MINDI_TMP=$MONDO_TMP
2606 mkdir -p $MINDI_TMP
2607
2608 # This is the scratch dir in mondo - subdir images
2609 MINDI_CACHE=$3
2610
2611 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
2612###
2613### Sq-Modification...
2614### Attempt to locate kernel specific module path
2615### if module path is found then use it other wise use uname -r to set it...
2616###
2617 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2618 LogAll "kernelname = $kernelname"
2619 LogAll "kernelpath = $kernelpath"
2620 if [ ! -d "/lib/modules/$kernelname" ]
2621 then
2622 LogAll "Module path for ${kernelpath} not found..."
2623 LogAll "using running kernel\'s modules."
2624 kernelname=$KERVERRUN
2625 else
2626 LogAll "Using modules for kernel: ${kernelname}"
2627 fi
2628###
2629### end of Sq-Modification
2630###
2631 TAPEDEV=$5
2632 TAPESIZE=$6
2633 FILES_IN_FILELIST=$7
2634 USE_LZO=$8
2635 CDRECOVERY=$9
2636 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2637 IMAGE_DEVS=""
2638 else
2639 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2640 fi
2641 if [ "${11}" ] ; then
2642 LILO_OPTIONS=""
2643 # LogAll "LILO will use conservative settings, to be compatible with older BIOSes."
2644 fi
2645 ESTIMATED_TOTAL_NOOF_SLICES=${12}
2646 export EXCLUDE_DEVS="${13}"
2647 USE_COMP="${14}"
2648 USE_LILO="${15}"
2649 USE_STAR="${16}"
2650 INTERNAL_TAPE_BLOCK_SIZE="${17}"
2651 DIFFERENTIAL="${18}"
2652 USE_GZIP="${19}"
2653 USE_LZMA="${20}"
2654 [ "$USE_COMP" = "" ] && USE_COMP=yes
2655 [ "$USE_GZIP" = "" ] && USE_GZIP=no
2656 [ "$USE_LZMA" = "" ] && USE_LZMA=no
2657 [ "$TAPEDEV" ] && LogAll "This is a tape-based backup. Fine."
2658 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2659 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2660 if [ ! -d "/lib/modules/$kernelname" ]
2661 then
2662 LogAll "Module path for ${kernelpath} not found..."
2663 LogAll "using running kernel\'s modules."
2664 kernelname=$KERVERRUN
2665 else
2666 LogAll "Using modules for kernel: ${kernelname}"
2667 fi
2668 # MONDO_ROOT is the real scratchdir
2669 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
2670 if [ _"$MONDO_ROOT" != _"" ]; then
2671 mkdir -p $MONDO_ROOT
2672 else
2673 Die "MONDO_ROOT is undefined"
2674 fi
2675 else
2676 LogScreen "Syntax: mindi (--custom ....)"
2677 MindiExit -1
2678 fi
2679fi
2680
2681if [ _"$MINDI_CACHE" != _"" ]; then
2682 rm -rf $MINDI_CACHE/* 2> /dev/null
2683 mkdir -p $MINDI_CACHE
2684fi
2685
2686[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2687
2688LogAll "Mindi Linux mini-distro generator v$MINDI_VERSION"
2689LogAll "Latest Mindi is available from http://www.mondorescue.org"
2690LogAll "------------------------------------------------------------------------------"
2691LogFile "DIFFERENTIAL = $DIFFERENTIAL"
2692LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
2693
2694if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2695 LogAll "Including the generation of a Bootable USB device on $USBDEVICE"
2696fi
2697
2698if [ "$kernelpath" = "" ] ; then
2699 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
2700 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2701 read ch
2702 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2703 USE_OWN_KERNEL="yes"
2704 else
2705 USE_OWN_KERNEL="no"
2706 fi
2707 if [ "$USE_OWN_KERNEL" = "yes" ]; then
2708 kernelpath=`TryToFindKernelPath`
2709 if [ "$kernelpath" = "" ] ; then
2710 echo -n "Please enter kernel path : "
2711 read kernelpath
2712 fi
2713 fi
2714fi
2715LogFile "Mindi's temp dir=$MINDI_TMP"
2716LogFile "Mindi's output dir=$MINDI_CACHE"
2717[ "$(($RANDOM%64))" -eq "0" ] && LogAll "Dude, I've looked inside your computer and it's really dusty..."
2718
2719PrepareDataDiskImages
2720
2721export ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2722
2723LogFile "Ramdisk will be $ramdisk_size KB"
2724PrepareBootDiskImage $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
2725
2726[ -e "$MINDI_DATA/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2727...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2728
2729if [ _"$MONDO_SHARE" = _"" ]; then
2730 ListImagesForUser
2731 OfferToMakeBootableISO
2732 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
2733 OfferToMakeBootableUSB
2734 fi
2735 LogAll "Finished."
2736elif [ "$TAPEDEV" ] ; then
2737 if [ "$ARCH" != "ia64" ] ; then
2738 # We need to keep the img file as boot file for ia64 platform
2739 rm -f $MINDI_CACHE/{*img,*iso}
2740 else
2741 rm -f $MINDI_CACHE/*iso
2742 fi
2743 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2744 OfferToMakeBootableUSB
2745 fi
2746 OfferToMakeBootableISO
2747 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2748 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
2749 else
2750 Die "Cannot find all.tar.gz, to be written to tape"
2751 fi
2752elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2753 OfferToMakeBootableUSB
2754else
2755 OfferToMakeBootableISO
2756fi
2757# cleanup
2758LogAll "$FRIENDLY_OUTSTRING"
2759for mtpt in $FLOPPY_WAS_MOUNTED ; do
2760 mount $mtpt
2761done
2762MindiExit 0
Note: See TracBrowser for help on using the repository browser.