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

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