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

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