source: MondoRescue/branches/2.2.10/mindi/mindi@ 2873

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