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

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