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

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