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

Last change on this file since 3072 was 3072, checked in by Bruno Cornec, 11 years ago

Minor msg fix for mindi MB => KB

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