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

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