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

Last change on this file since 2457 was 2457, checked in by Bruno Cornec, 15 years ago
  • Apply path from Matthew Cline (matt_at_nightrealms.com) in order to fix #359
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 106.5 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 2457 2009-10-09 11:33:44Z 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###
795 for module in $module_list $EXTRA_MODS ; do
796 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
797 echo "module $module --> $r" >> $LOGFILE
798 [ "$r" ] && echo "$r"
799 [ -f "$oss" ] && find $oss | grep -F $module
800 done
801 find /lib/modules/$kern/modules.* -type f 2> /dev/null
802 [ -f "$oss" ] && find $oss.* 2> /dev/null
803}
804
[1784]805#
806# Critical function which computes all dependencies (dyn. lib.)
807# for a list of binaries
808#
[747]809LocateDeps() {
810 local incoming fname deps
[1724]811 incoming="$*"
[747]812 for fname in $incoming ; do
813 if [ ! -e "$fname" ] ; then
[963]814 echo "WARNING - $fname does not exist; cannot be LDD'd." >> $LOGFILE
[747]815 if echo $fname | grep lvm &> /dev/null ; then
816 echo "This warning only affects you if you are using LVM." >> $LOGFILE
[1399]817 if echo "$MODULES" | grep lvm &> /dev/null ; then
[747]818 echo "I think you are, so please take heed!" >> $LOGFILE
819 else
820 echo "I don't think you are, so don't worry about it." >> $LOGFILE
821 fi
822 fi
823 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
824 echo "$fname is softlink" >> $LOGFILE
825 else
[1526]826 ldd $fname 2> /dev/null | ProcessLDD
[747]827 fi
828 done
829}
830
[925]831
[860]832# Give all symlinks recursively of a full path name
833ReadAllLink() {
834 file="$1"
[747]835
[2174]836 echo $file | grep -q '\.\./'
[2175]837 if [ $? -eq 0 ]; then
[2174]838 # We need to normalise the path with .. in it
839 file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
840 fi
[1883]841 echo "$file"
[860]842 if [ ! -h $file ]; then
843 return 0
844 fi
[747]845
[1883]846 link=`readlink $file`
[862]847 d=`dirname $file`
[1883]848 fchar=`echo $link | cut -c1`
849 # If mother dir is a link print it
[1230]850 if [ -h "$d" ]; then
[1784]851 echo "$d"
[1883]852 d=`readlink $d`
853 fi
854 if [ "$fchar" != "/" ]; then
855 # Relative or local link
856 ReadAllLink "$d/$link"
[860]857 else
[1883]858 # Absolute path
859 ReadAllLink $link
[1230]860 fi
[860]861}
862
[925]863
[747]864LocateFile() {
865 local i path fname_to_find location output resolved tmp stub cache_id loclist
866 fname_to_find="$1"
[1526]867 # It's an absolute path
[747]868 if echo "$fname_to_find" | grep -x "/.*" ; then
[859]869 output="$fname_to_find"
[860]870 if [ -h "$output" ] ; then
871 output="`ReadAllLink $output` $output"
872 fi
[859]873 echo "$output"
874 return 0
[747]875 fi
[1526]876 # It's not an absolute path
[747]877 output=""
[1526]878 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
879 #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
880 [ -h "$path" ] && continue
881 [ ! -e "$path/$fname_to_find" ] && continue
882 output="$path/$fname_to_find $output"
883 if [ -h "$path/$fname_to_find" ] ; then
884 output="`ReadAllLink $path/$fname_to_find` $output"
885 fi
[747]886 done
887 if [ "$output" = "" ] ; then
[860]888 return 1
[747]889 fi
890 echo "$output"
891 return 0
892}
893
894
895LogIt() {
896 if [ -e /dev/stderr ] ; then
[925]897 echo -e "$1" >> /dev/stderr
[747]898 elif [ -e /usr/bin/logger ] ; then
[925]899 /usr/bin/logger -s $1
[747]900 fi
[965]901 echo -e "$1" >> $LOGFILE
[2166]902 if [ _"$2" != _"" ]; then
903 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
904 fi
905 rm -f "$2"
[747]906}
907
908
909# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
910MakeMondoConfigFile() {
911 local outfile use_lzo use_comp use_star
912 outfile=$1
913 > $outfile
914 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
915 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
[1698]916 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
[747]917 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
918 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
919 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
920 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
[998]921 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
[747]922 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
923 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
924 echo "use-lzo $use_lzo" >> $outfile
[998]925 echo "use-gzip $use_gzip" >> $outfile
[747]926 echo "use-star $use_star" >> $outfile
927 echo "use-comp $use_comp" >> $outfile
928 echo "datestamp `date`" >> $outfile
929 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
[2380]930 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
931 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
932 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
933 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-DEFGW netfs-client-defgw $outfile
934 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-MOUNT netfs-server-mount $outfile
935 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-PATH netfs-server-path $outfile
936 AddFileToCfgIfExists $MINDI_TMP/NETFS-DEV netfs-dev $outfile
937 AddFileToCfgIfExists $MINDI_TMP/NETFS-PROTO netfs-proto $outfile
938 AddFileToCfgIfExists $MINDI_TMP/NETFS-SERVER-IPADDR netfs-server-ipaddr $outfile
[940]939 AddFileToCfgIfExists $MINDI_TMP/ISO-DEV iso-dev $outfile
940 AddFileToCfgIfExists $MINDI_TMP/ISO-MNT iso-mnt $outfile
941 AddFileToCfgIfExists $MINDI_TMP/ISO-PREFIX iso-prefix $outfile
942 AddFileToCfgIfExists $MINDI_TMP/ISODIR isodir $outfile
943 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.DEVICE bootloader.device $outfile
944 AddFileToCfgIfExists $MINDI_TMP/BOOTLOADER.NAME bootloader.name $outfile
945 AddFileToCfgIfExists $MINDI_TMP/KEYMAP-LIVES-HERE keymap-lives-here $outfile
946 AddFileToCfgIfExists $MINDI_TMP/TAPEDEV-HAS-DATA-DISKS tapedev-has-data-disks $outfile
947 AddFileToCfgIfExists $MINDI_TMP/BACKUP-MEDIA-TYPE backup-media-type $outfile
948 AddFileToCfgIfExists $MINDI_TMP/DIFFERENTIAL differential $outfile
[949]949 AddFileToCfgIfExists $MINDI_TMP/ACL acl $outfile
950 AddFileToCfgIfExists $MINDI_TMP/XATTR xattr $outfile
[1948]951 AddFileToCfgIfExists $MINDI_TMP/OBDR obdr $outfile
[747]952}
953
954
955MakeMountlist() {
956 local scratchdir mountlist all_partitions current_partition \
957partition_size partition_format outstring partition_number \
958partition_mountpt c_p lwm_info psz lvm_dev unofficial_outstring \
[2013]959absolute_partition old_partition_fmt current_lvolume uname skip
[747]960
[967]961 echo "Your raw fstab file looks like this:" >> $LOGFILE
962 echo "------------------------------------" >> $LOGFILE
[747]963 cat $MY_FSTAB >> $LOGFILE
[967]964 echo "Your mountlist will look like this:" | tee -a $LOGFILE
965 echo "-----------------------------------" >> $LOGFILE
[747]966
967# scratchdir, mountlist(OUT)
[940]968 scratchdir=$MINDI_TMP
[747]969 mountlist=$1
970
971# NB: partition = device
972# NB: mountpt = where the device is mounted
973
974 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
975
[1684]976 [ "$mountlist" != "" ] && rm -Rf $mountlist
[747]977 > $mountlist
978 all_partitions=""
979
980 if [ $LVM != "false" ]; then
[1885]981 echo -en "Analyzing LVM...\n"
[968]982 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
[971]983 if [ $? -ne 0 ]; then
[963]984 LVM="false"
985 fi
[2424]986 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
[747]987 fi
988 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
989# echo "all partitions = $all_partitions" > /dev/stderr
990 for i in $IMAGE_DEVS ; do
991 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
992 done
993 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
[1755]994 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
[747]995 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"
996 for c_p in $all_partitions ; do
[2452]997 # Skip evices, network FS, cisf
998 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
[747]999 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1000 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]1001 current_partition=`readlink -f $c_p`
[747]1002 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1003 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1004 else
1005 current_partition="$c_p"
1006 fi
1007 [ "$c_p" = "none" ] && continue
[2193]1008 # Debian 5 does that
1009 [ "$c_p" = "proc" ] && continue
[747]1010 redhat_label=""
[1831]1011 label=""
[957]1012 uuid=""
[861]1013 absolute_partition=`readlink -f $c_p`
[747]1014 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1015
1016 # Detects noauto partitions not mounted and exclude them
1017 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1018 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1019 continue
1020 fi
1021
[1986]1022 # set default in case we dont't find it
1023 str_to_find_fmt_with=$current_partition
1024
[747]1025 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1026 # current_partition contains only first column of /etc/fstab
1027 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
[980]1028 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
[747]1029 actual_dev=""
[853]1030
1031 # 1st try, findfs - the RHEL way of finding labels and their partitions
1032 if [ -x "/sbin/findfs" ]; then
[855]1033 actual_dev=`/sbin/findfs LABEL=${redhat_label} 2> /dev/null`
[853]1034 fi
[747]1035
[853]1036 # 2nd try : blkid, the good way for all LABEL except swap
1037 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[980]1038 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
[747]1039 # For LVM FS it will give a /dev/dm-# which should then be converted
[748]1040 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1041 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1042 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[747]1043 for dev in `ls /dev/mapper/*`; do
[963]1044 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1045 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[747]1046 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1047 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[747]1048 break
1049 fi
1050 done
1051 fi
1052 fi
1053
[853]1054 # 3rd try, which works on a standard partition (ext2/3), but not on swap
[747]1055 # For LVM gives a /dev/mapper entry
1056 if [ "x$actual_dev" = "x" ]; then
[980]1057 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
[747]1058 fi
1059
[853]1060 # 4th try, with vol_id
[747]1061 # SWAP only
1062 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[963]1063 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
[747]1064 for dev_swap in $list_swaps ; do
1065 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1066 if [ "x$dev_exists" != "x" ]; then
1067 actual_dev=$dev_swap
1068 break;
1069 fi
1070 done
1071 fi
1072
[853]1073 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
[789]1074 # LABEL=SW-cciss/c0d0p3 (RDP)
[853]1075 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
[747]1076 # SWAP only
[789]1077 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
[2013]1078 skip=""
[2292]1079 uname=$KERVERRUN
[2013]1080 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1081 # 2.6.12 needs 16 (FC3)
1082 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1083 # 2.6.19 and upper needs 1052
1084 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1085 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
1086 if [ $skip = "" ]; then
1087 Die "Your kernel is too old. I don't know how to support labelled swap spaces with it"
1088 fi
[853]1089 for try_dev in `tail +2 /proc/swaps | cut -d' ' -f1`
1090 do
1091 # Location of the swap label for kernel 2.6
[2013]1092 try_dev_label=`dd bs=1 count=16 skip=$skip if=$try_dev 2> /dev/null`
[853]1093 if [ "x$try_dev_label" = "x$redhat_label" ]; then
[855]1094 actual_dev=$try_dev
[853]1095 fi
1096 done
[747]1097 fi
[1008]1098
1099 # Check if one of all those tries has known success
1100 if [ "x$actual_dev" != "x" ]; then
1101 current_partition=$actual_dev
1102 else
[1885]1103 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]1104 fi
[957]1105 # This part tries to retrieve the correct device from a UUID line in /etc/fstab
1106 # current_partition contains only first column of /etc/fstab
[1009]1107 elif [ "`echo "$current_partition" | /bin/grep -i "UUID="`" != "" ]; then
[980]1108 uuid=`echo "$current_partition" | cut -d'=' -f2`
[957]1109 actual_dev=""
1110
1111 # 1st try, findfs - the RHEL way of finding labels and their partitions
1112 if [ -x "/sbin/findfs" ]; then
1113 actual_dev=`/sbin/findfs UUID=${uuid} 2> /dev/null`
1114 fi
1115
[1531]1116 # 2nd try : blkid, the good way for all UUID except swap
[957]1117 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[980]1118 actual_dev=`/sbin/blkid | /bin/grep "$uuid" | grep UUID= | cut -d':' -f1`
[957]1119 # For LVM FS it will give a /dev/dm-# which should then be converted
1120 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1121 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1122 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[957]1123 for dev in `ls /dev/mapper/*`; do
[963]1124 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1125 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[957]1126 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1127 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[957]1128 break
1129 fi
1130 done
1131 fi
1132 fi
1133
1134 # 3th try, with vol_id
1135 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[963]1136 list_dev=`mount | /bin/grep -E '^/' | $AWK '{ print $1 }' `
[957]1137 for dev in $list_dev ; do
1138 dev_exists=`/sbin/vol_id $dev | /bin/grep "$uuid"`
1139 if [ "x$dev_exists" != "x" ]; then
1140 actual_dev=$dev
1141 break;
1142 fi
1143 done
1144 fi
1145
[1531]1146 # 4th try, with dumpuuid (VMWare only ?) for swap
1147 if [ "x$actual_dev" = "x" -a -x "/sbin/dumpuuid" ]; then
1148 list_dev=`cat /proc/swaps | /bin/grep -E '^/' | $AWK '{ print $1 }' `
1149 for dev in $list_dev ; do
1150 dev_exists=`/sbin/dumpuuid $dev | /bin/grep "$uuid"`
1151 if [ "x$dev_exists" != "x" ]; then
1152 actual_dev=$dev
1153 break;
1154 fi
1155 done
1156 fi
1157
[747]1158 # Check if one of all those tries has known success
1159 if [ "x$actual_dev" != "x" ]; then
1160 current_partition=$actual_dev
1161 else
[2069]1162 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]1163 fi
1164 else
[1863]1165 # Needs to handle the recent OpenSUSE fancy way of dealing with fstab :-(
1166 # they use symlinks in fstab unrelated to what is shown in mount !
1167 if [ _"$partition_mountpt" = _"" ]; then
[1986]1168 # set default in case we dont't find it
[1863]1169 for tmpp in `tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -Ev "^#" | $AWK '{print $1}'`; do
[1864]1170 if [ _"`readlink -f $tmpp`" = _"$current_partition" ]; then
[1863]1171 str_to_find_fmt_with=$tmpp
[1865]1172 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$tmpp" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
[1864]1173 break;
[1863]1174 fi
1175 done
1176 fi
[747]1177 fi
1178
1179 partition_format=`$AWK '$1 == "'"$str_to_find_fmt_with"'" {print $3}' $MY_FSTAB`
1180 # Some distributions such as Debian do not put /dev/<VG>/<LV> in fstab
1181 # for LVM partitions but use /dev/mapper/<VG>-<LV> instead. Fortunately,
1182 # the former is then a link to the latter, so we test whether
1183 # $current_partition is actually such a link or not and set
[755]1184 # $current_lvolume accordingly. On Debian you may find more than one answer
1185 # so we remove the one corresponding to /dev/.static
1186 # On RedHat even if the device name is different (/dev/mapper/<VG><LV>), the
1187 # principle is the same and we need to find the link to it as well.
1188 # Note that $current_lvolume may well be an
[747]1189 # ordinary device. It is just to make sure that we feed the right value
1190 # into any of the LVM tools if possible.
1191
1192 current_lvolume="$current_partition"
[763]1193 if [ $LVM = "v2" ] && [ "`echo $current_partition | grep -E '^/dev/mapper/'`" ]; then
[755]1194 # .static dir are a Debian specificity
[763]1195 current_lvolume="`find /dev -lname "$current_partition" | grep -Ev '^/dev/\.static/'`"
[755]1196 echo $current_lvolume | grep -q ' '
[784]1197 if [ $? -eq 0 ]; then
[755]1198 echo "WARNING: Multiple Logical Volumes found. Report to dev team" >> $LOGFILE
1199 fi
[2072]1200 # if it's not found, it may well be a real device such as a multipath one
1201 # /dev/mapper/mpath... Thus we revert the situation so that next test succeed
1202 if [ _"$current_lvolume" = _"" ]; then
1203 current_lvolume="$current_partition"
1204 fi
[747]1205 fi
1206 #
1207 # End of LVM device style variation code (other than $current_lvolume).
1208
[745]1209 if [ $LVM != "false" ] && [ "`$LVMCMD lvdisplay $current_lvolume 2> /dev/null`" ]; then
1210 # Size computed via LVM not directly
[747]1211 partition_size="lvm"
1212 else
1213 partition_size=`SizeOfPartition $current_partition`
1214 [ "`echo "$current_partition" | grep "[0-9]"`" = "" ] && continue
1215 [ "`echo "$current_partition" | grep -c "^/"`" -ne "1" ] && continue
1216 if [ "$partition_format" = "swap" ] || [ "$partition_mountpt" = "swap" ] ; then
1217 partition_size=`grep -Fv "Priority" /proc/swaps | tr -s '\t' ' ' | grep -F "$current_partition" | $AWK '{print $3}'`
1218 [ "$partition_mountpt" != "swap" ] && partition_mountpt="swap"
1219 [ "$partition_format" != "swap" ] && partition_format="swap"
1220 if [ "$partition_size" = "" ] ; then
1221 totalsize=0
1222 items=0
1223 for i in `tr -s ' ' '\t' < /proc/swaps | grep -Fv "Filename" | cut -f3` ; do
1224 totalsize=$(($totalsize+$i))
1225 items=$(($items+1))
1226 done
1227 [ "$items" -gt "0" ] && partition_size=$(($totalsize/$items)) || partition_size=0
1228 [ "$partition_size" -lt "125000" ] && partition_size=125000
1229 echo "I'm guessing $c_p is $(($partition_size/1024))MB" >> $LOGFILE
1230 fi
1231 fi
1232 fi
1233 [ "$partition_mountpt" = "swap" ] && partition_format="swap"
1234 [ "$partition_format" = "swap" ] && partition_mountpt="swap"
1235 if [ "$partition_mountpt" = "" ] ; then
1236 if [ "`$LVMCMD pvdisplay $current_lvolume 2> /dev/null`" != "" ] ; then
1237 if [ "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
1238 partition_mountpt="raid"
1239 partition_format="raid"
1240 else
1241 partition_mountpt="lvm"
1242 partition_format="lvm"
1243 fi
1244 fi
1245 fi
1246 psz=$partition_size
1247 echo "Examining $current_partition (mount=$partition_mountpt fmt=$partition_format psz=$psz)" >> $LOGFILE
1248 [ "$psz" != "lvm" ] && psz=$(($psz/1024))
1249 if [ "`echo " $IMAGE_DEVS " | grep -F " $current_partition "`" != "" ] ; then
1250 partition_mountpt="image"
1251 old_partition_fmt=$partition_format
1252 partition_format="`$FDISK -l 2>> $LOGFILE | tr '*' ' ' | tr '+' ' ' | tr -s ' ' '\t' | grep -w "$absolute_partition" | cut -f5`"
1253 partition_size=$(($partition_size+1)); # just in case
1254 if [ "$partition_format" = "Linux" ] ; then
1255 echo "Are you imaging a mounted swap partition? Silly..." >> $LOGFILE
1256 echo "Reverting format from $old_partition_fmt to $partition_format" >> $LOGFILE
1257 partition_format=$old_partition_fmt
1258 fi
1259 fi
1260 if [ "$EXCLUDE_DEVS" ] && [ "`echo " $EXCLUDE_DEVS " | grep -F " $current_partition "`" ] || [ "`echo " $EXCLUDE_DEVS " | grep " $current_partition "`" ] ; then
1261 echo "Excluding $current_partition from mountlist" >> $LOGFILE
1262 continue
1263 fi
1264 if [ ! "$partition_mountpt" ] ; then
[965]1265 echo "------- $FDISK -l $qq log ------------" >> $LOGFILE
[1883]1266 for qq in "" `find /dev/ida/c*d* ! -name '*p*' 2> /dev/null`; do
[747]1267 partition_format=`$FDISK -l $qq 2>> $LOGFILE | grep -w "$c_p" | sed 's/12/|/' | tr -s '\t' ' ' | cut -d'|' -f2 | cut -d' ' -f2-9`
1268 [ "$partition_format" ] && break
1269 done
[965]1270 echo "------- $FDISK log end ------------" >> $LOGFILE
[747]1271 if [ "$partition_format" = "Compaq diagnostics" ] ; then
1272 partition_format="compaq"
1273 elif [ ! "`grep -F device /etc/raidtab 2> /dev/null | grep -w $current_partition`" ] ; then
[963]1274 LogIt "Unable to find mountpoint of $current_partition - ignoring"
[747]1275 continue
1276 fi
1277 fi
[1755]1278 if [ "$redhat_label" ]; then
1279 label="$redhat_label"
[1756]1280 elif [ "$uuid" ]; then
[1755]1281 label="$uuid"
1282 fi
[747]1283 partition_format="`echo "$partition_format" | cut -d',' -f1`"; # in case user has ext3,ext2 or something dumb like that
[963]1284 [ "$partition_format" = "auto" ] && partition_format="`mount | grep -w $current_partition | $AWK '{print$5;}'`"; # in case user uses 'auto' (dumb!)
[1755]1285 unofficial_outstring=`printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label"`
[747]1286 if [ "$current_partition" = "" ] ; then
1287 echo "Unknown partition (outstring = $unofficial_outstring)" >> $LOGFILE
1288 elif [ "$partition_mountpt" = "" ] && [ -f "/etc/raidtab" ] ; then
1289 if [ "`grep -F device /etc/raidtab 2>/dev/null | grep -F $current_partition`" ] ; then
1290 partition_mountpt=raid
1291 partition_format=raid
[1755]1292 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1293 printf "%s %s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1294 else
1295 echo "Unknown mountpoint (outstring = $unofficial_outstring)" >> $LOGFILE
1296 fi
1297 elif [ "$partition_format" = "" ] ; then
1298 echo "Unknown format (outstring = $unofficial_outstring)" >> $LOGFILE
1299 elif [ "$partition_size" = "" ] ; then
1300 echo "Unknown partition size (outstring = $unofficial_outstring)" >> $LOGFILE
1301 elif [ "$partition_mountpt" = "/proc" ] || [ "$partition_mountpt" = "/dev/pts" ] ; then
1302 continue
1303 else
1304 if [ "$partition_format" = "dos" ] || [ "$partition_format" = "msdos" ] ; then
[2432]1305 echo "vfat should be used instead of dos/msdos as a partition format" >> $LOGFILE
[747]1306 partition_format="vfat"
1307 fi
[1755]1308 printf "\t%-15s %-15s %-15s %7s %-15s\n" $current_partition $partition_mountpt $partition_format $psz "$label" | tee -a $LOGFILE
1309 printf "%s %s %s %s %s\n" $current_partition $partition_mountpt $partition_format $partition_size "$label" >> $mountlist
[747]1310 fi
1311 done
1312}
1313
[2432]1314CheckMountlist() {
1315 local file=$1
1316 # Coherency verification
1317 ML0=`cat $file | wc -l`
1318 ML1=`$AWK '{print $1}' $file | sort -u | wc -l`
1319 ML2=`$AWK '{print $2}' $file | sort -u | wc -l`
1320 if [ "$ML0" -ne "$ML1" ]; then
1321 echo "--------------------------------------------" >> $LOGFILE
1322 echo "WARNING: Duplicate device entry in mountlist" | tee -a $LOGFILE
1323 echo "--------------------------------------------" >> $LOGFILE
1324 fi
1325 if [ "$ML0" -ne "$ML2" ]; then
1326 echo "--------------------------------------------" >> $LOGFILE
1327 echo "WARNING: Duplicate mountpoint entry in mountlist" | tee -a $LOGFILE
1328 echo "------------------------------------------------" >> $LOGFILE
1329 fi
1330}
[747]1331
1332MakeSureNumberIsInteger() {
1333 res=`echo "$1" | tr -s '\-[0-9]' ' '`
1334 if [ "$res" != " " ] && [ "$res" != "" ] ; then
1335 echo "result = '$res'"
1336 Die "$1 should be an integer"
1337 fi
1338}
1339
1340
1341OfferToMakeBootableISO() {
1342 local i old_pwd
[2457]1343 if [ -z "$ISO_CMD" ]; then
1344 LogIt "Neither mkisofs nor genisoimage found, unable to make CD image"
1345 return
1346 fi
[1684]1347 if [ "$PROMPT_MAKE_CD_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[966]1348 echo -en "Shall I make a bootable CD image? (y/[n]) "
[747]1349 read i
1350 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1351 fi
[940]1352 rm -Rf $MINDI_TMP/iso
[1983]1353 mkdir -p $MINDI_TMP/iso/{images,archives}
[2084]1354 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]1355 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1356 for i in memdisk memtest.bin memtest.img ; do
[953]1357 j=$MINDI_LIB/$i
[1983]1358 k=$MINDI_TMP/iso
[953]1359 if [ -e "$j" ] ; then
[963]1360 LogIt "Copying $j to $k"
[2092]1361 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1362 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1885]1363 if [ _"$MONDO_SHARE" != _"" ]; then
1364 cp -f $j $MONDO_ROOT 2>> $LOGFILE || Die "Failed to copy $j to $MONDO_ROOT"
1365 fi
[953]1366 fi
[747]1367 done
[1983]1368 MakeMessageFile > $MINDI_TMP/iso/message.txt
1369 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?"
1370 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]1371 if [ _"$MONDO_SHARE" != _"" ]; then
[1929]1372 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]1373 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]1374 fi
[2073]1375 MakeBootConfFile isolinux > $MINDI_TMP/iso/isolinux.cfg
[747]1376 if [ "$ARCH" != "ia64" ] ; then
[2092]1377 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]1378 fi
[1983]1379 old_pwd=`pwd`
[940]1380 cd $MINDI_TMP/iso
[747]1381 if [ "$ARCH" != "ia64" ] ; then
[1885]1382 if [ _"$MONDO_SHARE" != _"" ]; then
[2092]1383 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]1384 cp -f $MONDO_SHARE/autorun $MINDI_TMP/iso 2>> $LOGFILE
[1885]1385 fi
[1983]1386 $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]1387 else
[1983]1388 $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]1389 rm -f images/mindi-bootroot.$BOOT_SIZE.img
[747]1390 fi
1391 if [ "$?" -ne "0" ] ; then
[1885]1392 echo "----------- $ISO_CMD's errors --------------" >> $LOGFILE
[940]1393 cat $MINDI_TMP/mkisofs.log >> $LOGFILE
[1885]1394 echo "$ISO_CMD returned the following errors:-"
[940]1395 cat $MINDI_TMP/mkisofs.log
[963]1396 LogIt "Failed to create ISO image."
[747]1397 else
[1880]1398 echo "Created bootable ISO image at $MINDI_CACHE/mindi.iso" | tee -a $LOGFILE
[747]1399 fi
[940]1400 rm -f $MINDI_TMP/mkisofs.log
[747]1401 cd $old_pwd
1402}
1403
1404
[1684]1405OfferToMakeBootableUSB() {
[2041]1406 local i
[1684]1407 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ _"$MONDO_SHARE" = _"" ]; then
[1786]1408 echo -n "Shall I make a bootable USB image ? (y/[n]) "
[1764]1409 read i
1410 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
1411 if [ "$USBDEVICE" = "" ]; then
1412 echo -en "Please enter the device name of your USB device (e.g. /dev/sda) : "
1413 read dev
1414 USBDEVICE=$dev
[1722]1415 fi
[1764]1416 echo "WARNING: This will erase all content on $USBDEVICE"
1417 echo -en "Are you sure you want to use $USBDEVICE (y/[n]) "
[2040]1418 read i
1419 [ "$i" != "y" ] && [ "$i" != "Y" ] && return 0
[1684]1420 fi
1421 rm -Rf $MINDI_TMP/usb
1422 mkdir -p $MINDI_TMP/usb
1423 USBPART="${USBDEVICE}1"
1424
1425 echo -en "Transforming $USBDEVICE in a Bootable device "
1426 echo -en "."
1427 echo "Transforming $USBDEVICE in a Bootable device" >> $LOGFILE
1428 echo "Checking $USBDEVICE" >> $LOGFILE
[1857]1429 $FDISK -l $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE
[1684]1430 if [ $? -ne 0 ]; then
1431 echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1432 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1433 exit -1
1434 fi
1435 echo -en "."
[1691]1436 echo "Unmounting $USBDEVICE just in case" >> $LOGFILE
[1721]1437 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
[2057]1438 # If your key has no MBR it may cause an issue
1439 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
[2054]1440 echo "Preparing $USBDEVICE" >> $LOGFILE
[1721]1441 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE << EOF
[2057]1442d
1443d
1444d
1445d
[1684]1446n
1447p
14481
1449
1450
1451t
1452b
1453a
14541
1455w
1456EOF
1457 if [ $? -ne 0 ]; then
1458 echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1459 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1460 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1461 MindiExit -1
1462 fi
[2190]1463 echo "The USB device $USBDEVICE now looks like this:" >> $LOGFILE
1464 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
[1684]1465 echo -en "."
1466 echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
[1688]1467 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
[1684]1468 if [ $? -ne 0 ]; then
1469 echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1470 echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1471 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1472 MindiExit -1
1473 fi
1474 echo -en "."
1475 echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1476 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1477 if [ $? -ne 0 ]; then
1478 echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1479 echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1480 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1481 MindiExit -1
1482 fi
1483 echo -en "."
[1691]1484 mkdir -p $MINDI_TMP/usb/images
[1983]1485 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]1486 echo -en "."
1487 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1488 for i in memdisk memtest.bin memtest.img ; do
1489 j=$MINDI_LIB/$i
1490 k=$MINDI_TMP/usb
1491 if [ -e "$j" ] ; then
1492 LogIt "Copying $j to $k"
[2092]1493 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1494 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1684]1495 fi
1496 done
1497 echo -en "."
[1983]1498 MakeMessageFile > $MINDI_TMP/usb/message.txt
[1684]1499 echo -en "."
[2092]1500 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]1501 echo -en "."
[1983]1502 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
[1684]1503 echo -en "."
[2041]1504 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
[1684]1505 echo -en "."
[1721]1506 umount $MINDI_TMP/usb
[1684]1507 if [ "$ARCH" != "ia64" ] ; then
[2056]1508 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
[1684]1509 if [ "$?" -ne "0" ] ; then
1510 echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1511 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
[2447]1512 echo "----------- syslinux's conf --------------" |tee -a $LOGFILE
1513 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
[1684]1514 LogIt "Failed to create USB image."
1515 else
1516 echo -e "$DONE"
1517 echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1518 fi
1519 rm -f $MINDI_TMP/syslinux.log
1520 else
1521 echo "No USB boot support for ia64" | tee -a $LOGFILE
1522 MindiExit -1
1523 fi
1524}
1525
1526
[747]1527MakeMessageFile() {
[2292]1528
1529 if [ -x "/bin/lsb_release" ]; then
1530 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
1531 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1532 # For pb >= 0.9.8
1533 DESC=`/usr/bin/pbdistrocheck -d`
[747]1534 else
[2292]1535 iss="/dev/null"
1536 [ -r /etc/issue.net ] && iss="/etc/issue.net"
1537 [ -r /etc/issue ] && iss="/etc/issue"
1538 DESC=`head -1 $iss`
[747]1539 fi
[2292]1540 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]1541 if [ _"$MONDO_SHARE" != _"" ]; then
1542 if [ "$CDRECOVERY" != "yes" ] ; then
[2380]1543 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1885]1544 echo -en "Press <enter> to continue.\n"
1545 elif [ ! "$MINDI_TMP" ] ; then
1546 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
[1983]1547 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1548 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1549 fi
[1885]1550 else
1551 echo -en "$BOOT_MEDIA_MESSAGE"
[747]1552 fi
[1983]1553 else
1554 echo -en "\
[747]1555To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1556CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
[1983]1557 fi
[747]1558 fi
1559 echo -en "\n\n\n"
1560}
1561
1562
[1983]1563MakeBootConfFile() {
[1885]1564 local options i ooo
[747]1565 options=""
[1983]1566 # Type of boot file (elilo or syslinux/isolinux)
1567 type=$1
1568 if [ "$type" = "elilo" ]; then
1569 sep="="
1570 else
1571 sep=" "
1572 fi
[925]1573
[1983]1574 # Generic header for conf file
1575 if [ "$type" != "elilo" ] ; then
1576 echo -en "prompt 1\ndisplay message.txt\n"
1577 else
1578 echo -en "prompt\n"
[925]1579 fi
[1983]1580
1581 # Compute which default option to boot from
[747]1582 if [ "$CDRECOVERY" = "yes" ] ; then
[1983]1583 echo -en "default${sep}RESTORE\n"
1584 # In case it's mondoarchive
[1885]1585 elif [ _"$MONDO_SHARE" != _"" ]; then
[2380]1586 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1983]1587 echo -en "default${sep}iso\n"
[747]1588 else
[1983]1589 echo -en "default${sep}interactive\n"
[747]1590 fi
1591 else
[1983]1592 echo -en "default${sep}expert\n"
[747]1593 fi
1594
[1983]1595 # Handle timeout
[747]1596 if [ "$CDRECOVERY" != "yes" ] ; then
[1983]1597 echo -en "timeout${sep}300\n"
1598 else
1599 echo -en "timeout${sep}10000\n"
[747]1600 fi
1601 echo -en "\n"
[1983]1602
[2124]1603 # prepare which labels will be generated
[747]1604 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1605 options="RESTORE expert"
[1885]1606 else
1607 if [ _"$MONDO_SHARE" != _"" ]; then
[2344]1608 options="interactive expert compare iso nuke isonuke"
[747]1609 else
1610 options="expert"
[925]1611 fi
[747]1612 fi
[1983]1613
1614 # Generate rest of conf file
[747]1615 for i in $options ; do
[925]1616 ooo=$i
1617 [ "$ooo" = "RESTORE" ] && ooo="nuke"
[1983]1618 if [ "$type" = "elilo" ]; then
[2126]1619 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]1620 else
[2073]1621 ps="/"
1622 if [ "$type" = "syslinux" ]; then
1623 ps=""
1624 fi
[2126]1625 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]1626 fi
[1885]1627 echo -en "$outstr"
[747]1628 done
[1983]1629
1630 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1631 if [ "$type" = "elilo" ]; then
1632 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
[2073]1633 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
[1983]1634 else
[2073]1635 ps="/"
1636 if [ "$type" = "syslinux" ]; then
1637 ps=""
1638 fi
1639 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1640 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
[1983]1641 fi
1642 fi
[747]1643}
1644
1645
1646PrepareBootDiskImage_LILO() {
[1983]1647 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1648 imagesdir=$MINDI_CACHE
1649 kernelpath=$1
[747]1650
1651 retval=0
1652 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
[1885]1653 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1654 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]1655 echo -en "..."
[1885]1656 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
[940]1657 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1658 mkdir -p $mountpoint
[1885]1659 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[1983]1660 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1661 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
[964]1662 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]1663 mkdir -p $mountpoint/etc
[1983]1664 liloconf=$mountpoint/elilo.conf
[747]1665
[1983]1666 MakeBootConfFile elilo > $liloconf
[747]1667
[1230]1668 # Copy it so that CD-ROM menu entry is satisfied
[1983]1669 mountefi=0
1670 df -T | grep /boot/efi | grep -q vfat
1671 if [ $? -ne 0 ]; then
1672 mount /boot/efi
[1230]1673 if [ $? -ne 0 ]; then
[1983]1674 echo "You have to mount your EFI partition when using mindi"
1675 MindiExit -1
[1230]1676 fi
[1983]1677 mountefi=1
[1230]1678 fi
[1983]1679 el=`find /boot/efi -name elilo.efi`
1680 cp $el $mountpoint
1681 cp $liloconf $mountpoint
1682 if [ $mountefi -eq 1 ]; then
1683 umount /boot/efi 2>&1 > /dev/null
1684 fi
[1230]1685
[1983]1686 echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1687 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
[747]1688 if [ "$?" -ne "0" ] ; then
[1983]1689 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1690 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[963]1691 LogIt "Please unload some of your modules and try again."
[940]1692 rm -f $MINDI_TMP/mtpt.$$
[1983]1693 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1694 retval=$(($retval+1))
1695 fi
[1983]1696 MakeMessageFile > $mountpoint/message.txt
[747]1697
1698 mkdir -p $mountpoint/tmp
[1983]1699 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1700 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
[747]1701 fi
1702
[925]1703 # copy the kernel across
[1230]1704 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1705 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1706 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2092]1707 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
[1885]1708 if [ "$?" -ne "0" ] ; then
[925]1709 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1710 du -sk $mountpoint/* >> $LOGFILE
1711 echo "--- end of list of files ---" >> $LOGFILE
1712 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
[1885]1713Sorry, your kernel is too big for your image.\n" >> $LOGFILE
[1998]1714 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[925]1715 cd $old_pwd
[747]1716 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[963]1717 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[925]1718 # losetup /dev/loop0 -d
[1998]1719 [ "$imagefile" != "" ] && rm -f $imagefile
[1885]1720 return 0
[747]1721 fi
1722 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[1885]1723 echo "Free space left on image = $free_space KB" >> $LOGFILE
1724 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
[1794]1725 # make it bootable
[1998]1726 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[963]1727 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[1983]1728 if [ "$KERN_DISK_MADE" ] ; then
[925]1729 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
[747]1730 fi
[925]1731
[1983]1732 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
[747]1733 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1734 echo -en "..."
[963]1735 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]1736 if [ "$retval" -eq "0" ] ; then
[1885]1737 echo -en "...$DONE\n"
[747]1738 if [ "$KERN_DISK_MADE" ] ; then
[1885]1739 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
[747]1740 fi
1741 else
[1885]1742 echo -en "...failed\n"
1743 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
[1998]1744 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1745 fi
[963]1746 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
[747]1747 return $retval
1748}
1749
1750
[2073]1751PrepareBootDiskImage_ISOLINUX() {
[1983]1752 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1753 imagesdir=$MINDI_CACHE
1754 kernelpath=$1
[747]1755 do_boot_root_thingy=""
1756 local retval old_pwd
1757 retval=0
[925]1758
[747]1759 [ ! -e "$kernelpath" ] && Die "PBDI - cannot find $kernelpath kernel"
[1885]1760 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1761 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]1762 echo -en "..."
[2067]1763 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
[940]1764 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1765 mkdir -p $mountpoint
[1885]1766 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1767 echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1768 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
[2067]1769 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
[1885]1770 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1771
[2067]1772 # Only move it now to its final destination abd use it now
1773 mv $imagefile $imagesdir
1774 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1775
[963]1776 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
[925]1777
1778 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[1983]1779 MakeMessageFile > $mountpoint/message.txt
[2073]1780 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
[1983]1781 echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1782 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
[747]1783 if [ "$?" -ne "0" ] ; then
[1983]1784 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1785 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[963]1786 LogIt "Please unload some of your modules and try again."
[940]1787 rm -f $MINDI_TMP/mtpt.$$
[1983]1788 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1789 retval=$(($retval+1))
1790 fi
1791
1792 mkdir -p $mountpoint/tmp
[1983]1793 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1794 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1795 fi
[747]1796
[925]1797 # copy the kernel across
[1230]1798 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1799 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1800 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[747]1801 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
[1885]1802 if [ "$?" -ne "0" ] ; then
[747]1803 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1804 du -sk $mountpoint/* >> $LOGFILE
1805 echo "--- end of list of files ---" >> $LOGFILE
1806 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n\
[1885]1807Sorry, your kernel is too big for your image.\n" >> $LOGFILE
[1998]1808 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[747]1809 cd $old_pwd
1810 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[963]1811 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]1812
[1998]1813 [ "$imagefile" != "" ] && rm -f $imagefile
[1885]1814 return 0
[747]1815 fi
1816 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[1885]1817 echo "Free space left on image = $free_space KB" >> $LOGFILE
1818 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
[925]1819
1820 # make it bootable
[1998]1821 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[747]1822 mkdir -p $mountpoint/etc
[963]1823 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]1824 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1825 echo -en "..."
[963]1826 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]1827
1828 if [ "$retval" -eq "0" ] ; then
[1885]1829 echo -en "...$DONE\n"
[747]1830 if [ "$KERN_DISK_MADE" ] ; then
[1998]1831 [ "$imagefile" != "" ] && rm -f $imagefile
[1885]1832 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
[747]1833 fi
1834 else
[1885]1835 echo -en "...failed\n"
1836 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
[1998]1837 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1838 fi
[963]1839 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
[747]1840 return $retval
1841}
1842
1843
[2006]1844ParseModprobeForIncludes() {
1845local MODPROBE_CONF mpincfile includes include
1846
1847MODPROBE_CONF=/etc/modprobe.conf
1848mpincfile=$1
1849touch $mpincfile
1850if [ -a $MODPROBE_CONF ]; then
[2431]1851 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
[2006]1852 if [ -n "$includes" ]; then
1853 for include in $includes
1854 do
1855 if [ -a "$include" ]; then
1856 echo $include >> $mpincfile
1857 fi
1858 done
1859 fi
1860fi
1861}
1862
1863
[747]1864PrepareDataDiskImages() {
[2006]1865 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
[747]1866
[1983]1867 imagesdir=$MINDI_CACHE
[1902]1868 rm -f $imagesdir/mindi.iso
[940]1869 needlist=$MINDI_TMP/what-we-need.txt
1870 bigdir=$MINDI_TMP/bigdir
[747]1871 mkdir -p $bigdir/usr/bin
[1983]1872 mkdir -p $bigdir/usr/sbin
[2006]1873 includefile=$MINDI_TMP/$$.includefile.txt
[747]1874
[2409]1875 if [ -e "$DEPLIST_FILE" ]; then
1876 lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
1877 else
1878 lfiles="$DEPLIST_DIR/*"
1879 fi
[1885]1880 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
[2006]1881 ParseModprobeForIncludes $includefile
[2019]1882 lines=$(($lines+`cat $includefile | wc -l`))
[2006]1883 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
[747]1884 res=$?
[2006]1885 rm -f $includefile
[747]1886 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]1887 pwd=`pwd`
[940]1888 cd $MINDI_TMP
[747]1889 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[2166]1890 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
[747]1891 done
[925]1892 for i in $EXTRA_MODS ; do
[1810]1893 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
1894 [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
[925]1895 for k in $j ; do
[2166]1896 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd $bigdir ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
[925]1897 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
1898 done
1899 done
1900 cd $pwd
[747]1901 else
[925]1902 ListKernelModulePaths >> $needlist
[747]1903 fi
1904 if [ "$res" -ne "0" ] ; then
[1902]1905 Die "You have $res files present in dependency list\nbut absent from filesystem."
[747]1906 fi
1907 FindAndAddUserKeyboardMappingFile
1908 mkdir -p $bigdir/tmp
[1885]1909 if [ _"$MONDO_SHARE" != _"" ]; then
[940]1910 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
1911 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]1912 fi
1913 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
1914 DropOptimizedLibraries $needlist $bigdir
1915 echo -en "Assembling dependency files"
1916 CopyDependenciesToDirectory < $needlist $bigdir
1917
[925]1918 # also copy io.sys and msdos.sys, if we can find them
[747]1919 for i in `mount | cut -d' ' -f3` ; do
[925]1920 for j in io.sys msdos.sys ; do
[963]1921 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
[925]1922 done
[747]1923 done
1924
[925]1925 # master boot record, too
[940]1926 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]1927 if [ "$i" ] ; then
[963]1928 LogIt "Backing up $i's MBR"
[925]1929 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
1930 sleep 1
1931 sync
1932 j=$i
1933 [ -h "$j" ] && j=`readlink -f $j`
[963]1934 LogIt "Creating /dev/boot_device ($j)"
[925]1935 mkdir -p $bigdir/dev
[2089]1936 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
[747]1937 fi
1938
1939 old_pwd=`pwd`
1940 cd $bigdir
1941
[1983]1942 # Get terminfo content
1943 ti="usr/share/terminfo/l"
1944 if [ -d /$ti ]; then
1945 mkdir -p $ti
1946 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
[747]1947 fi
[1764]1948 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
[747]1949 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
[1335]1950 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
[747]1951 fi
[2290]1952 if [ -d "/lib/dev-state" ]; then
1953 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
1954 fi
[747]1955 cd $old_pwd
1956 echo -e "$DONE"
1957 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
[940]1958 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]1959 CheckMountlist $MINDI_TMP/mountlist.txt
[1902]1960 mkdir -p $bigdir/tmp
[2092]1961 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
[1885]1962 if [ _"$MONDO_SHARE" != _"" ]; then
[1902]1963 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
[1885]1964 fi
[2032]1965 if [ $LVM != "false" ]; then
1966 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
1967 if [ "$?" -ne "0" ]; then
1968 LVM="false"
1969 rm -f $bigdir/tmp/i-want-my-lvm
1970 fi
1971 fi
[2302]1972 echo "Your mountlist.txt file content is:" >> $LOGFILE
1973 echo "-----------------------------------" >> $LOGFILE
[1902]1974 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
[2302]1975 echo "-----------------------------------" >> $LOGFILE
[2432]1976
[2092]1977 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
1978 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
[1902]1979 if [ _"$MONDO_SHARE" != _"" ]; then
1980 for q in filelist.full.gz biggielist.txt ; do
1981 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
1982 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
1983 done
1984 fi
1985
1986 echo -en "Tarring and zipping the data content..."
1987 size_of_all_tools=`du -sk $bigdir | cut -f1`
[2166]1988 (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]1989 du -sk $imagesdir/*gz >> $LOGFILE
1990 echo -e "$DONE"
1991
[747]1992 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[1902]1993 rm -rf $bigdir
[747]1994 rm -f $needlist
1995}
1996
1997
1998ProcessLDD() {
[1784]1999 local incoming f d nd bd bnd
[747]2000 read incoming
[1784]2001 while [ "$incoming" != "" ]; do
[859]2002 # We take the full path name of the dyn. lib. we want
[2431]2003 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
[1526]2004 for f in $incoming ; do
[1784]2005 # echo modified file name if one of the parent dir is a link
2006 # by replacing the original dirname by the destination of the link
2007 d="`dirname $f`"
2008 found="false"
2009 while [ "$d" != "/" ]; do
2010 if [ -h "$d" ]; then
2011 nd=`readlink -f $d`
2012 bd=`basename $d`
2013 bnd=`basename $nd`
2014 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2015 echo $d
2016 fi
2017 d="`dirname $d`"
2018 done
2019
[1721]2020 echo "$f"
2021 echo "`ReadAllLink $f`"
[747]2022 done
2023 read incoming
2024 done
2025}
2026
2027
2028Prompt() {
2029 echo -en "$1"
2030 read line
2031}
2032
2033
2034ReadLine() {
2035 local i incoming
2036 read incoming
2037 i=0
2038 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2039 i=$(($i+1))
2040 read incoming
[747]2041 done
2042 echo "$incoming"
2043}
2044
2045
2046SizeOfPartition() {
2047 local devpath drive res stub
2048 device=$1
2049 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2050 res=`SizeOfRaidPartition $device`
2051 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2052 echo "$res"
2053 return 0
[747]2054 fi
[925]2055 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[960]2056 res=`$FDISK -s $device 2>> $LOGFILE`
[925]2057 # end patch
[2448]2058 # take only the first in case of multiple mount (cifs, nfs, ...)
2059 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
[747]2060 [ "$res" = "" ] && res="-1"
2061 echo $res
2062 return 0
2063}
2064
2065
2066SizeOfRaidPartition() {
2067 local real_dev smallest_size silly tmp
2068
2069 silly=999999999
2070 smallest_size=$silly
2071
2072 for real_dev in `GetRaidDevMembers $1` ; do
[925]2073 tmp=`SizeOfPartition $real_dev`
2074 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2075 done
2076
2077 if [ "$smallest_size" = "$silly" ] ; then
[925]2078 echo "-1"
2079 return 1
[747]2080 else
[925]2081 echo "$smallest_size"
2082 return 0
[747]2083 fi
2084}
2085
2086
2087StripComments()
2088{
2089 local tempfile
[925]2090
[940]2091 tempfile=$MINDI_TMP/$$.strip.txt
[963]2092 cp -f $1 $tempfile 2>> $LOGFILE
[747]2093 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2094 rm -f $tempfile
2095 echo "Stripped comments from $2" >> $LOGFILE
2096}
2097
2098
[925]2099
[747]2100StripExecutable()
2101{
2102 local tmpfile
[925]2103
[940]2104 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2105 [ -d "$1" ] || [ -h "$1" ] && return
[963]2106 cp -f $1 $tmpfile 2>> $LOGFILE
[747]2107 strip $tmpfile 2> /dev/null
2108 if [ "$?" -eq "0" ] ; then
[963]2109 cp -f $tmpfile $1 2>> $LOGFILE
[925]2110 echo "Stripped binary $2" >> $LOGFILE
[747]2111 fi
2112 rm -f $tmpfile
2113}
2114
[2292]2115KernelVer() {
2116 local fkern_ver fname
[747]2117
[2292]2118 fname=$1
2119 file $fname | grep -q gzip
2120 if [ "$?" -eq "0" ] ; then
2121 # Used by ia64
2122 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2123 else
2124 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2125 fi
2126 echo "$fkern_ver"
2127}
2128
2129
[747]2130TryToFindKernelPath() {
2131 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
[925]2132
[2292]2133 we_want_version=$KERVERRUN
[747]2134 possible_kernels=""
2135 duff_kernels=""
2136
2137 if [ "$ARCH" = "ia64" ] ; then
2138 root="/boot/efi/efi"
2139 else
2140 root="/"
2141 fi
[1466]2142 for fname in `find $root -maxdepth 2 -type f | grep -E 'lin|kern' | grep -Ev '^/proc/|^/net/'` ; do
[925]2143 [ ! -e "$fname" ] && continue
[747]2144 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[2292]2145 fkern_ver=`KernelVer $fname`
[747]2146 [ "$fkern_ver" = "" ] && continue
2147 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2148 [ -f "$fname" ] || continue
2149 [ -h "$fname" ] && continue
2150 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2151 file $fname | grep -q gzip
2152 if [ "$?" -eq "0" ] ; then
2153 # Used by ia64
2154 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[963]2155 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2156 duff_kernels="$fname $duff_kernels"
2157 else
[747]2158 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2159 possible_kernels="$fname $possible_kernels"
[925]2160 fi
[747]2161 else
[925]2162 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[963]2163 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2164 duff_kernels="$fname $duff_kernels"
2165 else
[747]2166 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2167 possible_kernels="$fname $possible_kernels"
[925]2168 fi
[747]2169 fi
2170 done
2171 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2172 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2173 fi
2174 if [ ! "$possible_kernels" ] ; then
[963]2175 LogIt "No kernel matches exactly. Are there any duff kernels?"
[747]2176 possible_kernels="$duff_kernels"
2177 if [ ! "$possible_kernels" ] ; then
[963]2178 LogIt "Sorry, no duff kernels either"
[747]2179 else
[963]2180 LogIt "I bet you're running Debian or Gentoo, aren't you?"
2181 LogIt "Your kernel doesn't have a sane builddate. Oh well..."
[747]2182 fi
2183 fi
2184 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | sort -u | tr '\n' ' '`
2185 noof_kernels=`CountItemsIn "$possible_kernels"`
2186 if [ "$noof_kernels" -eq "0" ] ; then
[963]2187 LogIt "Could not find your kernel."
[925]2188 if [ -e "/boot/vmlinuz" ] ; then
[963]2189 LogIt "Using /boot/vmlinuz as a last resort."
[925]2190 output=/boot/vmlinuz
[747]2191 else
[925]2192 output=""
2193 fi
[747]2194 elif [ "$noof_kernels" -eq "1" ] ; then
2195 kernelpath=`echo "$possible_kernels" | sed s/' '//`
[2292]2196 echo "Your kernel is $kernelpath (v$KERVERRUN)" >> $LOGFILE
[747]2197 output="$kernelpath"
2198 else
2199 for i in $possible_kernels ; do
[2292]2200 if echo $i | grep "$KERVERRUN" ; then
[925]2201 LogIt "OK, I used my initiative and found that "
[963]2202 LogIt "$i is probably your kernel. "
[925]2203 output="$i"
2204 return
2205 fi
[747]2206 done
[925]2207 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2208 output=/boot/vmlinuz
2209 echo "Schlomo, this one's for you." >> $LOGFILE
2210 else
[963]2211 LogIt "Two or more possible kernels found. You may specify any one of them and the "
2212 LogIt "boot disks will still work, probably. If one does not work, try another."
2213 LogIt "$possible_kernels"
[747]2214 echo ""
[925]2215 fi
[747]2216 fi
2217 echo "$output" | tr -s ' ' '\n' | sort -u | tr '\n' ' '
2218}
2219
2220
2221TurnTgzIntoRdz() {
[1983]2222 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]2223
[747]2224 tgz_dir_fname=$1
2225 rdz_fname=$2
[1983]2226 kernelsize=$3
[1885]2227 maxsize=$(($BOOT_SIZE-$kernelsize))
[747]2228 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2229 tempfile=$MINDI_TMP/temp.rd
2230 mountpoint=$MINDI_TMP/mnt1
[747]2231 res=0
2232 echo -en "..."
2233 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2234 echo -en "..."
[1764]2235 echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2236 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
[747]2237 echo -en "..."
2238 mkdir -p $mountpoint
2239 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."
2240 echo -en "..."
2241 old_pwd=`pwd`
2242 cd $mountpoint
[2034]2243
2244 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
[2042]2245 if [ -h "/lib64" ]; then
2246 mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2247 ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2248 fi
[2034]2249
[959]2250 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
[747]2251 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
[1914]2252
[747]2253 cd dev || Die "Can't cd to dev"
2254 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2255 rm -f dev-entries.tgz
2256 cd ..
2257
2258 for w in insmod.static insmod.static.old ; do
[925]2259 s=`which $w 2> /dev/null`
2260 if [ -e "$s" ] ; then
[2156]2261 tar cf - -C / $s 2> /dev/null | tar xf -
[925]2262 fi
[747]2263 done
2264
2265 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
[1724]2266
[1882]2267 # Handle the case where busybox and mount are dynamically linked
[1786]2268 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2269 if [ $? -eq 0 ]; then
[1927]2270 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2271 rm -f bin/mount $MINDI_TMP/busy.lis
[2440]2272 mountlis=`grep -E "mount|fuse|ssh" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2 | sort -u`
[2438]2273 LocateDeps $MINDI_LIB/rootfs/bin/busybox $mountlis >> $MINDI_TMP/busy.lis
2274 # Special for libs
[2440]2275 for f in `grep -E "libnss" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2`; do
[2438]2276 echo "`ReadAllLink $f`" >> $MINDI_TMP/busy.lis
[1927]2277 done
[2438]2278 # Initial / are trucated by tar
[2166]2279 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
[1786]2280 rm -f $MINDI_TMP/busy.lis
2281 fi
2282
[2438]2283 # Copy of files mandatory for ssh to automate mount if sshfs is used
2284 mkdir $mountpoint/.ssh
[2439]2285 cp -rp ~root/.ssh/*.pub ~root/.ssh/config ~root/.ssh/known* $mountpoint/.ssh 2> /dev/null
[2438]2286 echo > $mountpoint/tmp/myssh << EOF
2287ssh -o StrictHostKeyChecking=no $*
2288EOF
2289 chmod 755 $mountpoint/tmp/myssh
2290
[2039]2291 # Copy of files mandatory for ld.so
[2042]2292 cp -rp /etc/ld.so.c* $mountpoint/etc
[2039]2293
[2164]2294 # Avoid an issue on some distro (RHEL5)
2295 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2296
[1914]2297 mkdir -p $mountpoint/tmp
[1724]2298 # Management of udev (which includes modprobe in rules)
[1759]2299 ps auxww | grep -v grep | grep -qw udevd
[1716]2300 if [ $? -eq 0 ]; then
[1914]2301 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
[1759]2302 LogIt "udev device manager found"
[2166]2303 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
[1790]2304 # This avoids NIC remapping if on another machine at restore time on Debian at least
[2145]2305 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2306 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2307 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
[2166]2308 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
[1720]2309 if [ -x /sbin/udevd ]; then
[1781]2310 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2311 lis=""
2312 # Get only the files which exist in that list
[1815]2313 # and potentially their symlink structure
[1781]2314 for i in $lis2; do
[1815]2315 if [ -h $i ]; then
2316 j=$i
2317 while [ -h $j ]; do
2318 lis="$lis $j"
2319 j=`readlink $j`
2320 done
2321 lis="$lis $j"
2322 elif [ -f $i ]; then
[1781]2323 lis="$lis $i"
2324 fi
2325 done
2326 # And their deps
[1759]2327 LocateDeps $lis > $MINDI_TMP/udev.lis
2328 for i in $lis; do
2329 if [ "`echo $i | cut -c1`" = "/" ]; then
2330 j=`echo $i | cut -c2-`
[1998]2331 [ "$j" != "" ] && rm -f $j
[1759]2332 fi
2333 done
[2166]2334 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]2335 rm -f $MINDI_TMP/udev.lis
[1720]2336 else
2337 echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
[1724]2338 echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
[1914]2339 rm -f $mountpoint/tmp/USE-UDEV
[1720]2340 fi
[1716]2341 fi
[1786]2342
[1761]2343 # Management of potential HW info (Proliant only at the moment)
[1880]2344 rm -rf $MINDI_CACHE/bkphw
2345 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2346 if [ -d $MINDI_CACHE/bkphw ]; then
[1761]2347 LogIt "Hardware Information found and saved ..."
[1880]2348 cp -rp $MINDI_CACHE/bkphw .
2349 if [ -f $MINDI_CACHE/tools.files ]; then
2350 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
[1863]2351 LocateDeps $lis > $MINDI_TMP/tools.lis
[2166]2352 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]2353 fi
[1880]2354 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2355 mv -f $MINDI_CACHE/mindi-rsthw .
[1761]2356 chmod 755 ./mindi-rsthw
2357 fi
[1880]2358 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
[1761]2359 fi
2360
[2183]2361 # Management of perl scripts delivered needed at restore time
2362 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2363 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2364
[1885]2365 for w in cdrom groovy-stuff ; do
[747]2366 mkdir -p mnt/$w
2367 done
2368
[2166]2369 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]2370
[747]2371 cd $old_pwd
2372 echo -en "..."
2373 old_pwd=`pwd`
2374 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[940]2375 cd $MINDI_TMP
[1885]2376 needed_modules_path=lib/modules/$FAILSAFE_KVER
[747]2377 else
2378 cd /
2379 if [ "${kernelname}" != "" ]
2380 then
[1885]2381 needed_modules_path=lib/modules/${kernelname}
[747]2382 else
[2292]2383 needed_modules_path=lib/modules/$KERVERRUN
[747]2384 fi
2385 fi
[1885]2386
2387 needed_modules=""
[1993]2388 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
[1885]2389
[2380]2390 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[747]2391 # For PXE boot
2392 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2393 fi
[1715]2394 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2395 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2396 fi
[1727]2397 for i in $DENY_MODS; do
2398 echo "Removing $i from the list of modules to load" >> $LOGFILE
2399 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2400 done
2401
[1885]2402 [ -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]2403 for i in $list_of_groovy_mods ; do
[1885]2404 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
[747]2405 done
[1914]2406
[1885]2407 for i in $needed_modules ; do
[747]2408 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2409 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[747]2410 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
[2166]2411 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd $mountpoint ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
[1914]2412 # Uncompress modules if not using udev and native modprobe
[1815]2413 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2414 if [ "`echo "$i" | grep -F ".gz"`" ]; then
[1914]2415 echo "Uncompressing $i" >> $LOGFILE
[1727]2416 gunzip -f $mountpoint/$i
[1815]2417 fi
[1727]2418 fi
[747]2419 done
[1815]2420
2421 # Also copy modules.dep in case of udev so that normal modprobe works
[2166]2422 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]2423
[1885]2424 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
[747]2425 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2426 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2427 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2428 rm -f $mountpoint/sbin/devfsd
2429 fi
2430 cd $old_pwd
2431 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2432 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2433 rm -f $mountpoint/zero
[1885]2434 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2435 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[2092]2436 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2437 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
[747]2438 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2439 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2440 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2441 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[747]2442 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2443 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2444 fi
2445 mkdir -p $mountpoint/proc
[1885]2446 echo "$BOOT_SIZE" > $mountpoint/tmp/$BOOT_SIZE.siz
[2438]2447
2448 echo "---------------------------" >> $LOGFILE
2449 echo "Content of initial ramdisk:" >> $LOGFILE
2450 echo "---------------------------" >> $LOGFILE
2451 (cd $mountpoint ; ls -Rla ) >> $LOGFILE
2452 echo "---------------------------" >> $LOGFILE
2453
[1230]2454 # Determine what filesystem to use for initrd image
2455 echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2456 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2457 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
[2390]2458 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
[1230]2459 # say what will be used
[2390]2460 echo "Creating an $gvFileSystem initrd image..." >> $LOGFILE
[1230]2461 # kernel expects linuxrc in ext2 filesystem
2462 ( cd $mountpoint && ln -sf sbin/init linuxrc )
2463 # unmount loop filesystem and create image file using the standard approach
2464 umount $mountpoint || Die "Cannot unmount $tempfile"
[1764]2465 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
[1794]2466 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
[1764]2467 ADDITIONAL_BOOT_PARAMS="$ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
[1799]2468 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
[1764]2469 rm -f ${rdz_fname}.tmp
[1230]2470 # log that we are done
[1821]2471 echo "...done." >> $LOGFILE
[2390]2472 elif [ "$gvFileSystem" = "initramfs" ]; then
[1230]2473 # say what will be used
[1821]2474 echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
[1230]2475 # make sure that cpio is there
2476 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2477 # go into filesystem
2478 cd $mountpoint
2479 # kernel expects init in cpio filesystem
2480 ln -sf sbin/init init
2481 # create cpio image file and unmount loop filesystem
[1929]2482 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
[1230]2483 cd $old_pwd
2484 umount $mountpoint || Die "Cannot unmount $tempfile"
2485 # log that we are done
2486 echo "...done." >> $LOGFILE
[2390]2487 else
[1230]2488 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
[2390]2489 fi
2490
[747]2491 if [ "$res" -eq "0" ] ; then
2492 echo -en "..."
2493 else
2494 echo -en "\rMade an rdz WITH ERRORS. \n"
2495 fi
2496 return 0
2497}
2498
2499
2500##############################################################################
[1021]2501#----------------------------------- Main -----------------------------------#
[747]2502##############################################################################
2503
[1885]2504# Now we can create what we need
2505mkdir -p $MINDI_TMP
[747]2506
[1885]2507# Purge from potential old run
2508if [ _"$MINDI_CACHE" = _"" ]; then
2509 Die "MINDI_CACHE undefined"
2510fi
2511
2512if [ "$1" = "--printvar" ] ; then
2513 shift
2514 if [ _"$1" != _"" ] ; then
2515 set | grep -Ew "^$1" | cut -d= -f2
2516 fi
[2183]2517 exit 0
[1885]2518fi
2519
[747]2520> $LOGFILE
2521echo "mindi v$MINDI_VERSION" >> $LOGFILE
2522echo "$ARCH architecture detected" >> $LOGFILE
2523echo "mindi called with the following arguments:" >> $LOGFILE
2524echo "$@" >> $LOGFILE
[800]2525echo "Start date : `date`" >> $LOGFILE
[1684]2526echo "-----------------------------" >> $LOGFILE
[747]2527
2528[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2529
[1010]2530# Log some capital variables
2531[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
[1885]2532echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
[1010]2533echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2534echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2535[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2536echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
[1885]2537if [ -f $MINDI_CONFIG ]; then
2538 echo "-----------------------------" >> $LOGFILE
2539 echo " Mindi configuration file " >> $LOGFILE
2540 echo "-----------------------------" >> $LOGFILE
2541 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2542 echo "-----------------------------" >> $LOGFILE
2543fi
[1010]2544
[1885]2545
[747]2546trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]2547
2548# Sanity checks
2549which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2550which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2551which 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."
2552which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2553if which awk &> /dev/null ; then
2554 if ! which gawk &> /dev/null ; then
2555 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"
2556 fi
2557fi
2558which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
[2222]2559[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
[1010]2560
[2292]2561[ "`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]2562
2563# Update the PATH variable if incomplete
2564if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2565 PATH=$PATH:/sbin:/usr/sbin
2566 export PATH
2567 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2568 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2569 echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2570fi
2571
[1885]2572# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2573if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2574 source $MINDI_LIB/FindDistroFailsafe
2575 # Log kernel image
2576 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2577else
2578 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2579fi
[1010]2580
[1737]2581if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
[1010]2582 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2583fi
2584
[925]2585### BERLIOS
[747]2586### Fix as it's not mandatory on ia64
2587if [ "$ARCH" = "ia64" ] ; then
[1010]2588 if which elilo &> /dev/null ; then
2589 LILO_EXE=elilo
2590 else
[2024]2591 LILO_EXE=`which false 2> /dev/null`
[1010]2592 fi
[747]2593else
2594 FindIsolinuxBinary
2595fi
2596trap "Aborted" SIGTERM
2597DONE="\r\t\t\t\t\t\t\t\tDone. "
2598kernelpath=""
[1010]2599MONDO_ROOT=/var/cache/mondo
[747]2600mkdir -p $MONDO_ROOT
2601
2602if [ -d "/proc/lvm" ]; then
2603 # LVM v1
2604 LVMCMD=""
2605 LVM="v1"
2606elif [ -d "/dev/mapper" ]; then
2607 # LVM v2
2608 LVMCMD="lvm"
2609 LVM="v2"
2610else
2611 LVM="false"
2612fi
[1021]2613echo "LVM set to $LVM" >> $LOGFILE
2614echo "----------" >> $LOGFILE
[1230]2615echo "mount result:" >> $LOGFILE
2616echo "-------------" >> $LOGFILE
2617mount >> $LOGFILE
2618echo "-------------" >> $LOGFILE
[1315]2619if [ -e /etc/raidtab ]; then
2620 echo "-------------" >> $LOGFILE
2621 echo "/etc/raidtab content:" >> $LOGFILE
2622 echo "-------------" >> $LOGFILE
2623 cat /etc/raidtab >> $LOGFILE
2624fi
2625echo "-------------" >> $LOGFILE
[1418]2626echo "cat /proc/cmdline:" >> $LOGFILE
2627echo "-------------" >> $LOGFILE
2628cat /proc/cmdline >> $LOGFILE
2629echo "-------------" >> $LOGFILE
[2014]2630echo "cat /proc/swaps:" >> $LOGFILE
2631echo "-------------" >> $LOGFILE
2632cat /proc/swaps >> $LOGFILE
2633echo "-------------" >> $LOGFILE
[2015]2634echo "cat /proc/partitions:" >> $LOGFILE
2635echo "-------------" >> $LOGFILE
2636cat /proc/partitions >> $LOGFILE
2637echo "-------------" >> $LOGFILE
2638echo "cat /proc/filesystems:" >> $LOGFILE
2639echo "-------------" >> $LOGFILE
2640cat /proc/filesystems >> $LOGFILE
2641echo "-------------" >> $LOGFILE
[1021]2642echo "lsmod result:" >> $LOGFILE
2643echo "-------------" >> $LOGFILE
2644lsmod >> $LOGFILE
[2431]2645MODULES="`cat /proc/modules | $AWK '{print $1}'`"
[1531]2646if [ -x /usr/sbin/esxcfg-module ]; then
[1797]2647 echo "-------------" >> $LOGFILE
[1497]2648 echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2649 echo "-------------" >> $LOGFILE
2650 echo "VMWare modules" >> $LOGFILE
2651 echo "-------------" >> $LOGFILE
[1531]2652 /usr/sbin/esxcfg-module -l >> $LOGFILE
[2431]2653 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
[1497]2654fi
[1851]2655echo "FORCE_MODS:" >> $LOGFILE
[1021]2656echo "-------------" >> $LOGFILE
[1851]2657echo $FORCE_MODS >> $LOGFILE
[1882]2658echo "-------------" >> $LOGFILE
[1851]2659echo "DENY_MODS:" >> $LOGFILE
2660echo "-------------" >> $LOGFILE
2661echo $DENY_MODS >> $LOGFILE
2662echo "-------------" >> $LOGFILE
[1796]2663echo "df result:" >> $LOGFILE
[1785]2664echo "----------" >> $LOGFILE
[1796]2665df -T >> $LOGFILE
[1785]2666echo "-------------" >> $LOGFILE
[1230]2667echo "Liste of extra modules is:" >> $LOGFILE
2668echo "$EXTRA_MODS" >> $LOGFILE
2669echo "-------------" >> $LOGFILE
[747]2670
[1723]2671# Compute libata version
[1797]2672laver=`modinfo libata | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
[1723]2673# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]2674if [ "`echo $MODULES | grep libata`" ]; then
[1727]2675 if [ "$laver" = "2" ]; then
[1726]2676 DENY_MODS="$DENY_MODS ide-generic"
[1727]2677 echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
[1726]2678 echo "-------------" >> $LOGFILE
2679 fi
[1723]2680fi
2681
[2457]2682# Check for ISO_CMD command
2683if [ ! -x $ISO_CMD ]; then
2684 echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2685fi
2686
[747]2687FLOPPY_WAS_MOUNTED=""
2688for mtpt in /media/floppy /mnt/floppy /floppy ; do
2689 if mount | grep -w $mtpt &> /dev/null ; then
2690 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2691 umount $mtpt
2692 fi
2693done
2694
[1684]2695#
2696# If we have a USB device we need to store info
2697# and remove it from the parameters line
2698#
[747]2699if [ "$#" -ne "0" ] ; then
[1684]2700 if [ "$1" = "--usb" ] ; then
2701 shift
2702 USBDEVICE=$1
2703 if [ _"$USBDEVICE" = _"" ]; then
2704 Die "No USB device specified"
2705 fi
2706 shift
2707 fi
2708fi
2709
2710if [ "$#" -ne "0" ] ; then
[747]2711 if [ "$1" = "--findkernel" ] ; then
2712 res=`TryToFindKernelPath`
[1336]2713 # Avoids logfile content for mondo
2714 export MONDO_SHARE=""
[747]2715 if [ "$res" = "" ] ; then
[925]2716 MindiExit -1
[747]2717 else
2718 echo "$res"
[925]2719 MindiExit 0
[747]2720 fi
[1720]2721 elif [ "$1" = "--locatedeps" ] ; then
2722 [ ! "$2" ] && Die "Please specify the binary to look at"
[2438]2723 LocateDeps $*
[1720]2724 # Avoids logfile content for mondo
2725 export MONDO_SHARE=""
2726 MindiExit $?
[1815]2727 elif [ "$1" = "--readalllink" ] ; then
2728 [ ! "$2" ] && Die "Please specify the binary to look at"
2729 ReadAllLink $2
2730 # Avoids logfile content for mondo
2731 export MONDO_SHARE=""
2732 MindiExit $?
[747]2733 elif [ "$1" = "--makemountlist" ] ; then
2734 [ ! "$2" ] && Die "Please specify the output file"
2735 MakeMountlist $2
[2432]2736 CheckMountlist $2
[1336]2737 # Avoids logfile content for mondo
2738 export MONDO_SHARE=""
[925]2739 MindiExit $?
2740 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2741 echo "Mindi v$MINDI_VERSION"
[1336]2742 # Avoids logfile content for mondo
2743 export MONDO_SHARE=""
[925]2744 MindiExit 0
[747]2745 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]2746 MONDO_TMP=$2
2747 # Change MINDI_TMP for the one provided by mondo
2748 # So that it can get back the built files
[2153]2749 if [ _"$MONDO_TMP" = _"" ]; then
2750 Die "MONDO_TMP is empty, aborting"
2751 fi
2752 if [ _"$MONDO_TMP" = _"/" ]; then
2753 Die "MONDO_TMP is /, aborting"
2754 fi
[2092]2755 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
[1010]2756 rmdir $MINDI_TMP
[1486]2757 export MINDI_TMP=$MONDO_TMP
[953]2758 mkdir -p $MINDI_TMP
[2238]2759
[1696]2760 # This is the scratch dir in mondo - subdir images
[1880]2761 MINDI_CACHE=$3
[2238]2762
[925]2763 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[747]2764###
2765### Sq-Modification...
2766### Attempt to locate kernel specific module path
2767### if module path is found then use it other wise use uname -r to set it...
2768###
2769 kernelname=`echo $kernelpath | cut -d'-' -f2-`
[963]2770 LogIt "kernelname = $kernelname"
2771 LogIt "kernelpath = $kernelpath"
[747]2772 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2773 then
[963]2774 LogIt "Module path for ${kernelpath} not found..."
2775 LogIt "using running kernel\'s modules."
[2292]2776 kernelname=$KERVERRUN
[747]2777 else
[963]2778 LogIt "Using modules for kernel: ${kernelname}"
[747]2779 fi
2780###
2781### end of Sq-Modification
2782###
[925]2783 TAPEDEV=$5
2784 TAPESIZE=$6
2785 FILES_IN_FILELIST=$7
2786 USE_LZO=$8
2787 CDRECOVERY=$9
[747]2788 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2789 IMAGE_DEVS=""
2790 else
2791 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2792 fi
[925]2793 if [ "${11}" ] ; then
2794 LILO_OPTIONS=""
2795 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2796 fi
2797 LAST_FILELIST_NUMBER=${12}
[747]2798 ESTIMATED_TOTAL_NOOF_SLICES=${13}
[2424]2799 export EXCLUDE_DEVS="${14}"
[747]2800 USE_COMP="${15}"
2801 USE_LILO="${16}"
[925]2802 USE_STAR="${17}"
2803 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]2804 DIFFERENTIAL="${19}"
[998]2805 USE_GZIP="${20}"
2806 NOT_BOOT="${21}"
[747]2807 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]2808 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[747]2809 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[963]2810 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
[925]2811 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
[747]2812 kernelname=`echo $kernelpath | cut -d'-' -f2-`
2813 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2814 then
[963]2815 LogIt "Module path for ${kernelpath} not found..."
2816 LogIt "using running kernel\'s modules."
[2292]2817 kernelname=$KERVERRUN
[747]2818 else
[963]2819 LogIt "Using modules for kernel: ${kernelname}"
[747]2820 fi
[1696]2821 # MONDO_ROOT is the real scratchdir
[1880]2822 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
[938]2823 if [ _"$MONDO_ROOT" != _"" ]; then
2824 mkdir -p $MONDO_ROOT
2825 else
2826 Die "MONDO_ROOT is undefined"
2827 fi
[747]2828 else
[925]2829 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2830 MindiExit -1
[747]2831 fi
2832fi
[2238]2833
2834if [ _"$MINDI_CACHE" != _"" ]; then
2835 rm -rf $MINDI_CACHE/* 2> /dev/null
2836 mkdir -p $MINDI_CACHE
2837fi
2838
[747]2839[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
2840
[1684]2841if [ _"$MONDO_SHARE" = _"" ]; then
[963]2842 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
2843 LogIt "Latest Mindi is available from http://www.mondorescue.org"
2844 LogIt "BusyBox sources are available from http://www.busybox.net"
[747]2845 LogIt "------------------------------------------------------------------------------"
2846else
[1315]2847 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
[747]2848fi
[1005]2849if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
2850 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
2851else
2852 LogIt "Unable to find mindi-busybox, please install it"
2853 MindiExit -1
2854fi
[747]2855
2856# for Mandrake 9.2, which comes with two aes.o.gz modules :-/
[2292]2857insmod /lib/modules/$KERVERRUN/*/*/misc/aes.*o.gz >> $LOGFILE 2>> $LOGFILE
[747]2858for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
2859 insmod $i >> $LOGFILE 2>> $LOGFILE
2860done
2861
2862KERN_DISK_MADE=""
2863
2864echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
2865echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
2866echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
2867if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[963]2868 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]2869 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2870 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]2871 CheckMountlist $MINDI_TMP/mountlist.txt
[940]2872 mkdir -p $MINDI_TMP/small-all/tmp
2873 cd $MINDI_TMP/small-all
[2092]2874 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]2875 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]2876 sleep 2
[963]2877 LogIt "Done. Exiting."
[925]2878 MindiExit 0
[747]2879fi
2880
[1690]2881if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1684]2882 LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
2883fi
2884
[747]2885if [ "$kernelpath" = "" ] ; then
[1335]2886 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]2887 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
2888 read ch
2889 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
2890 USE_OWN_KERNEL="yes"
[1809]2891 else
2892 USE_OWN_KERNEL="no"
[747]2893 fi
2894 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]2895 YOUR_KERNEL_SUCKS=""
2896 kernelpath=`TryToFindKernelPath`
2897 if [ "$kernelpath" = "" ] ; then
2898 echo -n "Please enter kernel path : "
2899 read kernelpath
2900 fi
[747]2901 else
[925]2902 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]2903 fi
2904fi
2905if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
[1885]2906 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2907 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
2908 source $MINDI_LIB/FindDistroFailsafe
2909 # Log kernel image
2910 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2911 kernelpath="$FAILSAFE_KBIN"
2912 LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
2913 LogIt "The failsafe kernel is $kernelpath.\n"
2914 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
2915 LogIt "disks then it may still be a result of a problem with your kernel.\n"
2916 pwd=`pwd`
2917 cd $MINDI_TMP
2918 mkdir -p lib/modules
2919 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
2920 cd $pwd
2921 else
2922 kernelpath=$MINDI_LIB/vmlinuz
2923 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
2924 LogIt "However, you are still running your kernel. If Mindi fails to create your"
2925 LogIt "disks then it may still be a result of a problem with your kernel."
2926 pwd=`pwd`
2927 cd $MINDI_TMP
2928 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
2929 cd $pwd
2930 fi
[747]2931 YOUR_KERNEL_SUCKS="Your kernel sucks"
2932fi
[1880]2933echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
[963]2934[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
[747]2935
[965]2936[ "$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]2937
[1983]2938PrepareDataDiskImages
2939
[747]2940ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
2941rds=$(($ramdisk_size-$((ramdisk_size%4096))))
[1983]2942export ramdisk_size=$rds
[747]2943
2944echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
[1567]2945if [ "$ARCH" = "ia64" ] ; then
[1983]2946 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
[1567]2947else
[2073]2948 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
[747]2949fi
2950
2951[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
2952...Or type 'memtest' to test your PC's RAM thoroughly.\n"
2953
[1684]2954if [ _"$MONDO_SHARE" = _"" ]; then
[1983]2955 ListImagesForUser
2956 OfferToMakeBootableISO
[1684]2957 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
[1983]2958 OfferToMakeBootableUSB
[1684]2959 fi
[963]2960 LogIt "Finished."
[747]2961elif [ "$TAPEDEV" ] ; then
[2078]2962 if [ "$ARCH" != "ia64" ] ; then
2963 # We need to keep the img file as boot file for ia64 platform
2964 rm -f $MINDI_CACHE/{*img,*iso}
2965 else
2966 rm -f $MINDI_CACHE/*iso
2967 fi
[1898]2968 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]2969 OfferToMakeBootableUSB
[1898]2970 fi
[1983]2971 OfferToMakeBootableISO
[1880]2972 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
2973 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]2974 else
[925]2975 Die "Cannot find all.tar.gz, to be written to tape"
[747]2976 fi
[1695]2977elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]2978 OfferToMakeBootableUSB
[747]2979else
[1983]2980 OfferToMakeBootableISO
[747]2981fi
2982# cleanup
[963]2983LogIt "$FRIENDLY_OUTSTRING"
[747]2984for mtpt in $FLOPPY_WAS_MOUNTED ; do
2985 mount $mtpt
2986done
[925]2987MindiExit 0
Note: See TracBrowser for help on using the repository browser.