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

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

r5032@localhost: bruno | 2012-11-08 23:24:32 +0100

  • Comment why not using dm on SLES
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 120.5 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 3059 2012-11-09 01:05:37Z 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"
[3055]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 iscsi_tcp libiscsi libiscsi2 scsi_transport_iscsi scsi_transport_iscsi2 libiscsi_tcp isp megaraid megaraid_mm megaraid_mbox megaraid_sas mega_sr mptbase mptscsih mptsas mptspi mptfc mptscsi mptctl NCR53c406a ncr53c8xx nsp32 pas16 pci2000 pci2220i pcmcia ppa psi240i qla1280 qla2200 qla2300 qla2400 qla2xxx qla2xxx_conf qlogicfas qlogicfc qlogicisp qlogicfas qlogicfas408 raw1394 scsi_mod scsi_transport_sas scsi_transport_spi scsi_transport_fc sd_mod crc_t10dif crc-t10dif seagate sg sim710 sr_mod sym53c416 sym53c8xx sym53c8xx_2 t128 tmscsim u14-34f ultrastor wd7000 vmhgfs intermodule scsi_dh scsi_tgt emcpdm emcpgpx emcpmpx emcp 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"
[3007]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 libcrc32c netbk xenblktap r8169 virtio_net via_rhine"
[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.
[3055]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 libcrc32c xfs_support pagebuf reiserfs ext2 ext3 minix nfs nfs_acl nfsd lockd sunrpc jbd mbcache ext4 jbd2 crc16 ocfs2 ocfs2_dlm ocfs2_nodemanager configfs 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`
[747]1083 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
[3046]1084
1085 if [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ]; then
1086 current_partition="$c_p"
1087 elif [ "`echo $current_partition | grep -E '^/dev/dm-'`" ]; then
[3059]1088 # For SLES 11 type of distro, do not use dm devices as they are unable to be handled by lvm commands
[3049]1089 current_partition=`$MINDI_LIB/analyze-my-lvm --givemapperofdm $current_parition`
[3046]1090 fi
[747]1091 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1092 else
1093 current_partition="$c_p"
1094 fi
1095 [ "$c_p" = "none" ] && continue
1096 redhat_label=""
[1831]1097 label=""
[957]1098 uuid=""
[861]1099 absolute_partition=`readlink -f $c_p`
[2965]1100 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
[747]1101
1102 # Detects noauto partitions not mounted and exclude them
[2965]1103 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$current_partition" | grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
[747]1104 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
[3026]1105 LogFile "INFO: Excluding $current_partition from mountlist (due to noauto option in fstab)"
[747]1106 continue
1107 fi
[3026]1108 # Detects bind partitions and exclude them
1109 if [ "`echo "$partition_option" | grep -iw bind`" != "" ]; then
1110 LogFile "INFO: Excluding $current_partition from mountlist (due to bind option in fstab)"
1111 continue
1112 fi
[747]1113
[1986]1114 # set default in case we dont't find it
1115 str_to_find_fmt_with=$current_partition
1116
[747]1117 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1118 # current_partition contains only first column of /etc/fstab
[2965]1119 if [ "`echo "$current_partition" | grep -i "LABEL="`" != "" ]; then
[980]1120 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
[747]1121 actual_dev=""
[853]1122
1123 # 1st try, findfs - the RHEL way of finding labels and their partitions
1124 if [ -x "/sbin/findfs" ]; then
[2847]1125 actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
[853]1126 fi
[747]1127
[853]1128 # 2nd try : blkid, the good way for all LABEL except swap
1129 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[2965]1130 actual_dev=`/sbin/blkid | grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
[747]1131 # For LVM FS it will give a /dev/dm-# which should then be converted
[748]1132 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1133 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1134 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[747]1135 for dev in `ls /dev/mapper/*`; do
[963]1136 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1137 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[747]1138 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1139 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[747]1140 break
1141 fi
1142 done
1143 fi
1144 fi
1145
[853]1146 # 3rd try, which works on a standard partition (ext2/3), but not on swap
[747]1147 # For LVM gives a /dev/mapper entry
1148 if [ "x$actual_dev" = "x" ]; then
[2965]1149 actual_dev=`/bin/mount -l | grep "\[$redhat_label\]" | cut -d' ' -f1`
[747]1150 fi
1151
[853]1152 # 4th try, with vol_id
[747]1153 # SWAP only
1154 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[2965]1155 list_swaps=`cat /proc/swaps | grep "/dev/" | $AWK '{ print $1 }' `
[747]1156 for dev_swap in $list_swaps ; do
[2965]1157 dev_exists=`/sbin/vol_id $dev_swap | grep "$redhat_label"`
[747]1158 if [ "x$dev_exists" != "x" ]; then
1159 actual_dev=$dev_swap
1160 break;
1161 fi
1162 done
1163 fi
1164
[853]1165 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
[789]1166 # LABEL=SW-cciss/c0d0p3 (RDP)
[853]1167 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
[747]1168 # SWAP only
[2965]1169 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
[2013]1170 skip=""
[2292]1171 uname=$KERVERRUN
[2013]1172 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1173 # 2.6.12 needs 16 (FC3)
1174 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1175 # 2.6.19 and upper needs 1052
1176 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1177 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
[2892]1178 [ "`echo $uname | grep "3.[0-9]*.[0-9]*"`" != "" ] && skip=1052
[2013]1179 if [ $skip = "" ]; then
1180 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1181 fi
[853]1182 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1183 do
1184 # Location of the swap label for kernel 2.6
[2013]1185 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
[853]1186 if [ "x$try_dev_label" = "x$redhat_label" ]; then
[855]1187 actual_dev=$try_dev
[853]1188 fi
1189 done
[747]1190 fi
[1008]1191
1192 # Check if one of all those tries has known success
1193 if [ "x$actual_dev" != "x" ]; then
1194 current_partition=$actual_dev
1195 else
[1885]1196 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]1197 fi
[957]1198 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1199 # current_partition contains only first column of /etc/fstab
[2965]1200 elif [ "`echo "$current_partition" | grep -i "UUID="`" != "" ]; then
[980]1201 uuid=`echo "$current_partition" | cut -d'=' -f2`
[957]1202 actual_dev=""
1203
1204 # 1st try, findfs - the RHEL way of finding labels and their partitions
1205 if [ -x "/sbin/findfs" ]; then
1206 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1207 fi
1208
[1531]1209 # 2nd try : blkid, the good way for all UUID except swap
[957]1210 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[2965]1211 actual_dev=`/sbin/blkid | grep "$uuid" | grep UUID= | cut -d':' -f1`
[957]1212 # For LVM FS it will give a /dev/dm-# which should then be converted
1213 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1214 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1215 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[957]1216 for dev in `ls /dev/mapper/*`; do
[963]1217 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1218 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[957]1219 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1220 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[957]1221 break
1222 fi
1223 done
1224 fi
1225 fi
1226
1227 # 3th try, with vol_id
1228 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[2965]1229 list_dev=`mount | grep -E '^/' | $AWK '{ print $1 }' `
[957]1230 for dev in $list_dev ; do
[2965]1231 dev_exists=`/sbin/vol_id $dev | grep "$uuid"`
[957]1232 if [ "x$dev_exists" != "x" ]; then
1233 actual_dev=$dev
1234 break;
1235 fi
1236 done
1237 fi
1238
[1531]1239 # 4th try, with dumpuuid (VMWare only ?) for swap
1240 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
[2965]1241 list_dev=`cat /proc/swaps | grep -E '^/' | $AWK '{ print $1 }' `
[1531]1242 for dev in $list_dev ; do
[2965]1243 dev_exists=`/sbin/dumpuuid $dev | grep "$uuid"`
[1531]1244 if [ "x$dev_exists" != "x" ]; then
1245 actual_dev=$dev
1246 break;
1247 fi
1248 done
1249 fi
1250
[747]1251 # Check if one of all those tries has known success
1252 if [ "x$actual_dev" != "x" ]; then
1253 current_partition=$actual_dev
1254 else
[2069]1255 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]1256 fi
1257 else
[1863]1258 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1259 # they use symlinks in fstab unrelated to what is shown in mount !
1260 if [ _"$partition_mountpt" = _"" ]; then
[1986]1261 # set default in case we dont't find it
[2965]1262 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | grep -Ev "^#" | $AWK '{print $1}'`; do
[1864]1263 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
[1863]1264 str_to_find_fmt_with=$tmpp
[2965]1265 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | grep -w "$tmpp" | grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
[1864]1266 break;
[1863]1267 fi
1268 done
1269 fi
[747]1270 fi
1271
[2566]1272 # Look for devices which have to be excluded
1273 skip=0
1274 if [ "$MINDI_EXCLUDE_DEVS" ] ; then
[2568]1275 l=""
1276 list_of_devices="`ReadAllLink $current_partition`"
1277 for d in $list_of_devices; do
[2579]1278 l="$l `$MINDI_LIB/analyze-my-lvm --givemapperofdm $d`"
[2568]1279 done
[2618]1280
1281 # Remove PVs from LVs excluded
1282 l="$l `GetPVsForLV $current_partition`"
1283
1284 # We want a single unique list
[2568]1285 list_of_devices="`echo $l | sort -u`"
[2618]1286
[2854]1287 for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; do
[2568]1288 if [ "`echo " $list_of_devices " | grep " $d"`" != "" ]; then
[2963]1289 LogFile "INFO: Excluding $current_partition from mountlist (due to excluded device $d)"
[2566]1290 skip=1
1291 continue
1292 fi
1293 done
1294 fi
1295 if [ $skip -eq 1 ]; then
1296 continue
1297 fi
1298
[747]1299 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
[3028]1300 # Detects iso9660 ISO images and exclude them
1301 if [ "`echo "$partition_format" | grep -iw iso9660`" != "" ]; then
1302 LogFile "INFO: Excluding $current_partition from mountlist (due to iso8660 format in fstab)"
1303 continue
1304 fi
[747]1305 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1306 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1307 # the former is then a link to the latter, so we test whether
1308 # $current_partition is actually such a link or not and set
[755]1309 # $current_lvolume accordingly. On Debian you may find more than one answer
1310 # so we remove the one corresponding to /dev/.static
1311 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1312 # principle is the same and we need to find the link to it as well.
1313 # Note that $current_lvolume may well be an
[747]1314 # ordinary device. It is just to make sure that we feed the right value
1315 # into any of the LVM tools if possible.
1316
1317 current_lvolume="$current_partition"
[763]1318 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
[755]1319 # .static dir are a Debian specificity
[763]1320 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
[755]1321 echo $current_lvolume | grep -q ' '
[784]1322 if [ $? -eq 0 ]; then
[2963]1323 LogFile "WARNING: Multiple Logical Volumes found. Report to dev team"
[755]1324 fi
[2072]1325 # if it's not found, it may well be a real device such as a multipath one
1326 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1327 if [ _"$current_lvolume" = _"" ]; then
1328 current_lvolume="$current_partition"
1329 fi
[747]1330 fi
1331 #
1332 # End of LVM device style variation code (other than $current_lvolume).
1333
[745]1334 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1335 # Size computed via LVM not directly
[747]1336 partition_size="lvm"
1337 else
1338 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1339 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1340 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
[2947]1341 # Skip swap files
1342 [ "`echo "$current_partition" | grep -E "^/dev"`" = "" ] && continue
[2919]1343 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition " | $AWK '{print $3}'`
[747]1344 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1345 [ "$partition_format" != "swap" ] && partition_format="swap"
1346 if [ "$partition_size" = "" ] ; then
1347 totalsize=0
1348 items=0
1349 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1350 totalsize=$(($totalsize+$i))
1351 items=$(($items+1))
1352 done
1353 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1354 [ "$partition_size" -lt "125000" ] && partition_size=125000
[2963]1355 LogFile "INFO: I'm guessing $c_p is $(($partition_size/1024))MB"
[747]1356 fi
[2947]1357 else
1358 partition_size=`SizeOfPartition $current_partition`
[747]1359 fi
1360 fi
1361 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1362 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1363 if [ "$partition_mountpt" = "" ] ; then
1364 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1365 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1366 partition_mountpt="raid"
1367 partition_format="raid"
1368 else
1369 partition_mountpt="lvm"
1370 partition_format="lvm"
1371 fi
1372 fi
1373 fi
1374 psz=$partition_size
[2963]1375 LogFile "INFO: Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)"
[747]1376 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1377 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1378 partition_mountpt="image"
1379 old_partition_fmt=$partition_format
1380 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1381 partition_size=$(($partition_size+1)); # just in case
1382 if [ "$partition_format" = "Linux" ] ; then
[2963]1383 LogFile "WARNING: Are you imaging a mounted swap partition? Silly..."
1384 LogFile "WARNING: Reverting format from $old_partition_fmt to $partition_format"
[747]1385 partition_format=$old_partition_fmt
1386 fi
1387 fi
[2566]1388
[747]1389 if [ ! "$partition_mountpt" ] ; then
[2963]1390 LogFile "------- $FDISK -l $qq log ------------"
[1883]1391 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
[747]1392 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1393 [ "$partition_format" ] && break
1394 done
[2963]1395 LogFile "------- $FDISK log end ------------"
[747]1396 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1397 partition_format="compaq"
1398 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
[2963]1399 LogIt "WARNING: Unable to find mountpoint of $current_partition - ignoring"
[747]1400 continue
1401 fi
1402 fi
[1755]1403 if [ "$redhat_label" ]; then
1404 label="$redhat_label"
[1756]1405 elif [ "$uuid" ]; then
[1755]1406 label="$uuid"
1407 fi
[747]1408 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
[963]1409 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
[1755]1410 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
[747]1411 if [ "$current_partition" = "" ] ; then
[2963]1412 LogFile "WARNING: Unknown partition (outstring = $unofficial_outstring)"
[747]1413 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1414 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1415 partition_mountpt=raid
1416 partition_format=raid
[1755]1417 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1418 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1419 else
[2963]1420 LogFile "WARNING: Unknown mountpoint (outstring = $unofficial_outstring)"
[747]1421 fi
1422 elif [ "$partition_format" = "" ] ; then
[2963]1423 LogFile "WARNING: Unknown format (outstring = $unofficial_outstring)"
[747]1424 elif [ "$partition_size" = "" ] ; then
[2963]1425 LogFile "WARNING: Unknown partition size (outstring = $unofficial_outstring)"
[747]1426 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1427 continue
1428 else
1429 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
[2963]1430 LogFile "WARNING: vfat should be used instead of dos/msdos as a partition format"
[747]1431 partition_format="vfat"
1432 fi
[1755]1433 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1434 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1435 fi
1436 done
1437}
1438
[2432]1439CheckMountlist() {
1440 local file=$1
1441 # Coherency verification
[2529]1442 ML01=`cat $file | wc -l`
[2995]1443 ML02=`grep -vE ' lvm | raid | swap ' $file | wc -l`
[2432]1444 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
[3024]1445 ML2=`grep -vE ' lvm | raid | swap ' $file | $AWK '{print $2}' | sort -u | wc -l`
[2529]1446 if [ "$ML01" -ne "$ML1" ]; then
[2963]1447 LogFile "--------------------------------------------"
1448 LagAll "WARNING: Duplicate device entry in mountlist"
1449 LogFile "--------------------------------------------"
[2432]1450 fi
[2529]1451 if [ "$ML02" -ne "$ML2" ]; then
[2963]1452 LogFile "--------------------------------------------"
1453 LogAll "WARNING: Duplicate mountpoint entry in mountlist"
1454 LogFile "------------------------------------------------"
[2432]1455 fi
1456}
[747]1457
1458MakeSureNumberIsInteger() {
1459 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1460 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1461 echo "result = '$res'"
1462 Die "$1 should be an integer"
1463 fi
1464}
1465
1466
1467OfferToMakeBootableISO() {
1468 local i old_pwd
[2457]1469 if [ -z "$ISO_CMD" ]; then
[2963]1470 LogIt "ERROR: Neither mkisofs nor genisoimage found, unable to make CD image"
[2457]1471 return
1472 fi
[1684]1473 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[966]1474 echo -en "Shall I make a bootable CD image? (y/[n]) "
[747]1475 read i
1476 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1477 fi
[940]1478 rm -Rf $MINDI_TMP/iso
[1983]1479 mkdir -p $MINDI_TMP/iso/{images,archives}
[2963]1480 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"
1481 LogFile "INFO: mindi_lib = $MINDI_LIB"
[747]1482 for i in memdisk memtest.bin memtest.img ; do
[953]1483 j=$MINDI_LIB/$i
[1983]1484 k=$MINDI_TMP/iso
[953]1485 if [ -e "$j" ] ; then
[2963]1486 LogIt "INFO: Copying $j to $k"
[2092]1487 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1488 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1885]1489 if [ _"$MONDO_SHARE" != _"" ]; then
1490 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1491 fi
[953]1492 fi
[747]1493 done
[2948]1494 MakeMessageFile | cut -c1-80 > $MINDI_TMP/iso/message.txt
[2629]1495 if [ $KERNEL_IS_XEN = "yes" ]; then
1496 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?"
1497 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?"
1498 fi
[2681]1499 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?"
1500 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]1501
[1885]1502 if [ _"$MONDO_SHARE" != _"" ]; then
[2681]1503 if [ $KERNEL_IS_XEN = "yes" ]; then
1504 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?"
1505 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?"
1506 fi
[1929]1507 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]1508 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]1509 fi
[2073]1510 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
[747]1511 if [ "$ARCH" != "ia64" ] ; then
[2092]1512 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]1513 fi
[1983]1514 old_pwd=`pwd`
[2712]1515 cd "$MINDI_TMP/iso"
[747]1516 if [ "$ARCH" != "ia64" ] ; then
[1885]1517 if [ _"$MONDO_SHARE" != _"" ]; then
[2681]1518 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?"
1519 if [ $KERNEL_IS_XEN = "yes" ]; then
1520 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]1521 fi
[1983]1522 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
[1885]1523 fi
[1983]1524 $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]1525 else
[1983]1526 $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]1527 fi
1528 if [ "$?" -ne "0" ] ; then
[2963]1529 LogFile "----------- $ISO_CMD's errors --------------"
1530 LogAll "$ISO_CMD returned the following errors:"
1531 cat $MINDI_TMP/mkisofs.log | tee -a $LOGFILE
1532 LogIt "ERROR: Failed to create ISO image."
[747]1533 else
[2963]1534 LogAll "INFO: Created bootable ISO image at $MINDI_CACHE/mindi.iso"
[747]1535 fi
[940]1536 rm -f $MINDI_TMP/mkisofs.log
[2712]1537 cd "$old_pwd"
[747]1538}
1539
1540
[1684]1541OfferToMakeBootableUSB() {
[2041]1542 local i
[1684]1543 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[2621]1544 echo -n "Shall I make a bootable USB device ? (y/[n]) "
[1764]1545 read i
1546 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1547 if [ "$USBDEVICE" = "" ]; then
1548 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1549 read dev
1550 USBDEVICE=$dev
[1722]1551 fi
[1764]1552 echo "WARNING: This will erase all content on $USBDEVICE"
1553 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
[2040]1554 read i
1555 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
[1684]1556 fi
1557 rm -Rf $MINDI_TMP/usb
1558 mkdir -p $MINDI_TMP/usb
1559 USBPART="${USBDEVICE}1"
1560
1561 echo -en "Transforming $USBDEVICE in a Bootable device "
1562 echo -en "."
[2963]1563 LogFile "INFO: Transforming $USBDEVICE in a Bootable device"
1564 LogFile "INFO: Checking $USBDEVICE"
[2924]1565 $FDISK -l $USBDEVICE 2>&1 >> $LOGFILE
[1684]1566 if [ $? -ne 0 ]; then
[2963]1567 LogAll "ERROR: Unable to access $USBDEVICE"
1568 LogAll " Make sure your USB device is pluged in"
1569 MindiExit -1
[1684]1570 fi
1571 echo -en "."
[2963]1572 LogFile "INFO: Unmounting $USBPART just in case"
[1721]1573 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
[2057]1574 # If your key has no MBR it may cause an issue
1575 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
[2855]1576 if [ -r $MBRFILE ]; then
[2963]1577 LogAll "INFO: Installing an MBR ($MBRFILE) on $USBDEVICE"
[2855]1578 dd if=$MBRFILE of=$USBDEVICE
1579 else
[2963]1580 LogAll "WARNING: You may need to install an MBR (usually in $MBRFILE, but not found on your system)"
1581 LogAll " on $USBDEVICE with dd if=$MBRFILE of=$USBDEVICE"
[2855]1582 fi
[2963]1583 LogFile "INFO: Preparing $USBDEVICE"
[2851]1584 cat > $MINDI_TMP/fdisk.txt << EOF
[2057]1585d
1586d
1587d
1588d
[1684]1589n
1590p
15911
1592
1593
1594t
1595b
1596a
15971
1598w
1599EOF
[2851]1600 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
[1684]1601 if [ $? -ne 0 ]; then
[2963]1602 LogAll "ERROR: Unable to create a vfat Filesystem on $USBDEVICE"
1603 LogAll " Make sure your USB device is pluged in"
[1684]1604 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1605 MindiExit -1
1606 fi
[2963]1607 LogFile "fdisk build file"
1608 LogFile "----------------"
[2851]1609 cat $MINDI_TMP/fdisk.txt >> $LOGFILE
[2963]1610 LogFile "----------------"
[2924]1611 rm -f $MINDI_TMP/fdisk.txt
[2963]1612 LogFile "INFO: The USB device $USBDEVICE now looks like this:"
[2190]1613 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
[1684]1614 echo -en "."
[3006]1615 # Calling kpartx in case devices were not created
[3033]1616 if [ -x "/sbin/kpartx" ]; then
[3027]1617 /sbin/kpartx -a $USBDEVICE
1618 fi
[2461]1619 # Some distro do auto mount at that point (Ubuntu)
[2963]1620 LogFile "INFO: Unmounting $USBPART just in case again"
[2461]1621 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1622 echo -en "."
[2963]1623 LogFile "INFO: Creating a vfat filesystem on $USBPART"
[1688]1624 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
[1684]1625 if [ $? -ne 0 ]; then
[2963]1626 LogAll "ERROR: Unable to create a vfat filesystem on $USBPART"
1627 LogAll " Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)"
[1684]1628 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1629 MindiExit -1
1630 fi
1631 echo -en "."
[2963]1632 LogFile "INFO: Mounting $USBPART on $MINDI_TMP/usb"
[1684]1633 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1634 if [ $? -ne 0 ]; then
[2963]1635 LogAll "ERROR: Unable to mount $USBPART on $MINDI_TMP/usb"
1636 LogAll " Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)"
[1684]1637 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1638 MindiExit -1
1639 fi
1640 echo -en "."
[1691]1641 mkdir -p $MINDI_TMP/usb/images
[2963]1642 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]1643 echo -en "."
[2963]1644 LogFile "INFO: mindi_lib = $MINDI_LIB"
[1684]1645 for i in memdisk memtest.bin memtest.img ; do
1646 j=$MINDI_LIB/$i
1647 k=$MINDI_TMP/usb
1648 if [ -e "$j" ] ; then
[2963]1649 LogIt "INFO: Copying $j to $k"
[2092]1650 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1651 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1684]1652 fi
1653 done
1654 echo -en "."
[2948]1655 MakeMessageFile | cut -c1-80 > $MINDI_TMP/usb/message.txt
[1684]1656 echo -en "."
[2092]1657 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]1658 echo -en "."
[1983]1659 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
[1684]1660 echo -en "."
[2041]1661 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
[1684]1662 echo -en "."
[2963]1663 LogAll "----------- syslinux's conf --------------"
[2476]1664 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
[2963]1665 LogAll "------------------------------------------"
[1721]1666 umount $MINDI_TMP/usb
[1684]1667 if [ "$ARCH" != "ia64" ] ; then
[2939]1668 syslinux -v 2>&1 | grep -q 4.02
1669 if [ $? -eq 0 ]; then
1670 # This buggy version of syslinux requires a call to --stupid and not -s
1671 syslinux --stupid $USBPART 2>> $MINDI_TMP/syslinux.log
1672 res=$?
1673 else
1674 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
1675 res=$?
1676 fi
1677 if [ $res -ne 0 ] ; then
[2963]1678 LogAll "----------- syslinux's errors --------------"
[1684]1679 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
[2963]1680 LogAll "------------------------------------------"
1681 LogIt "ERROR: Failed to create USB image."
[1684]1682 else
1683 echo -e "$DONE"
[2963]1684 LogFile "INFO: Created bootable USB image on $USBDEVICE"
[1684]1685 fi
1686 rm -f $MINDI_TMP/syslinux.log
1687 else
[2963]1688 LogAll "ERROR: No USB boot support for ia64"
[1684]1689 MindiExit -1
1690 fi
1691}
1692
1693
[747]1694MakeMessageFile() {
[2292]1695
1696 if [ -x "/bin/lsb_release" ]; then
1697 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
[2754]1698 elif [ -r /etc/arch-release ]; then # this code must be written before /etc/issue test to avoid errors
1699 DESC="Arch Linux"
1700 if [ -r /var/log/pacman.log ]; then
1701 # there are no releases but we can get the last system upgrade
1702 # Output example: Arch Linux [2011-03-03 01:39]
1703 DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"
1704 fi
[2732]1705 elif [ -r /etc/issue.net ]; then
[2731]1706 DESC=`head -1 /etc/issue.net`
[2732]1707 elif [ -r /etc/issue ]; then
[2731]1708 DESC=`head -1 /etc/issue`
[2292]1709 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1710 # For pb >= 0.9.8
[2731]1711 DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
[747]1712 else
[2731]1713 DESC="Unknown desc"
[747]1714 fi
[2292]1715 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]1716 if [ _"$MONDO_SHARE" != _"" ]; then
1717 if [ "$CDRECOVERY" != "yes" ] ; then
[2380]1718 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1885]1719 echo -en "Press <enter> to continue.\n"
1720 elif [ ! "$MINDI_TMP" ] ; then
1721 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
[1983]1722 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1723 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1724 fi
[1885]1725 else
1726 echo -en "$BOOT_MEDIA_MESSAGE"
[747]1727 fi
[1983]1728 else
1729 echo -en "\
[747]1730To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1731CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
[1983]1732 fi
[747]1733 fi
1734 echo -en "\n\n\n"
1735}
1736
1737
[1983]1738MakeBootConfFile() {
[1885]1739 local options i ooo
[747]1740 options=""
[1983]1741 # Type of boot file (elilo or syslinux/isolinux)
1742 type=$1
1743 if [ "$type" = "elilo" ]; then
1744 sep="="
1745 else
1746 sep=" "
1747 fi
[925]1748
[1983]1749 # Generic header for conf file
1750 if [ "$type" != "elilo" ] ; then
1751 echo -en "prompt 1\ndisplay message.txt\n"
1752 else
1753 echo -en "prompt\n"
[925]1754 fi
[1983]1755
1756 # Compute which default option to boot from
[747]1757 if [ "$CDRECOVERY" = "yes" ] ; then
[1983]1758 echo -en "default${sep}RESTORE\n"
1759 # In case it's mondoarchive
[1885]1760 elif [ _"$MONDO_SHARE" != _"" ]; then
[2380]1761 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1983]1762 echo -en "default${sep}iso\n"
[747]1763 else
[3053]1764 echo -en "default${sep}${MINDI_DEFAULT_BOOT_OPTION}\n"
[747]1765 fi
1766 else
[1983]1767 echo -en "default${sep}expert\n"
[747]1768 fi
1769
[1983]1770 # Handle timeout
[747]1771 if [ "$CDRECOVERY" != "yes" ] ; then
[3053]1772 echo -en "timeout${sep}${MINDI_BOOT_TIMEOUT}\n"
[1983]1773 else
1774 echo -en "timeout${sep}10000\n"
[747]1775 fi
1776 echo -en "\n"
[1983]1777
[2124]1778 # prepare which labels will be generated
[747]1779 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1780 options="RESTORE expert"
[1885]1781 else
1782 if [ _"$MONDO_SHARE" != _"" ]; then
[2344]1783 options="interactive expert compare iso nuke isonuke"
[747]1784 else
1785 options="expert"
[925]1786 fi
[747]1787 fi
[1983]1788
1789 # Generate rest of conf file
[747]1790 for i in $options ; do
[925]1791 ooo=$i
1792 [ "$ooo" = "RESTORE" ] && ooo="nuke"
[1983]1793 if [ "$type" = "elilo" ]; then
[2564]1794 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]1795 else
[2073]1796 ps="/"
1797 if [ "$type" = "syslinux" ]; then
1798 ps=""
1799 fi
[2629]1800 if [ $KERNEL_IS_XEN = "no" ]; then
1801 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"
1802 else
1803 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"
1804 fi
[925]1805 fi
[1885]1806 echo -en "$outstr"
[747]1807 done
[1983]1808 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1809 if [ "$type" = "elilo" ]; then
1810 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
[2073]1811 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
[1983]1812 else
[2073]1813 ps="/"
1814 if [ "$type" = "syslinux" ]; then
1815 ps=""
1816 fi
1817 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1818 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
[1983]1819 fi
1820 fi
[747]1821}
1822
1823
1824PrepareBootDiskImage_LILO() {
[1983]1825 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1826 imagesdir=$MINDI_CACHE
1827 kernelpath=$1
[747]1828
1829 retval=0
[2690]1830 [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
[1885]1831 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1832 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]1833 echo -en "..."
[1885]1834 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
[940]1835 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1836 mkdir -p $mountpoint
[1885]1837 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[1983]1838 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
[2963]1839 mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
[964]1840 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]1841 mkdir -p $mountpoint/etc
[1983]1842 liloconf=$mountpoint/elilo.conf
[747]1843
[1983]1844 MakeBootConfFile elilo > $liloconf
[747]1845
[1230]1846 # Copy it so that CD-ROM menu entry is satisfied
[1983]1847 mountefi=0
1848 df -T | grep /boot/efi | grep -q vfat
1849 if [ $? -ne 0 ]; then
1850 mount /boot/efi
[1230]1851 if [ $? -ne 0 ]; then
[1983]1852 echo "You have to mount your EFI partition when using mindi"
1853 MindiExit -1
[1230]1854 fi
[1983]1855 mountefi=1
[1230]1856 fi
[1983]1857 el=`find /boot/efi -name elilo.efi`
1858 cp $el $mountpoint
1859 cp $liloconf $mountpoint
1860 if [ $mountefi -eq 1 ]; then
1861 umount /boot/efi 2>&1 > /dev/null
1862 fi
[1230]1863
[2963]1864 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint..."
[1983]1865 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
[747]1866 if [ "$?" -ne "0" ] ; then
[2963]1867 LogIt "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1868 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2963]1869 LogIt " Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[940]1870 rm -f $MINDI_TMP/mtpt.$$
[2963]1871 LogIt "ERROR: Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1872 retval=$(($retval+1))
1873 fi
[2948]1874 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
[747]1875
1876 mkdir -p $mountpoint/tmp
[1983]1877 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1878 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
[747]1879 fi
1880
[925]1881 # copy the kernel across
[1230]1882 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1883 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1884 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2092]1885 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
[1885]1886 if [ "$?" -ne "0" ] ; then
[2963]1887 LogFile "INFO: Files at mountpoint ($mountpoint) :"
[925]1888 du -sk $mountpoint/* >> $LOGFILE
[2963]1889 LogFile "--- end of list of files ---"
[2691]1890 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
[1998]1891 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[2712]1892 cd "$old_pwd"
[747]1893 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[2963]1894 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
[925]1895 # losetup /dev/loop0 -d
[1998]1896 [ "$imagefile" != "" ] && rm -f $imagefile
[2963]1897 LogIt "ERROR: Sorry, your kernel is too big for your image"
[2773]1898 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[1885]1899 return 0
[747]1900 fi
1901 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[2963]1902 LogFile "INFO: Free space left on image = $free_space KB"
1903 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
[1794]1904 # make it bootable
[1998]1905 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[963]1906 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[1983]1907 if [ "$KERN_DISK_MADE" ] ; then
[2963]1908 LogFile "INFO: Not running LILO. It's not that kind of disk."
[747]1909 fi
[925]1910
[1983]1911 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
[747]1912 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1913 echo -en "..."
[2963]1914 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
[747]1915 if [ "$retval" -eq "0" ] ; then
[1885]1916 echo -en "...$DONE\n"
[747]1917 if [ "$KERN_DISK_MADE" ] ; then
[2963]1918 LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
[747]1919 fi
1920 else
[1885]1921 echo -en "...failed\n"
[2963]1922 LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
[1998]1923 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1924 fi
[2963]1925 [ "$retval" -ne "0" ] && LogIt "WARNING: PrepareBootDiskImage() is returning nonzero"
[747]1926 return $retval
1927}
1928
1929
[2073]1930PrepareBootDiskImage_ISOLINUX() {
[1983]1931 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1932 imagesdir=$MINDI_CACHE
1933 kernelpath=$1
[747]1934 do_boot_root_thingy=""
1935 local retval old_pwd
1936 retval=0
[925]1937
[2690]1938 [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
[1885]1939 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1940 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]1941 echo -en "..."
[2067]1942 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
[940]1943 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1944 mkdir -p $mountpoint
[1885]1945 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[2963]1946 LogFile "INFO: Creating vfat filesystem on $imagefile"
[1885]1947 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
[2067]1948 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
[1885]1949 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1950
[2625]1951 # Only move it now to its final destination and use it now
[2067]1952 mv $imagefile $imagesdir
1953 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1954
[2963]1955 mount -t vfat -o loop $imagefile $mountpoint || LogIt "ERROR: Cannot mount (PBDI)"
[925]1956
1957 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[2948]1958 MakeMessageFile | cut -c1-80 > $mountpoint/message.txt
[2073]1959 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
[2963]1960 LogFile "INFO: Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..."
[1983]1961 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
[747]1962 if [ "$?" -ne "0" ] ; then
[2963]1963 LogAll "ERROR: Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1964 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2963]1965 LogAll " Please unload some of your modules and try again."
[940]1966 rm -f $MINDI_TMP/mtpt.$$
[2963]1967 LogAll " Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)."
1968 LogAll " Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[747]1969 retval=$(($retval+1))
1970 fi
1971
1972 mkdir -p $mountpoint/tmp
[1983]1973 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1974 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1975 fi
[747]1976
[925]1977 # copy the kernel across
[1230]1978 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1979 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1980 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2629]1981
1982 retval=0
[2681]1983 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1984 retval=$?
1985 if [ $KERNEL_IS_XEN = "yes" ]; then
[2629]1986 cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
1987 let retval+=$?
1988 fi
1989
1990 if [ "$retval" -ne "0" ] ; then
[2963]1991 LogFile "INFO: Files at mountpoint ($mountpoint) :"
[747]1992 du -sk $mountpoint/* >> $LOGFILE
[2963]1993 LogFile "--- end of list of files ---"
[2691]1994 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
[1998]1995 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[2712]1996 cd "$old_pwd"
[747]1997 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[2963]1998 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
[747]1999
[2963]2000 LogIt "ERROR: Sorry, your kernel is too big for your image"
[2773]2001 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[747]2002 fi
2003 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[2963]2004 LogFile "INFO: Free space left on image = $free_space KB"
2005 LogFile "INFO: Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K"
[925]2006
2007 # make it bootable
[1998]2008 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[747]2009 mkdir -p $mountpoint/etc
[963]2010 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]2011 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
2012 echo -en "..."
[2963]2013 rmdir $mountpoint || LogIt "ERROR: Cannot rmdir (PBDI)"
[747]2014
2015 if [ "$retval" -eq "0" ] ; then
[1885]2016 echo -en "...$DONE\n"
[747]2017 if [ "$KERN_DISK_MADE" ] ; then
[1998]2018 [ "$imagefile" != "" ] && rm -f $imagefile
[2963]2019 LogIt "INFO: $BOOT_SIZE KB boot disks were created OK\n"
[747]2020 fi
2021 else
[1885]2022 echo -en "...failed\n"
[2963]2023 LogIt "WARNING: $BOOT_SIZE""KB boot disk was NOT created\n"
[1998]2024 [ "$imagefile" != "" ] && rm -f $imagefile
[747]2025 fi
[2963]2026 [ "$retval" -ne "0" ] && LogIt "ERROR: PrepareBootDiskImage() is returning nonzero"
[747]2027 return $retval
2028}
2029
2030
[2006]2031ParseModprobeForIncludes() {
2032local MODPROBE_CONF mpincfile includes include
2033
2034MODPROBE_CONF=/etc/modprobe.conf
2035mpincfile=$1
2036touch $mpincfile
2037if [ -a $MODPROBE_CONF ]; then
[2431]2038 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
[2006]2039 if [ -n "$includes" ]; then
2040 for include in $includes
2041 do
2042 if [ -a "$include" ]; then
2043 echo $include >> $mpincfile
2044 fi
2045 done
2046 fi
2047fi
2048}
2049
2050
[747]2051PrepareDataDiskImages() {
[2006]2052 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
[747]2053
[1983]2054 imagesdir=$MINDI_CACHE
[1902]2055 rm -f $imagesdir/mindi.iso
[940]2056 needlist=$MINDI_TMP/what-we-need.txt
2057 bigdir=$MINDI_TMP/bigdir
[747]2058 mkdir -p $bigdir/usr/bin
[1983]2059 mkdir -p $bigdir/usr/sbin
[2006]2060 includefile=$MINDI_TMP/$$.includefile.txt
[747]2061
[2409]2062 if [ -e "$DEPLIST_FILE" ]; then
2063 lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
2064 else
2065 lfiles="$DEPLIST_DIR/*"
2066 fi
[1885]2067 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
[2006]2068 ParseModprobeForIncludes $includefile
[2019]2069 lines=$(($lines+`cat $includefile | wc -l`))
[2006]2070 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
[747]2071 res=$?
[2006]2072 rm -f $includefile
[747]2073 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]2074 pwd=`pwd`
[2712]2075 cd "$MINDI_TMP"
[747]2076 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[2712]2077 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
[747]2078 done
[925]2079 for i in $EXTRA_MODS ; do
[1810]2080 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
[2995]2081 [ ! "$j" ] && LogFile "WARNING: cannot find failsafe module $i.o.gz"
[925]2082 for k in $j ; do
[2963]2083 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR: module $k extraction issue" $MINDI_TMP/$$.log
2084 LogFile "INFO: Added failsafe module $k to ramdisk"
[925]2085 done
2086 done
[2712]2087 cd "$pwd"
[747]2088 else
[925]2089 ListKernelModulePaths >> $needlist
[747]2090 fi
2091 if [ "$res" -ne "0" ] ; then
[1902]2092 Die "You have $res files present in dependency list\nbut absent from filesystem."
[747]2093 fi
2094 FindAndAddUserKeyboardMappingFile
2095 mkdir -p $bigdir/tmp
[1885]2096 if [ _"$MONDO_SHARE" != _"" ]; then
[940]2097 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2098 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]2099 fi
2100 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2101 DropOptimizedLibraries $needlist $bigdir
2102 echo -en "Assembling dependency files"
2103 CopyDependenciesToDirectory < $needlist $bigdir
2104
[925]2105 # also copy io.sys and msdos.sys, if we can find them
[747]2106 for i in `mount | cut -d' ' -f3` ; do
[925]2107 for j in io.sys msdos.sys ; do
[963]2108 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
[925]2109 done
[747]2110 done
2111
[925]2112 # master boot record, too
[940]2113 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]2114 if [ "$i" ] ; then
[2963]2115 LogIt "INFO: Backing up $i's MBR"
[925]2116 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2117 sleep 1
2118 sync
2119 j=$i
2120 [ -h "$j" ] && j=`readlink -f $j`
[2963]2121 LogIt "INFO: Creating /dev/boot_device ($j)"
[925]2122 mkdir -p $bigdir/dev
[2089]2123 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
[747]2124 fi
2125
2126 old_pwd=`pwd`
[2712]2127 cd "$bigdir"
[747]2128
[1983]2129 # Get terminfo content
2130 ti="usr/share/terminfo/l"
2131 if [ -d /$ti ]; then
2132 mkdir -p $ti
[2963]2133 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "ERROR: issue copying terminfo"
[747]2134 fi
[1764]2135 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
[747]2136 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
[1335]2137 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
[747]2138 fi
[2290]2139 if [ -d "/lib/dev-state" ]; then
[2963]2140 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
[2290]2141 fi
[2712]2142 cd "$old_pwd"
[747]2143 echo -e "$DONE"
2144 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
[940]2145 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]2146 CheckMountlist $MINDI_TMP/mountlist.txt
[1902]2147 mkdir -p $bigdir/tmp
[2092]2148 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
[1885]2149 if [ _"$MONDO_SHARE" != _"" ]; then
[1902]2150 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
[1885]2151 fi
[2032]2152 if [ $LVM != "false" ]; then
2153 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2154 if [ "$?" -ne "0" ]; then
2155 LVM="false"
2156 rm -f $bigdir/tmp/i-want-my-lvm
[2552]2157 else
[2963]2158 LogFile "Your i-want-my-lvm file content is:"
2159 LogFile "-----------------------------------"
[2552]2160 cat $bigdir/tmp/i-want-my-lvm >> $LOGFILE
[2963]2161 LogFile "-----------------------------------"
[2032]2162 fi
2163 fi
[2963]2164 LogFile "Your mountlist.txt file content is:"
2165 LogFile "-----------------------------------"
[1902]2166 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
[2963]2167 LogFile "-----------------------------------"
[2432]2168
[2092]2169 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2170 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
[1902]2171 if [ _"$MONDO_SHARE" != _"" ]; then
2172 for q in filelist.full.gz biggielist.txt ; do
2173 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2174 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2175 done
2176 fi
2177
2178 echo -en "Tarring and zipping the data content..."
2179 size_of_all_tools=`du -sk $bigdir | cut -f1`
[2963]2180 (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]2181 du -sk $imagesdir/*gz >> $LOGFILE
2182 echo -e "$DONE"
2183
[747]2184 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[1902]2185 rm -rf $bigdir
[747]2186 rm -f $needlist
2187}
2188
2189
2190ProcessLDD() {
[1784]2191 local incoming f d nd bd bnd
[747]2192 read incoming
[1784]2193 while [ "$incoming" != "" ]; do
[859]2194 # We take the full path name of the dyn. lib. we want
[2431]2195 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
[1526]2196 for f in $incoming ; do
[1784]2197 # echo modified file name if one of the parent dir is a link
2198 # by replacing the original dirname by the destination of the link
2199 d="`dirname $f`"
2200 found="false"
2201 while [ "$d" != "/" ]; do
2202 if [ -h "$d" ]; then
2203 nd=`readlink -f $d`
2204 bd=`basename $d`
2205 bnd=`basename $nd`
2206 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2207 echo $d
2208 fi
2209 d="`dirname $d`"
2210 done
2211
[1721]2212 echo "$f"
2213 echo "`ReadAllLink $f`"
[747]2214 done
2215 read incoming
2216 done
2217}
2218
2219
2220Prompt() {
2221 echo -en "$1"
2222 read line
2223}
2224
2225
2226ReadLine() {
2227 local i incoming
2228 read incoming
2229 i=0
2230 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2231 i=$(($i+1))
2232 read incoming
[747]2233 done
2234 echo "$incoming"
2235}
2236
2237
2238SizeOfPartition() {
2239 local devpath drive res stub
2240 device=$1
[2917]2241 if [ "`echo "$device" | grep -E "^/dev/"`" = "" ] ; then
2242 Die "Cannot find $device's size - is your /etc/fstab sane?"
2243 fi
[747]2244 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2245 res=`SizeOfRaidPartition $device`
2246 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2247 echo "$res"
2248 return 0
[747]2249 fi
[925]2250 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[960]2251 res=`$FDISK -s $device 2>> $LOGFILE`
[925]2252 # end patch
[2448]2253 # take only the first in case of multiple mount (cifs, nfs, ...)
2254 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
[747]2255 [ "$res" = "" ] && res="-1"
2256 echo $res
2257 return 0
2258}
2259
2260
2261SizeOfRaidPartition() {
2262 local real_dev smallest_size silly tmp
2263
2264 silly=999999999
2265 smallest_size=$silly
2266
2267 for real_dev in `GetRaidDevMembers $1` ; do
[925]2268 tmp=`SizeOfPartition $real_dev`
2269 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2270 done
2271
2272 if [ "$smallest_size" = "$silly" ] ; then
[925]2273 echo "-1"
2274 return 1
[747]2275 else
[925]2276 echo "$smallest_size"
2277 return 0
[747]2278 fi
2279}
2280
2281
2282StripComments()
2283{
2284 local tempfile
[925]2285
[940]2286 tempfile=$MINDI_TMP/$$.strip.txt
[963]2287 cp -f $1 $tempfile 2>> $LOGFILE
[747]2288 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2289 rm -f $tempfile
[2963]2290 LogFile "INFO: Stripped comments from $2"
[747]2291}
2292
2293
[925]2294
[747]2295StripExecutable()
2296{
2297 local tmpfile
[925]2298
[940]2299 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2300 [ -d "$1" ] || [ -h "$1" ] && return
[963]2301 cp -f $1 $tmpfile 2>> $LOGFILE
[747]2302 strip $tmpfile 2> /dev/null
2303 if [ "$?" -eq "0" ] ; then
[963]2304 cp -f $tmpfile $1 2>> $LOGFILE
[2963]2305 LogFile "INFO: Stripped binary $2"
[747]2306 fi
2307 rm -f $tmpfile
2308}
2309
[2292]2310KernelVer() {
2311 local fkern_ver fname
[747]2312
[2292]2313 fname=$1
2314 file $fname | grep -q gzip
2315 if [ "$?" -eq "0" ] ; then
2316 # Used by ia64
2317 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2318 else
2319 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2320 fi
2321 echo "$fkern_ver"
2322}
2323
2324
[2880]2325# WARNING: This function should just echo the final result !!!
2326#
[747]2327TryToFindKernelPath() {
[2880]2328 local fname fkern_ver we_want_version possible_kernels noof_kernels possible_xenkernels noof_xenkernels kp kdate duff_kernels output root
[925]2329
[2292]2330 we_want_version=$KERVERRUN
[747]2331 possible_kernels=""
2332 duff_kernels=""
[2880]2333 output=""
[747]2334
2335 if [ "$ARCH" = "ia64" ] ; then
2336 root="/boot/efi/efi"
2337 else
2338 root="/"
2339 fi
[2681]2340 # See if we're booted from a Xen kernel
[2889]2341 # From http://wiki.xensource.com/xenwiki/XenCommonProblems#head-26434581604cc8357d9762aaaf040e8d87b37752
2342 if [ -f /proc/xen/capabilities ]; then
[2681]2343 # It's a Xen kernel
2344 KERNEL_IS_XEN="yes"
[2963]2345 LogFile "INFO: It's a Xen kernel..."
[2681]2346 fi
2347
2348 for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/'` ; do
[925]2349 [ ! -e "$fname" ] && continue
[747]2350 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[2292]2351 fkern_ver=`KernelVer $fname`
[747]2352 [ "$fkern_ver" = "" ] && continue
2353 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2354 [ -f "$fname" ] || continue
2355 [ -h "$fname" ] && continue
2356 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2357 file $fname | grep -q gzip
2358 if [ "$?" -eq "0" ] ; then
2359 # Used by ia64
2360 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2880]2361 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2362 duff_kernels="$fname $duff_kernels"
2363 else
[747]2364 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2365 possible_kernels="$fname $possible_kernels"
[925]2366 fi
[747]2367 else
[925]2368 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2880]2369 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2370 duff_kernels="$fname $duff_kernels"
2371 else
[747]2372 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2373 possible_kernels="$fname $possible_kernels"
[925]2374 fi
[747]2375 fi
2376 done
2377 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2378 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2379 fi
2380 if [ ! "$possible_kernels" ] ; then
[2963]2381 LogFile "INFO: No kernel matches exactly. Are there any duff kernels?"
[747]2382 possible_kernels="$duff_kernels"
2383 if [ ! "$possible_kernels" ] ; then
[2963]2384 LogFile "INFO: Sorry, no duff kernels either"
[747]2385 else
[2963]2386 LogFile "INFO: I bet you're running Debian or Gentoo, aren't you?"
2387 LogFile "INFO: Your kernel doesn't have a sane builddate. Oh well..."
[747]2388 fi
2389 fi
[2681]2390 if [ $KERNEL_IS_XEN = "yes" ]; then
2391 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2392 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2393 FindMboot32Binary
2394 fi
[2829]2395 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2396 noof_kernels=`CountItemsIn "$possible_kernels"`
[747]2397 if [ "$noof_kernels" -eq "0" ] ; then
[2880]2398 LogFile "Could not find your kernel."
[925]2399 if [ -e "/boot/vmlinuz" ] ; then
[2963]2400 LogFile "INFO: Using /boot/vmlinuz as a last resort."
[925]2401 output=/boot/vmlinuz
[747]2402 else
[925]2403 output=""
2404 fi
[747]2405 elif [ "$noof_kernels" -eq "1" ] ; then
[2880]2406 kp=`echo "$possible_kernels" | sed s/' '//`
[2963]2407 LogFile "INFO: Your kernel is $kp (v$KERVERRUN)"
[2880]2408 output="$kp"
[747]2409 else
2410 for i in $possible_kernels ; do
[2880]2411 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
[2963]2412 LogFile "INFO: OK, I used my initiative and found that "
2413 LogFile "INFO: $i is probably your kernel. "
[925]2414 output="$i"
[2858]2415 break
[925]2416 fi
[747]2417 done
[2858]2418 if [ ! -n "$output" ]; then
[2880]2419 if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
[2681]2420 output=/boot/vmlinuz
[2963]2421 LogFile "INFO: Schlomo, this one's for you."
[2681]2422 else
[2963]2423 LogFile "INFO: Two or more possible kernels found. You may specify any one of them and the "
2424 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2425 LogFile "INFO: $possible_kernels"
[2880]2426 output=""
[2681]2427 fi
2428 fi
2429 fi
2430 if [ $KERNEL_IS_XEN = "yes" ]; then
2431 if [ "$noof_xenkernels" -eq "0" ]; then
2432 xenkernelpath=""
2433 elif [ "$noof_xenkernels" -eq "1" ]; then
2434 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
[2963]2435 LogFile "INFO: Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
[925]2436 else
[2681]2437 for i in $possible_xenkernels ; do
[2880]2438 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
[2963]2439 LogFile "INFO: OK, I used my initiative and found that "
2440 LogFile "INFO: $i is probably your Xen kernel. "
[2681]2441 xenkernelpath="$i"
[2858]2442 break
[2681]2443 fi
2444 done
[2858]2445 if [ ! -n "$xenkernelpath" ]; then
[2681]2446 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2447 if [ ! -n "$new_possible_xenkernels" ]; then
2448 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
[2963]2449 LogFile "INFO: Using $xenkernelpath"
[2681]2450 else
[2963]2451 LogFile "INFO: Two or more possible Xen kernels found. You may specify any one of them and the "
2452 LogFile "INFO: boot disks will still work, probably. If one does not work, try another."
2453 LogFile "INFO: $possible_xenkernels"
[2880]2454 output=""
[2681]2455 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
[2963]2456 LogFile "INFO: Using $xenkernelpath"
[2681]2457 fi
2458 fi
[925]2459 fi
[2681]2460 if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2461 Die "Cannot find Xen kernel $xenkernelpath, aborting"
2462 fi
[747]2463 fi
[2880]2464 LogAll "TryToFindKernelPath found $output"
[2681]2465 echo "$output"
[747]2466}
2467
2468
2469TurnTgzIntoRdz() {
[1983]2470 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]2471
[747]2472 tgz_dir_fname=$1
2473 rdz_fname=$2
[1983]2474 kernelsize=$3
[1885]2475 maxsize=$(($BOOT_SIZE-$kernelsize))
[747]2476 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2477 tempfile=$MINDI_TMP/temp.rd
2478 mountpoint=$MINDI_TMP/mnt1
[747]2479 res=0
2480 echo -en "..."
2481 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2482 echo -en "..."
[2963]2483 LogFile "INFO: Creating ext2 filesystem on $tempfile"
[1764]2484 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
[747]2485 echo -en "..."
2486 mkdir -p $mountpoint
2487 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."
2488 echo -en "..."
2489 old_pwd=`pwd`
[2712]2490 cd "$mountpoint"
[2034]2491
2492 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
[2042]2493 if [ -h "/lib64" ]; then
[2963]2494 mkdir -p lib || LogIt "ERROR: Unable to create lib in $mountpoint."
2495 ln -s lib lib64 || LogIt "ERROR: /lib64 is a symbolic link, but I couldn't create it in $mountpoint."
[2042]2496 fi
[3041]2497 # Check whether /sbin and /bin are a link and if so explicitly create one in rootfs (Fedora 17 crazyness)
2498 if [ -h "/sbin" ]; then
2499 mv sbin/* usr/sbin
2500 ln -s /usr/sbin sbin || LogIt "ERROR: /sbin is a symbolic link, but I couldn't create it in $mountpoint."
2501 fi
2502 if [ -h "/bin" ]; then
2503 mv bin/* usr/bin
2504 ln -s /usr/bin bin || LogIt "ERROR: /bin is a symbolic link, but I couldn't create it in $mountpoint."
2505 fi
[2034]2506
[2963]2507 # Check files before copying to discover configuration issues or McAfee preventing mindi reading these files
2508 for f in $tgz_dir_fname/*; do
2509 if [ ! -r $f ]; then
2510 Die "ERROR: Unable to copy $f to the target dir. Check your installation or McAfee presence"
2511 else
2512 cp -Rdf $f . 2>&1 >> $LOGFILE
2513 fi
2514 done
[747]2515 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
[1914]2516
[747]2517 cd dev || Die "Can't cd to dev"
2518 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2519 rm -f dev-entries.tgz
2520 cd ..
2521
2522 for w in insmod.static insmod.static.old ; do
[925]2523 s=`which $w 2> /dev/null`
2524 if [ -e "$s" ] ; then
[2156]2525 tar cf - -C / $s 2> /dev/null | tar xf -
[925]2526 fi
[747]2527 done
2528
2529 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
[2951]2530
[2438]2531 # Copy of files mandatory for ssh to automate mount if sshfs is used
2532 mkdir $mountpoint/.ssh
[2875]2533 cp -rp ~root/.ssh/* $mountpoint/.ssh 2> /dev/null
[2438]2534 echo > $mountpoint/tmp/myssh << EOF
2535ssh -o StrictHostKeyChecking=no $*
2536EOF
2537 chmod 755 $mountpoint/tmp/myssh
2538
[2039]2539 # Copy of files mandatory for ld.so
[2042]2540 cp -rp /etc/ld.so.c* $mountpoint/etc
[2039]2541
[2951]2542 # Handle the case where busybox and mount are dynamically linked
2543 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2544 if [ $? -eq 0 ]; then
2545 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2546 rm -f bin/mount
2547 fi
2548
2549 # Copy of files from the minimal env needed as per the deplist.d/minimal.conf file (which includes all busybox deps)
[3039]2550 mountlis=`grep -E "mount|fuse|ssh|libnss|bash" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2 | sort -u`
[2951]2551 rm -f $MINDI_TMP/minimal.lis
[3004]2552 for f in $MINDI_LIB/rootfs/bin/busybox $mountlis; do
[2951]2553 echo $f >> $MINDI_TMP/minimal.lis
2554 done
[3004]2555 LocateDeps $MINDI_LIB/rootfs/bin/busybox $mountlis >> $MINDI_TMP/minimal.lis
[2951]2556 for f in `cat $MINDI_TMP/minimal.lis`; do
2557 echo "`ReadAllLink $f`" >> $MINDI_TMP/minimal.lis
2558 done
2559 # Initial / are trucated by tar
[3014]2560 finallist=""
2561 # Remove directories from the list, as tar will create them anyway
2562 # and it may hurt if /lib is in it as on Debian/Ubuntu
2563 for f in `sort -u $MINDI_TMP/minimal.lis`; do
2564 if [ ! -d $f ]; then
2565 finallist="$finallist $f"
2566 fi
2567 done
2568 tar cf - $finallist 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in minimal analysis" $MINDI_TMP/$$.log
[3000]2569
2570 # To improve support for distribution scripts, we now prefer to use bash as the std shell. Also fixes #600
[3039]2571 ln -sf /bin/bash bin/sh
2572 LogIt "INFO: Using bash as default shell"
[2951]2573 rm -f $MINDI_TMP/minimal.lis
2574
2575 # Avoids an issue on some distro (RHEL5)
[2164]2576 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2577
[1914]2578 mkdir -p $mountpoint/tmp
[1724]2579 # Management of udev (which includes modprobe in rules)
[1759]2580 ps auxww | grep -v grep | grep -qw udevd
[1716]2581 if [ $? -eq 0 ]; then
[1914]2582 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
[2963]2583 LogIt "INFO: udev device manager found"
2584 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /etc/udev analysis" $MINDI_TMP/$$.log
[1790]2585 # This avoids NIC remapping if on another machine at restore time on Debian at least
[2145]2586 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2587 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2588 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
[2894]2589 # Do not do it if it's a link (Ubuntu 64 bits #503)
[2895]2590 if [ -e "/lib64/udev" ] && [ ! -h "/lib64" ] && [ ! -h "/lib64/udev" ]; then
[2963]2591 tar cf - -C / /lib64/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib64/udev analysis" $MINDI_TMP/$$.log
[2894]2592 fi
[2895]2593 if [ -e "/lib32/udev" ] && [ ! -h "/lib32" ] && [ ! -h "/lib32/udev" ]; then
[2963]2594 tar cf - -C / /lib32/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib32/udev analysis" $MINDI_TMP/$$.log
[2895]2595 fi
2596 if [ -e "/lib/udev" ] && [ ! -h "/lib" ] && [ ! -h "/lib/udev" ]; then
[2963]2597 tar cf - -C / /lib/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in /lib/udev analysis" $MINDI_TMP/$$.log
[2895]2598 fi
[2965]2599 if [ -x /sbin/udevd ] || [ -x /usr/bin/udevd ]; then
[2964]2600 lis2=`grep -Ev '^#' $DEPLIST_DIR/udev.conf`
[1781]2601 lis=""
2602 # Get only the files which exist in that list
[1815]2603 # and potentially their symlink structure
[1781]2604 for i in $lis2; do
[1815]2605 if [ -h $i ]; then
2606 j=$i
2607 while [ -h $j ]; do
2608 lis="$lis $j"
2609 j=`readlink $j`
2610 done
2611 lis="$lis $j"
2612 elif [ -f $i ]; then
[1781]2613 lis="$lis $i"
2614 fi
2615 done
2616 # And their deps
[1759]2617 LocateDeps $lis > $MINDI_TMP/udev.lis
2618 for i in $lis; do
2619 if [ "`echo $i | cut -c1`" = "/" ]; then
2620 j=`echo $i | cut -c2-`
[1998]2621 [ "$j" != "" ] && rm -f $j
[1759]2622 fi
2623 done
[2963]2624 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]2625 rm -f $MINDI_TMP/udev.lis
[1720]2626 else
[2965]2627 LogAll "WARNING: udevd daemon not in standard place (/sbin or /usr/bin)"
[2963]2628 LogAll " mindi will use static devices which may cause problems"
[1914]2629 rm -f $mountpoint/tmp/USE-UDEV
[1720]2630 fi
[1716]2631 fi
[1786]2632
[2882]2633 # Management of potential HW info (ProLiant only at the moment)
[1880]2634 rm -rf $MINDI_CACHE/bkphw
2635 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2636 if [ -d $MINDI_CACHE/bkphw ]; then
[2963]2637 LogIt "INFO: Hardware Information found and saved ..."
[1880]2638 cp -rp $MINDI_CACHE/bkphw .
2639 if [ -f $MINDI_CACHE/tools.files ]; then
2640 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
[1863]2641 LocateDeps $lis > $MINDI_TMP/tools.lis
[2963]2642 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]2643 fi
[1880]2644 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2645 mv -f $MINDI_CACHE/mindi-rsthw .
[1761]2646 chmod 755 ./mindi-rsthw
2647 fi
[1880]2648 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
[1761]2649 fi
2650
[2183]2651 # Management of perl scripts delivered needed at restore time
2652 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
[2963]2653 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "ERROR: Problem in perl scripts analysis" $MINDI_TMP/$$.log
[2183]2654
[1885]2655 for w in cdrom groovy-stuff ; do
[747]2656 mkdir -p mnt/$w
2657 done
2658
[2963]2659 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]2660
[2712]2661 cd "$old_pwd"
[747]2662 echo -en "..."
2663 old_pwd=`pwd`
2664 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[2712]2665 cd "$MINDI_TMP"
[1885]2666 needed_modules_path=lib/modules/$FAILSAFE_KVER
[747]2667 else
2668 cd /
2669 if [ "${kernelname}" != "" ]
2670 then
[1885]2671 needed_modules_path=lib/modules/${kernelname}
[747]2672 else
[2292]2673 needed_modules_path=lib/modules/$KERVERRUN
[747]2674 fi
2675 fi
[1885]2676
2677 needed_modules=""
[1993]2678 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
[1885]2679
[2380]2680 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[747]2681 # For PXE boot
2682 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2683 fi
[1715]2684 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2685 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2686 fi
[1727]2687 for i in $DENY_MODS; do
[2963]2688 LogFile "INFO: Removing $i from the list of modules to load"
[1727]2689 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2690 done
2691
[2963]2692 [ -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]2693 for i in $list_of_groovy_mods ; do
[1885]2694 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
[747]2695 done
[1914]2696
[2600]2697 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
[747]2698 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2699 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[2963]2700 LogFile "INFO: Adding $i ($s KB) to the rootfs"
[3011]2701 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "ERROR: Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
[1914]2702 # Uncompress modules if not using udev and native modprobe
[1815]2703 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2704 if [ "`echo "$i" | grep -F ".gz"`" ]; then
[2963]2705 LogFile "INFO: Uncompressing $i"
[1727]2706 gunzip -f $mountpoint/$i
[1815]2707 fi
[1727]2708 fi
[3011]2709 if [ -L $mountpoint/$i ] && [ `echo "$i" | grep "\.ko$"` ]; then
2710 echo "Replacing module symlink ($i) with actual file"
2711 rm -f $mountpoint/$i
2712 cp -Lf $i $mountpoint/$i
2713 ls -l $mountpoint/$i
2714 fi
[747]2715 done
[1815]2716
[2964]2717 # Also copy modules.* in case of udev so that normal modprobe works
2718 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]2719
[2680]2720 # Copy FW in case some drivers needs it
2721 if [ -d "/lib/firmware" ]; then
2722 cp -rp /lib/firmware $mountpoint/lib
2723 fi
2724
[2913]2725 # Copy an additional ProLiant tool for OBDR support
2726 if [ -f $MINDI_TMP/OBDR ]; then
2727 if [ -x /usr/bin/hpsa_obdr_mode ]; then
2728 mkdir -p $mountpoint/usr/bin
2729 cp -a /usr/bin/hpsa_obdr_mode $mountpoint/usr/bin
[2963]2730 LogIt "INFO: Copying /usr/bin/hpsa_obdr_mode to ramdisk for improved OBDR support"
[2913]2731 else
2732 LogAll "WARNING: You're using OBDR mode without having the /usr/bin/hpsa_obdr_mode tool"
2733 LogAll " This may lead to a tape not going back to sequential mode after OBDR boot"
2734 fi
2735 fi
2736
[1885]2737 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
[2963]2738 LogFile "INFO: Deleting devfsd daemon from ramdisk"
[2995]2739 [ ! -e "/sbin/devfsd" ] && LogFile " ...because /sbin/devfsd not found"
2740 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && LogFile " ...because kernel is failsafe"
[747]2741 rm -f $mountpoint/sbin/devfsd
2742 fi
[2712]2743 cd "$old_pwd"
[747]2744 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2745 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2746 rm -f $mountpoint/zero
[1885]2747 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2748 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[2092]2749 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2750 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
[747]2751 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2752 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2753 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2754 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[747]2755 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2756 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2757 fi
2758 mkdir -p $mountpoint/proc
[2963]2759 LogFile "---------------------------"
2760 LogFile "Content of initial ramdisk:"
2761 LogFile "---------------------------"
[2712]2762 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
[2963]2763 LogFile "---------------------------"
[2438]2764
[1230]2765 # Determine what filesystem to use for initrd image
[2963]2766 LogFile "INFO: Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd."
[1230]2767 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2768 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
[3008]2769 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ] || [ "$gvFileSystem" = "ext4fs" ]; then
[1230]2770 # say what will be used
[2963]2771 LogFile "INFO: Creating an $gvFileSystem initrd image..."
[1230]2772 # kernel expects linuxrc in ext2 filesystem
[2712]2773 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
[1230]2774 # unmount loop filesystem and create image file using the standard approach
2775 umount $mountpoint || Die "Cannot unmount $tempfile"
[1764]2776 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
[3008]2777 if [ "$gvFileSystem" = "ext4fs" ] && [ -x "/sbin/tune4fs" ]; then
2778 bs=`/sbin/tune4fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2779 else
2780 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
2781 fi
[2564]2782 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
[1799]2783 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
[1764]2784 rm -f ${rdz_fname}.tmp
[1230]2785 # log that we are done
[2995]2786 LogFile " ...done."
[2390]2787 elif [ "$gvFileSystem" = "initramfs" ]; then
[1230]2788 # say what will be used
[2963]2789 LogFile "INFO: Creating a gzip'ed cpio (AKA initramfs) initrd image..."
[1230]2790 # make sure that cpio is there
2791 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2792 # go into filesystem
[2712]2793 cd "$mountpoint"
[1230]2794 # kernel expects init in cpio filesystem
2795 ln -sf sbin/init init
2796 # create cpio image file and unmount loop filesystem
[1929]2797 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
[2712]2798 cd "$old_pwd"
[1230]2799 umount $mountpoint || Die "Cannot unmount $tempfile"
2800 # log that we are done
[2995]2801 LogFile " ...done."
[2390]2802 else
[1230]2803 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
[2390]2804 fi
2805
[747]2806 if [ "$res" -eq "0" ] ; then
2807 echo -en "..."
2808 else
2809 echo -en "\rMade an rdz WITH ERRORS. \n"
2810 fi
2811 return 0
2812}
2813
2814
2815##############################################################################
[1021]2816#----------------------------------- Main -----------------------------------#
[747]2817##############################################################################
2818
[1885]2819# Now we can create what we need
2820mkdir -p $MINDI_TMP
[747]2821
[1885]2822# Purge from potential old run
2823if [ _"$MINDI_CACHE" = _"" ]; then
2824 Die "MINDI_CACHE undefined"
2825fi
2826
[2995]2827# --nolog needs to be first, and is used in analyze-my-lvm
2828if [ "$1" = "--nolog" ] ; then
2829 shift
2830 LOGFILE=/dev/stderr
2831else
2832 > $LOGFILE
2833fi
[1885]2834if [ "$1" = "--printvar" ] ; then
2835 shift
2836 if [ _"$1" != _"" ] ; then
2837 set | grep -Ew "^$1" | cut -d= -f2
2838 fi
[2183]2839 exit 0
[1885]2840fi
2841
[2963]2842LogFile "mindi v$MINDI_VERSION"
2843LogFile "$ARCH architecture detected"
2844LogFile "mindi called with the following arguments:"
[2978]2845echo "$@">> $LOGFILE
[2963]2846LogFile "Start date : `date`"
2847LogFile "-----------------------------"
[747]2848
2849[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2850
[1010]2851# Log some capital variables
2852[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
[2963]2853LogFile "MONDO_SHARE = $MONDO_SHARE"
2854LogFile "MINDI_LIB = $MINDI_LIB"
2855LogFile "MINDI_SBIN = $MINDI_SBIN"
[1010]2856[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
[2963]2857LogFile "MINDI_CONF = $MINDI_CONF"
[1885]2858if [ -f $MINDI_CONFIG ]; then
[2963]2859 LogFile "-----------------------------"
2860 LogFile " Mindi configuration file "
2861 LogFile "-----------------------------"
[1885]2862 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
[2963]2863 LogFile "-----------------------------"
[1885]2864fi
[2995]2865LogFile "In Mindi"
2866LogFile "--------"
2867LogFile "EXTRA_SPACE = $EXTRA_SPACE"
2868LogFile "BOOT_SIZE = $BOOT_SIZE"
2869LogFile "--------"
[1010]2870
[747]2871trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]2872
2873# Sanity checks
2874which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2875which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2876which 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."
2877which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2878if which awk &> /dev/null ; then
2879 if ! which gawk &> /dev/null ; then
[2963]2880 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]2881 fi
2882fi
2883which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
[2222]2884[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
[1010]2885
[3005]2886[ "`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]2887
2888# Update the PATH variable if incomplete
2889if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2890 PATH=$PATH:/sbin:/usr/sbin
2891 export PATH
[2963]2892 LogFile "INFO: Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily."
2893 LogFile "INFO: However, you may wish to ask your vendor to provide a permanent fix..."
2894 LogFile "INFO: Or you might like to call 'su -' instead of 'su', for example."
[1010]2895fi
2896
[1885]2897# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2898if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2899 source $MINDI_LIB/FindDistroFailsafe
2900 # Log kernel image
[2963]2901 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
[1885]2902else
2903 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2904fi
[1010]2905
[1737]2906if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
[1010]2907 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2908fi
2909
[925]2910### BERLIOS
[747]2911### Fix as it's not mandatory on ia64
2912if [ "$ARCH" = "ia64" ] ; then
[1010]2913 if which elilo &> /dev/null ; then
2914 LILO_EXE=elilo
2915 else
[2024]2916 LILO_EXE=`which false 2> /dev/null`
[1010]2917 fi
[747]2918else
2919 FindIsolinuxBinary
2920fi
2921trap "Aborted" SIGTERM
2922DONE="\r\t\t\t\t\t\t\t\tDone. "
2923kernelpath=""
[1010]2924MONDO_ROOT=/var/cache/mondo
[747]2925mkdir -p $MONDO_ROOT
2926
2927if [ -d "/proc/lvm" ]; then
2928 # LVM v1
2929 LVMCMD=""
2930 LVM="v1"
2931elif [ -d "/dev/mapper" ]; then
2932 # LVM v2
2933 LVMCMD="lvm"
2934 LVM="v2"
2935else
2936 LVM="false"
2937fi
[2963]2938LogFile "INFO: LVM set to $LVM"
2939LogFile "----------"
2940LogFile "mount result:"
2941LogFile "-------------"
[1230]2942mount >> $LOGFILE
[1315]2943if [ -e /etc/raidtab ]; then
[2963]2944 LogFile "-------------"
2945 LogFile "/etc/raidtab content:"
2946 LogFile "-------------"
[1315]2947 cat /etc/raidtab >> $LOGFILE
2948fi
[2981]2949if [ -e /etc/mdadm.conf ]; then
2950 LogFile "-------------"
2951 LogFile "/etc/mdadm.conf content:"
2952 LogFile "-------------"
2953 cat /etc/mdadm.conf >> $LOGFILE
2954fi
[2963]2955LogFile "-------------"
2956LogFile "cat /proc/cmdline:"
2957LogFile "-------------"
[1418]2958cat /proc/cmdline >> $LOGFILE
[2963]2959LogFile "-------------"
2960LogFile "cat /proc/swaps:"
2961LogFile "-------------"
[2014]2962cat /proc/swaps >> $LOGFILE
[2963]2963LogFile "-------------"
[2981]2964LogFile "cat /proc/mdstat:"
2965LogFile "-------------"
2966cat /proc/mdstat >> $LOGFILE
2967LogFile "-------------"
[2963]2968LogFile "cat /proc/partitions:"
2969LogFile "-------------"
[2015]2970cat /proc/partitions >> $LOGFILE
[2963]2971LogFile "-------------"
2972LogFile "cat /proc/filesystems:"
2973LogFile "-------------"
[2015]2974cat /proc/filesystems >> $LOGFILE
[2963]2975LogFile "-------------"
2976LogFile "lsmod result:"
2977LogFile "-------------"
[1021]2978lsmod >> $LOGFILE
[2431]2979MODULES="`cat /proc/modules | $AWK '{print $1}'`"
[1531]2980if [ -x /usr/sbin/esxcfg-module ]; then
[2963]2981 LogFile "-------------"
2982 LogFile "INFO: VMWare ESX server detected - Enabling dedicated support"
2983 LogFile "-------------"
2984 LogFile "VMWare modules"
2985 LogFile "-------------"
[1531]2986 /usr/sbin/esxcfg-module -l >> $LOGFILE
[2431]2987 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
[1497]2988fi
[2963]2989LogFile "FORCE_MODS:"
2990LogFile "-------------"
2991LogFile $FORCE_MODS
2992LogFile "-------------"
2993LogFile "DENY_MODS:"
2994LogFile "-------------"
2995LogFile $DENY_MODS
2996LogFile "-------------"
2997LogFile "df result:"
2998LogFile "----------"
[1796]2999df -T >> $LOGFILE
[2963]3000LogFile "-------------"
[2995]3001LogFile "List of extra modules is:"
[2963]3002LogFile "$EXTRA_MODS"
3003LogFile "-------------"
[747]3004
[1723]3005# Compute libata version
[2649]3006laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
[1723]3007# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]3008if [ "`echo $MODULES | grep libata`" ]; then
[1727]3009 if [ "$laver" = "2" ]; then
[1726]3010 DENY_MODS="$DENY_MODS ide-generic"
[2963]3011 LogFile "INFO: ide-generic removed from module list as your system uses libata v2+"
3012 LogFile "-------------"
[1726]3013 fi
[1723]3014fi
3015
[2963]3016# Check for McAfee which disturbs the access to some files (tgz in articular)
[2976]3017if [ "x`cat /proc/linuxshield/enabled 2>/dev/null`" = "x1" ]; then
[2963]3018 LogFile "WARNING: McAfee LinuxShield is enabled. McAfee might block access to certain special files."
3019 LogFile "WARNING: Check in /var/opt/NAI/LinuxShield/etc/nailsd.cfg for 'nailsd.profile.OAS.action.error: Block'"
3020 LogFile "WARNING: You have two options:"
3021 LogFile "WARNING: - Exclude all directories with special files (check McAfee System Events Log)"
3022 LogFile "WARNING: - Disable the scanner during the backup"
3023fi
3024
[2457]3025# Check for ISO_CMD command
3026if [ ! -x $ISO_CMD ]; then
[2963]3027 LogFile "NOTE: No CD image (ISO file) utility found"
[2457]3028fi
3029
[747]3030FLOPPY_WAS_MOUNTED=""
3031for mtpt in /media/floppy /mnt/floppy /floppy ; do
3032 if mount | grep -w $mtpt &> /dev/null ; then
3033 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
3034 umount $mtpt
3035 fi
3036done
3037
[1684]3038#
3039# If we have a USB device we need to store info
3040# and remove it from the parameters line
3041#
[747]3042if [ "$#" -ne "0" ] ; then
[1684]3043 if [ "$1" = "--usb" ] ; then
3044 shift
3045 USBDEVICE=$1
3046 if [ _"$USBDEVICE" = _"" ]; then
3047 Die "No USB device specified"
3048 fi
3049 shift
3050 fi
3051fi
3052
3053if [ "$#" -ne "0" ] ; then
[747]3054 if [ "$1" = "--findkernel" ] ; then
[2880]3055 resk=`TryToFindKernelPath`
[1336]3056 # Avoids logfile content for mondo
3057 export MONDO_SHARE=""
[2880]3058 if [ "$resk" = "" ] ; then
[2838]3059 if [ $KERNEL_IS_XEN = "yes" ]; then
3060 echo "$xenkernelpath"
[2963]3061 LogFile "INFO: xenkernelpath = $xenkernelpath"
[2860]3062 MindiExit 0
[2838]3063 else
[2860]3064 MindiExit -1
[2838]3065 fi
[747]3066 else
[2880]3067 echo "$resk"
[2963]3068 LogFile "INFO: kernelpath = $resk"
[2860]3069 MindiExit 0
[747]3070 fi
[1720]3071 elif [ "$1" = "--locatedeps" ] ; then
3072 [ ! "$2" ] && Die "Please specify the binary to look at"
[2438]3073 LocateDeps $*
[1720]3074 # Avoids logfile content for mondo
3075 export MONDO_SHARE=""
3076 MindiExit $?
[1815]3077 elif [ "$1" = "--readalllink" ] ; then
3078 [ ! "$2" ] && Die "Please specify the binary to look at"
3079 # Avoids logfile content for mondo
3080 export MONDO_SHARE=""
[2978]3081 ReadAllLink $2
[1815]3082 MindiExit $?
[2731]3083 elif [ "$1" = "--makemessage" ] ; then
[2948]3084 MakeMessageFile | cut -c1-80
[2731]3085 MindiExit 0
[747]3086 elif [ "$1" = "--makemountlist" ] ; then
3087 [ ! "$2" ] && Die "Please specify the output file"
3088 MakeMountlist $2
[2432]3089 CheckMountlist $2
[1336]3090 # Avoids logfile content for mondo
3091 export MONDO_SHARE=""
[925]3092 MindiExit $?
3093 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
3094 echo "Mindi v$MINDI_VERSION"
[1336]3095 # Avoids logfile content for mondo
3096 export MONDO_SHARE=""
[925]3097 MindiExit 0
[747]3098 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]3099 MONDO_TMP=$2
3100 # Change MINDI_TMP for the one provided by mondo
3101 # So that it can get back the built files
[2153]3102 if [ _"$MONDO_TMP" = _"" ]; then
3103 Die "MONDO_TMP is empty, aborting"
3104 fi
3105 if [ _"$MONDO_TMP" = _"/" ]; then
3106 Die "MONDO_TMP is /, aborting"
3107 fi
[2092]3108 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
[1010]3109 rmdir $MINDI_TMP
[1486]3110 export MINDI_TMP=$MONDO_TMP
[953]3111 mkdir -p $MINDI_TMP
[2238]3112
[1696]3113 # This is the scratch dir in mondo - subdir images
[1880]3114 MINDI_CACHE=$3
[2238]3115
[925]3116 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[2681]3117 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
3118
[747]3119###
3120### Sq-Modification...
3121### Attempt to locate kernel specific module path
3122### if module path is found then use it other wise use uname -r to set it...
3123###
[2629]3124 if [ $KERNEL_IS_XEN = "yes" ]; then
[2963]3125 LogIt "INFO: xenkernelpath = $xenkernelpath"
[2629]3126 fi
[2657]3127 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
[747]3128 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3129 then
[2963]3130 LogIt "WARNING: Module path for ${kernelpath} not found..."
3131 LogIt " using running kernel\'s modules."
[2292]3132 kernelname=$KERVERRUN
[747]3133 fi
[2963]3134 LogIt "INFO: kernelname = $kernelname"
3135 LogIt "INFO: kernelpath = $kernelpath"
[747]3136###
3137### end of Sq-Modification
3138###
[925]3139 TAPEDEV=$5
3140 TAPESIZE=$6
3141 FILES_IN_FILELIST=$7
3142 USE_LZO=$8
3143 CDRECOVERY=$9
[747]3144 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3145 IMAGE_DEVS=""
3146 else
3147 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3148 fi
[925]3149 if [ "${11}" ] ; then
3150 LILO_OPTIONS=""
[2963]3151 # LogIt "INFO: LILO will use conservative settings, to be compatible with older BIOSes."
[925]3152 fi
3153 LAST_FILELIST_NUMBER=${12}
[747]3154 ESTIMATED_TOTAL_NOOF_SLICES=${13}
[2564]3155 export MINDI_EXCLUDE_DEVS="${14}"
[747]3156 USE_COMP="${15}"
3157 USE_LILO="${16}"
[925]3158 USE_STAR="${17}"
3159 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]3160 DIFFERENTIAL="${19}"
[998]3161 USE_GZIP="${20}"
3162 NOT_BOOT="${21}"
[747]3163 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]3164 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[747]3165 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[2963]3166 [ "$TAPEDEV" ] && LogIt "INFO: This is a tape-based backup. Fine."
[1696]3167 # MONDO_ROOT is the real scratchdir
[1880]3168 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
[938]3169 if [ _"$MONDO_ROOT" != _"" ]; then
3170 mkdir -p $MONDO_ROOT
3171 else
3172 Die "MONDO_ROOT is undefined"
3173 fi
[747]3174 else
[925]3175 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3176 MindiExit -1
[747]3177 fi
3178fi
[2238]3179
3180if [ _"$MINDI_CACHE" != _"" ]; then
3181 rm -rf $MINDI_CACHE/* 2> /dev/null
3182 mkdir -p $MINDI_CACHE
3183fi
3184
[747]3185[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3186
[1684]3187if [ _"$MONDO_SHARE" = _"" ]; then
[963]3188 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3189 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3190 LogIt "BusyBox sources are available from http://www.busybox.net"
[747]3191 LogIt "------------------------------------------------------------------------------"
3192else
[2963]3193 LogFile "INFO: You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks"
[747]3194fi
[1005]3195if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3196 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3197else
[2963]3198 LogIt "ERROR: Unable to find mindi-busybox, please install it"
[1005]3199 MindiExit -1
3200fi
[747]3201
3202for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
[3014]3203 modinfo 2> /dev/null 1> /dev/null
3204 if [ $? -eq 0 ]; then
3205 modprobe $i 2>&1 > /dev/null
3206 fi
[747]3207done
3208
3209KERN_DISK_MADE=""
3210
[2963]3211LogFile "DIFFERENTIAL = $DIFFERENTIAL"
3212LogFile "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE"
3213LogFile "NOT_BOOT = '$NOT_BOOT'"
[747]3214if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[2963]3215 LogIt "INFO: Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]3216 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3217 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]3218 CheckMountlist $MINDI_TMP/mountlist.txt
[940]3219 mkdir -p $MINDI_TMP/small-all/tmp
[2712]3220 cd "$MINDI_TMP/small-all"
[2092]3221 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]3222 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]3223 sleep 2
[963]3224 LogIt "Done. Exiting."
[925]3225 MindiExit 0
[747]3226fi
3227
[1690]3228if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[2963]3229 LogIt "INFO: Including the generation of a Bootable USB device on $USBDEVICE"
[1684]3230fi
3231
[747]3232if [ "$kernelpath" = "" ] ; then
[1335]3233 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]3234 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3235 read ch
3236 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3237 USE_OWN_KERNEL="yes"
[1809]3238 else
3239 USE_OWN_KERNEL="no"
[747]3240 fi
3241 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]3242 YOUR_KERNEL_SUCKS=""
3243 kernelpath=`TryToFindKernelPath`
3244 if [ "$kernelpath" = "" ] ; then
3245 echo -n "Please enter kernel path : "
3246 read kernelpath
3247 fi
[747]3248 else
[925]3249 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]3250 fi
3251fi
3252if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
[1885]3253 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3254 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3255 source $MINDI_LIB/FindDistroFailsafe
3256 # Log kernel image
[2963]3257 LogIt "INFO: FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
[1885]3258 kernelpath="$FAILSAFE_KBIN"
[2963]3259 LogIt "INFO: I shall include a failsafe kernel, not your kernel, in the boot disks."
3260 LogIt " The failsafe kernel is $kernelpath."
3261 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3262 LogIt " disks then it may still be a result of a problem with your kernel."
[1885]3263 pwd=`pwd`
[2712]3264 cd "$MINDI_TMP"
[1885]3265 mkdir -p lib/modules
3266 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
[2712]3267 cd "$pwd"
[1885]3268 else
3269 kernelpath=$MINDI_LIB/vmlinuz
[2963]3270 LogIt "INFO: I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3271 LogIt " However, you are still running your kernel. If Mindi fails to create your"
3272 LogIt " disks then it may still be a result of a problem with your kernel."
[1885]3273 pwd=`pwd`
[2712]3274 cd "$MINDI_TMP"
[1885]3275 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
[2712]3276 cd "$pwd"
[1885]3277 fi
[747]3278 YOUR_KERNEL_SUCKS="Your kernel sucks"
3279fi
[1880]3280echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
[2963]3281[ "$(($RANDOM%64))" -eq "0" ] && LogIt "INFO: Dude, I've looked inside your computer and it's really dusty..."
[747]3282
[965]3283[ "$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]3284
[1983]3285PrepareDataDiskImages
3286
[747]3287ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3288rds=$(($ramdisk_size-$((ramdisk_size%4096))))
[1983]3289export ramdisk_size=$rds
[747]3290
[2963]3291LogFile "INFO: Ramdisk will be $ramdisk_size KB"
[1567]3292if [ "$ARCH" = "ia64" ] ; then
[1983]3293 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
[1567]3294else
[2073]3295 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
[747]3296fi
3297
3298[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3299...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3300
[1684]3301if [ _"$MONDO_SHARE" = _"" ]; then
[1983]3302 ListImagesForUser
3303 OfferToMakeBootableISO
[1684]3304 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
[1983]3305 OfferToMakeBootableUSB
[1684]3306 fi
[747]3307elif [ "$TAPEDEV" ] ; then
[2078]3308 if [ "$ARCH" != "ia64" ] ; then
3309 # We need to keep the img file as boot file for ia64 platform
3310 rm -f $MINDI_CACHE/{*img,*iso}
3311 else
3312 rm -f $MINDI_CACHE/*iso
3313 fi
[1898]3314 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3315 OfferToMakeBootableUSB
[1898]3316 fi
[1983]3317 OfferToMakeBootableISO
[1880]3318 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3319 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]3320 else
[925]3321 Die "Cannot find all.tar.gz, to be written to tape"
[747]3322 fi
[1695]3323elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3324 OfferToMakeBootableUSB
[747]3325else
[1983]3326 OfferToMakeBootableISO
[747]3327fi
3328# cleanup
[2995]3329LogIt "INFO: $FRIENDLY_OUTSTRING"
[747]3330for mtpt in $FLOPPY_WAS_MOUNTED ; do
3331 mount $mtpt
3332done
[925]3333MindiExit 0
Note: See TracBrowser for help on using the repository browser.