source: MondoRescue/branches/2.2.9/mindi/mindi@ 2471

Last change on this file since 2471 was 2471, checked in by Bruno Cornec, 14 years ago

Improve analysis of kernel modules by printing whether it's a live or extra module which has not been found (Matthew Cline) as reported in #362

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