source: MondoRescue/branches/3.0/mindi/mindi@ 2987

Last change on this file since 2987 was 2987, checked in by Bruno Cornec, 12 years ago

r4623@localhost: bruno | 2012-03-30 03:01:48 +0200

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