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

Last change on this file since 2462 was 2462, checked in by Bruno Cornec, 15 years ago

r3548@localhost: bruno | 2009-10-16 19:18:27 +0200

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