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

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

r4563@localhost: bruno | 2012-03-13 00:29:34 +0100

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