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

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

r3998@localhost: bruno | 2010-09-02 07:34:24 +0200

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