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

Last change on this file since 2854 was 2854, checked in by Bruno Cornec, 13 years ago
  • Fix a compatibility bug in mindi where exclude lists with '|' was incorrectly analyzed (' ' still expected)
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 113.8 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 2854 2011-07-25 11:48:48Z 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
[2854]1230 for d in `echo $MINDI_EXCLUDE_DEVS | sed 's/|/ /g'`; 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
[2851]1501 $FDISK -l $USBDEVICE 2>> $LOGFILE 1> $MINDI_TMP/fdisk.log
1502 cat $MINDI_TMP/fdisk.log >> $LOGFILE
[1684]1503 if [ $? -ne 0 ]; then
1504 echo "Unable to access $USBDEVICE" | tee -a $LOGFILE
1505 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1506 exit -1
1507 fi
1508 echo -en "."
[2461]1509 echo "Unmounting $USBPART just in case" >> $LOGFILE
[1721]1510 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
[2057]1511 # If your key has no MBR it may cause an issue
1512 # Use dd if=mbr.bin of=$USBDEVICE or ms-sys -s $USBDEVICE
[2054]1513 echo "Preparing $USBDEVICE" >> $LOGFILE
[2851]1514 cat > $MINDI_TMP/fdisk.txt << EOF
[2057]1515d
1516d
1517d
1518d
[1684]1519n
1520p
15211
1522
1523
1524t
1525b
[2851]1526w
1527EOF
1528 # Search for bootable flag
1529 grep '* ' $MINDI_TMP/fdisk.log | grep $USBDEVICE
1530 if [ $? -ne 0 ]; then
1531 cat >> $MINDI_TMP/fdisk.txt << EOF
[1684]1532a
15331
1534w
1535EOF
[2851]1536 fi
1537 $FDISK $USBDEVICE 2>> $LOGFILE 1>> $LOGFILE < $MINDI_TMP/fdisk.txt
[1684]1538 if [ $? -ne 0 ]; then
1539 echo "Unable to create a vfat Filesystem on $USBDEVICE" | tee -a $LOGFILE
1540 echo "Make sure your USB device is pluged in" | tee -a $LOGFILE
1541 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1542 MindiExit -1
1543 fi
[2851]1544 echo "fdisk build file" >> $LOGFILE
1545 echo "----------------" >> $LOGFILE
1546 cat $MINDI_TMP/fdisk.txt >> $LOGFILE
1547 echo "----------------" >> $LOGFILE
1548 rm -f $MINDI_TMP/fdisk.log $MINDI_TMP/fdisk.txt
[2190]1549 echo "The USB device $USBDEVICE now looks like this:" >> $LOGFILE
1550 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
[1684]1551 echo -en "."
[2461]1552 # Some distro do auto mount at that point (Ubuntu)
1553 echo "Unmounting $USBPART just in case again" >> $LOGFILE
1554 umount $USBPART 2>> $LOGFILE 1>> $LOGFILE
1555 echo -en "."
[1684]1556 echo "Creating a vfat filesystem on $USBPART" >> $LOGFILE
[1688]1557 mkdosfs -F 32 $USBPART 2>&1 >> $LOGFILE
[1684]1558 if [ $? -ne 0 ]; then
1559 echo "Unable to create a vfat filesystem on $USBPART" | tee -a $LOGFILE
1560 echo "Make sure your USB device is pluged in and partitioned ($USBPART must exist on it)" | tee -a $LOGFILE
1561 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1562 MindiExit -1
1563 fi
1564 echo -en "."
1565 echo "Mounting $USBPART on $MINDI_TMP/usb" >> $LOGFILE
1566 mount $USBPART $MINDI_TMP/usb 2>> $LOGFILE
1567 if [ $? -ne 0 ]; then
1568 echo "Unable to mount $USBPART on $MINDI_TMP/usb" | tee -a $LOGFILE
1569 echo "Make sure your USB device is pluged in, partitioned and formated ($USBPART must exist on it)" | tee -a $LOGFILE
1570 $FDISK -l $USBDEVICE 2>&1 | tee -a $LOGFILE
1571 MindiExit -1
1572 fi
1573 echo -en "."
[1691]1574 mkdir -p $MINDI_TMP/usb/images
[1983]1575 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]1576 echo -en "."
1577 echo "mindi_lib = $MINDI_LIB" >> $LOGFILE
1578 for i in memdisk memtest.bin memtest.img ; do
1579 j=$MINDI_LIB/$i
1580 k=$MINDI_TMP/usb
1581 if [ -e "$j" ] ; then
1582 LogIt "Copying $j to $k"
[2092]1583 cp -f $j $k 2>> $LOGFILE || Die "Failed to copy $j to $k"
1584 cp -f $j $MINDI_TMP 2>> $LOGFILE || Die "Failed to copy $j to $MINDI_TMP"
[1684]1585 fi
1586 done
1587 echo -en "."
[1983]1588 MakeMessageFile > $MINDI_TMP/usb/message.txt
[1684]1589 echo -en "."
[2092]1590 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]1591 echo -en "."
[1983]1592 cp $MINDI_TMP/initrd.img $MINDI_TMP/usb/initrd.img 2>> $LOGFILE
[1684]1593 echo -en "."
[2041]1594 MakeBootConfFile syslinux > $MINDI_TMP/usb/syslinux.cfg
[1684]1595 echo -en "."
[2476]1596 echo "----------- syslinux's conf --------------" |tee -a $LOGFILE
1597 cat $MINDI_TMP/usb/syslinux.cfg |tee -a $LOGFILE
1598 echo "------------------------------------------" |tee -a $LOGFILE
[1721]1599 umount $MINDI_TMP/usb
[1684]1600 if [ "$ARCH" != "ia64" ] ; then
[2056]1601 syslinux -s $USBPART 2>> $MINDI_TMP/syslinux.log
[1684]1602 if [ "$?" -ne "0" ] ; then
1603 echo "----------- syslinux's errors --------------" |tee -a $LOGFILE
1604 cat $MINDI_TMP/syslinux.log |tee -a $LOGFILE
[2476]1605 echo "------------------------------------------" |tee -a $LOGFILE
[1684]1606 LogIt "Failed to create USB image."
1607 else
1608 echo -e "$DONE"
1609 echo "Created bootable USB image on $USBDEVICE" >> $LOGFILE
1610 fi
1611 rm -f $MINDI_TMP/syslinux.log
1612 else
1613 echo "No USB boot support for ia64" | tee -a $LOGFILE
1614 MindiExit -1
1615 fi
1616}
1617
1618
[747]1619MakeMessageFile() {
[2292]1620
1621 if [ -x "/bin/lsb_release" ]; then
1622 DESC=`/bin/lsb_release -d | cut -d: -f2 | sed "s/[ \t]*//"`
[2754]1623 elif [ -r /etc/arch-release ]; then # this code must be written before /etc/issue test to avoid errors
1624 DESC="Arch Linux"
1625 if [ -r /var/log/pacman.log ]; then
1626 # there are no releases but we can get the last system upgrade
1627 # Output example: Arch Linux [2011-03-03 01:39]
1628 DESC="$DESC $(tac /var/log/pacman.log | grep -m1 'full system upgrade' | cut -d']' -f1)]"
1629 fi
[2732]1630 elif [ -r /etc/issue.net ]; then
[2731]1631 DESC=`head -1 /etc/issue.net`
[2732]1632 elif [ -r /etc/issue ]; then
[2731]1633 DESC=`head -1 /etc/issue`
[2292]1634 elif [ -x "/usr/bin/pbdistrocheck" ]; then
1635 # For pb >= 0.9.8
[2731]1636 DESC=`/usr/bin/pbdistrocheck -s | cut -d, -f1-4`
[747]1637 else
[2731]1638 DESC="Unknown desc"
[747]1639 fi
[2292]1640 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]1641 if [ _"$MONDO_SHARE" != _"" ]; then
1642 if [ "$CDRECOVERY" != "yes" ] ; then
[2380]1643 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1885]1644 echo -en "Press <enter> to continue.\n"
1645 elif [ ! "$MINDI_TMP" ] ; then
1646 echo -en "FYI, this is _not_ a Mondo Rescue CD.\n"
[1983]1647 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1648 echo -en "Type 'memtest' <Enter> to test your PC's memory intensively.\nJust press <Enter> to go to the main test menu.\n"
1649 fi
[1885]1650 else
1651 echo -en "$BOOT_MEDIA_MESSAGE"
[747]1652 fi
[1983]1653 else
1654 echo -en "\
[747]1655To restore your disk to factory defaults, type 'RESTORE' <enter>.\n\
1656CAUTION: THIS WILL ERASE YOUR WHOLE DISK !!!\n"
[1983]1657 fi
[747]1658 fi
1659 echo -en "\n\n\n"
1660}
1661
1662
[1983]1663MakeBootConfFile() {
[1885]1664 local options i ooo
[747]1665 options=""
[1983]1666 # Type of boot file (elilo or syslinux/isolinux)
1667 type=$1
1668 if [ "$type" = "elilo" ]; then
1669 sep="="
1670 else
1671 sep=" "
1672 fi
[925]1673
[1983]1674 # Generic header for conf file
1675 if [ "$type" != "elilo" ] ; then
1676 echo -en "prompt 1\ndisplay message.txt\n"
1677 else
1678 echo -en "prompt\n"
[925]1679 fi
[1983]1680
1681 # Compute which default option to boot from
[747]1682 if [ "$CDRECOVERY" = "yes" ] ; then
[1983]1683 echo -en "default${sep}RESTORE\n"
1684 # In case it's mondoarchive
[1885]1685 elif [ _"$MONDO_SHARE" != _"" ]; then
[2380]1686 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[1983]1687 echo -en "default${sep}iso\n"
[747]1688 else
[1983]1689 echo -en "default${sep}interactive\n"
[747]1690 fi
1691 else
[1983]1692 echo -en "default${sep}expert\n"
[747]1693 fi
1694
[1983]1695 # Handle timeout
[747]1696 if [ "$CDRECOVERY" != "yes" ] ; then
[1983]1697 echo -en "timeout${sep}300\n"
1698 else
1699 echo -en "timeout${sep}10000\n"
[747]1700 fi
1701 echo -en "\n"
[1983]1702
[2124]1703 # prepare which labels will be generated
[747]1704 if [ "$CDRECOVERY" = "yes" ] ; then
[925]1705 options="RESTORE expert"
[1885]1706 else
1707 if [ _"$MONDO_SHARE" != _"" ]; then
[2344]1708 options="interactive expert compare iso nuke isonuke"
[747]1709 else
1710 options="expert"
[925]1711 fi
[747]1712 fi
[1983]1713
1714 # Generate rest of conf file
[747]1715 for i in $options ; do
[925]1716 ooo=$i
1717 [ "$ooo" = "RESTORE" ] && ooo="nuke"
[1983]1718 if [ "$type" = "elilo" ]; then
[2564]1719 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]1720 else
[2073]1721 ps="/"
1722 if [ "$type" = "syslinux" ]; then
1723 ps=""
1724 fi
[2629]1725 if [ $KERNEL_IS_XEN = "no" ]; then
1726 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"
1727 else
1728 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"
1729 fi
[925]1730 fi
[1885]1731 echo -en "$outstr"
[747]1732 done
[1983]1733 if [ -e "$MINDI_LIB/memtest.img" ] ; then
1734 if [ "$type" = "elilo" ]; then
1735 echo -en "image=/memtest.bin\n\tlabel=memtest\n"
[2073]1736 echo -en "image=/memdisk\n\tlabel=memdisk\nappend=\"initrd=memtest.img\"\n"
[1983]1737 else
[2073]1738 ps="/"
1739 if [ "$type" = "syslinux" ]; then
1740 ps=""
1741 fi
1742 echo -en "label memtest\n\tkernel ${ps}memtest.bin\n"
1743 echo -en "label memdisk\n\tkernel ${ps}memdisk\nappend initrd=${ps}memtest.img\n"
[1983]1744 fi
1745 fi
[747]1746}
1747
1748
1749PrepareBootDiskImage_LILO() {
[1983]1750 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size liloconf
1751 imagesdir=$MINDI_CACHE
1752 kernelpath=$1
[747]1753
1754 retval=0
[2690]1755 [ ! -e "$kernelpath" ] && Die "PBDI lilo - cannot find $kernelpath kernel"
[1885]1756 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1757 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]1758 echo -en "..."
[1885]1759 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
[940]1760 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1761 mkdir -p $mountpoint
[1885]1762 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
[1983]1763 mkdosfs $imagefile >> $LOGFILE 2>> $LOGFILE
1764 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
[964]1765 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[747]1766 mkdir -p $mountpoint/etc
[1983]1767 liloconf=$mountpoint/elilo.conf
[747]1768
[1983]1769 MakeBootConfFile elilo > $liloconf
[747]1770
[1230]1771 # Copy it so that CD-ROM menu entry is satisfied
[1983]1772 mountefi=0
1773 df -T | grep /boot/efi | grep -q vfat
1774 if [ $? -ne 0 ]; then
1775 mount /boot/efi
[1230]1776 if [ $? -ne 0 ]; then
[1983]1777 echo "You have to mount your EFI partition when using mindi"
1778 MindiExit -1
[1230]1779 fi
[1983]1780 mountefi=1
[1230]1781 fi
[1983]1782 el=`find /boot/efi -name elilo.efi`
1783 cp $el $mountpoint
1784 cp $liloconf $mountpoint
1785 if [ $mountefi -eq 1 ]; then
1786 umount /boot/efi 2>&1 > /dev/null
1787 fi
[1230]1788
[1983]1789 echo "Copying $MINDI_TMP/initrd.img to $mountpoint..." >> $LOGFILE
1790 cp -f $MINDI_TMP/initrd.img $mountpoint 2>> $LOGFILE
[747]1791 if [ "$?" -ne "0" ] ; then
[1983]1792 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1793 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[2773]1794 LogIt "Please unload some of your modules and try again. Or increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[940]1795 rm -f $MINDI_TMP/mtpt.$$
[1983]1796 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?)"
[747]1797 retval=$(($retval+1))
1798 fi
[1983]1799 MakeMessageFile > $mountpoint/message.txt
[747]1800
1801 mkdir -p $mountpoint/tmp
[1983]1802 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1803 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
[747]1804 fi
1805
[925]1806 # copy the kernel across
[1230]1807 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1808 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1809 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2092]1810 cp -f $kernelpath $mountpoint/vmlinuz > /dev/null 2>> $LOGFILE
[1885]1811 if [ "$?" -ne "0" ] ; then
[925]1812 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1813 du -sk $mountpoint/* >> $LOGFILE
1814 echo "--- end of list of files ---" >> $LOGFILE
[2691]1815 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
[1998]1816 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[2712]1817 cd "$old_pwd"
[747]1818 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[963]1819 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[925]1820 # losetup /dev/loop0 -d
[1998]1821 [ "$imagefile" != "" ] && rm -f $imagefile
[2773]1822 LogIt "Sorry, your kernel is too big for your image"
1823 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[1885]1824 return 0
[747]1825 fi
1826 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[1885]1827 echo "Free space left on image = $free_space KB" >> $LOGFILE
1828 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
[1794]1829 # make it bootable
[1998]1830 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[963]1831 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[1983]1832 if [ "$KERN_DISK_MADE" ] ; then
[925]1833 echo "Not running LILO. It's not that kind of disk." >> $LOGFILE
[747]1834 fi
[925]1835
[1983]1836 cp `dirname $kernelpath`/*.efi $mountpoint 2>> $LOGFILE
[747]1837 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1838 echo -en "..."
[963]1839 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]1840 if [ "$retval" -eq "0" ] ; then
[1885]1841 echo -en "...$DONE\n"
[747]1842 if [ "$KERN_DISK_MADE" ] ; then
[1885]1843 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
[747]1844 fi
1845 else
[1885]1846 echo -en "...failed\n"
1847 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
[1998]1848 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1849 fi
[963]1850 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
[747]1851 return $retval
1852}
1853
1854
[2073]1855PrepareBootDiskImage_ISOLINUX() {
[1983]1856 local imagesdir dev imagefile mountpoint fname i kernelpath cfg_file testpath options retval outstr old_pwd ooo max_kernel_size bootimage
1857 imagesdir=$MINDI_CACHE
1858 kernelpath=$1
[747]1859 do_boot_root_thingy=""
1860 local retval old_pwd
1861 retval=0
[925]1862
[2690]1863 [ ! -e "$kernelpath" ] && Die "PBDI isolinux - cannot find $kernelpath kernel"
[1885]1864 echo -en "Making "$BOOT_SIZE"KB boot disk..."
[1983]1865 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]1866 echo -en "..."
[2067]1867 imagefile=$MINDI_TMP/mindi-bootroot.$BOOT_SIZE.img
[940]1868 mountpoint=$MINDI_TMP/mountpoint.$$
[747]1869 mkdir -p $mountpoint
[1885]1870 dd if=/dev/zero of=$imagefile bs=1k count=$BOOT_SIZE &> /dev/null || Die "Cannot dd blank file"
1871 echo "Creating vfat filesystem on $imagefile" >> $LOGFILE
1872 mkfs.vfat $imagefile >> $LOGFILE 2>> $LOGFILE
[2067]1873 # syslinux should be run on a local file (doen't work through NFS Cf: #297)
[1885]1874 syslinux $imagefile >> $LOGFILE 2>> $LOGFILE
1875
[2625]1876 # Only move it now to its final destination and use it now
[2067]1877 mv $imagefile $imagesdir
1878 imagefile=$imagesdir/mindi-bootroot.$BOOT_SIZE.img
1879
[963]1880 mount -t vfat -o loop $imagefile $mountpoint || LogIt "Cannot mount (PBDI)"
[925]1881
1882 # copy Mindi's skeleton fs & lilo/syslinux/whatever stuff into it
[1983]1883 MakeMessageFile > $mountpoint/message.txt
[2073]1884 MakeBootConfFile isolinux > $mountpoint/syslinux.cfg
[1983]1885 echo "Copying $MINDI_TMP/initrd.img to $mountpoint/initrd.img..." >> $LOGFILE
1886 cp -f $MINDI_TMP/initrd.img $mountpoint/initrd.img 2>> $LOGFILE
[747]1887 if [ "$?" -ne "0" ] ; then
[1983]1888 LogIt "Failed to copy $MINDI_TMP/initrd.img to $mountpoint"
[940]1889 cat $MINDI_TMP/mtpt.$$ >> $LOGFILE
[963]1890 LogIt "Please unload some of your modules and try again."
[940]1891 rm -f $MINDI_TMP/mtpt.$$
[2773]1892 LogIt "Cannot incorporate initrd.img in bootdisk (kernel / modules too big?). Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[747]1893 retval=$(($retval+1))
1894 fi
1895
1896 mkdir -p $mountpoint/tmp
[1983]1897 if [ -f "$MINDI_TMP/mondo-restore.cfg" ]; then
1898 cp -f $MINDI_TMP/mondo-restore.cfg $mountpoint/tmp
1899 fi
[747]1900
[925]1901 # copy the kernel across
[1230]1902 [ "$mountpoint" != "" ] && rm -Rf $mountpoint/lost+found
[747]1903 dd if=/dev/zero of=$mountpoint/zero bs=1k count=16 &> /dev/null
[1796]1904 free_space=`df -k -P $mountpoint | tail -n1 | tr -s ' ' '\t' | cut -f4`
[2629]1905
1906 retval=0
[2681]1907 cp -f $kernelpath $mountpoint/vmlinuz &> /dev/null
1908 retval=$?
1909 if [ $KERNEL_IS_XEN = "yes" ]; then
[2629]1910 cp -f $xenkernelpath $mountpoint/xenkernel &> /dev/null
1911 let retval+=$?
1912 fi
1913
1914 if [ "$retval" -ne "0" ] ; then
[747]1915 echo "Files at mountpoint ($mountpoint) :-" >> $LOGFILE
1916 du -sk $mountpoint/* >> $LOGFILE
1917 echo "--- end of list of files ---" >> $LOGFILE
[2691]1918 echo -en "Kernel size = `du -sk $kernelpath | cut -f1` K\nRamdisk free = $free_space K\n" >> $LOGFILE
[1998]1919 [ "$mountpoint" != "" ] && rm -f $mountpoint/vmlinuz
[2712]1920 cd "$old_pwd"
[747]1921 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
[963]1922 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]1923
[2773]1924 LogIt "Sorry, your kernel is too big for your image"
1925 Die "Try to increase EXTRA_SPACE and BOOT_SIZE in $MINDI_CONFIG"
[747]1926 fi
1927 max_kernel_size=$(($free_space+`du -sk $kernelpath | cut -f1`))
[1885]1928 echo "Free space left on image = $free_space KB" >> $LOGFILE
1929 echo "Max kernel size on $BOOT_SIZE KB image (est'd) = $max_kernel_size K" >> $LOGFILE
[925]1930
1931 # make it bootable
[1998]1932 [ "$mountpoint" != "" ] && rm -f $mountpoint/zero
[747]1933 mkdir -p $mountpoint/etc
[963]1934 [ -e "$MINDI_LIB/memdisk" ] && cp -f $MINDI_LIB/memdisk $mountpoint 2>> $LOGFILE
[747]1935 umount $mountpoint || Die "Cannot unmount mountpoint ($mountpoint)"
1936 echo -en "..."
[963]1937 rmdir $mountpoint || LogIt "Cannot rmdir (PBDI)"
[747]1938
1939 if [ "$retval" -eq "0" ] ; then
[1885]1940 echo -en "...$DONE\n"
[747]1941 if [ "$KERN_DISK_MADE" ] ; then
[1998]1942 [ "$imagefile" != "" ] && rm -f $imagefile
[1885]1943 LogIt "$BOOT_SIZE KB boot disks were created OK\n"
[747]1944 fi
1945 else
[1885]1946 echo -en "...failed\n"
1947 LogIt $BOOT_SIZE"KB boot disk was NOT created\n"
[1998]1948 [ "$imagefile" != "" ] && rm -f $imagefile
[747]1949 fi
[963]1950 [ "$retval" -ne "0" ] && LogIt "PrepareBootDiskImage() is returning nonzero"
[747]1951 return $retval
1952}
1953
1954
[2006]1955ParseModprobeForIncludes() {
1956local MODPROBE_CONF mpincfile includes include
1957
1958MODPROBE_CONF=/etc/modprobe.conf
1959mpincfile=$1
1960touch $mpincfile
1961if [ -a $MODPROBE_CONF ]; then
[2431]1962 includes=$($AWK '/^[ \t]*include[ \t]+/ {if(NF>=2){print $2}}' $MODPROBE_CONF|sort -u)
[2006]1963 if [ -n "$includes" ]; then
1964 for include in $includes
1965 do
1966 if [ -a "$include" ]; then
1967 echo $include >> $mpincfile
1968 fi
1969 done
1970 fi
1971fi
1972}
1973
1974
[747]1975PrepareDataDiskImages() {
[2006]1976 local needlist bigdir diskdir imagesdir res i j k old_pwd lines lfiles includefile
[747]1977
[1983]1978 imagesdir=$MINDI_CACHE
[1902]1979 rm -f $imagesdir/mindi.iso
[940]1980 needlist=$MINDI_TMP/what-we-need.txt
1981 bigdir=$MINDI_TMP/bigdir
[747]1982 mkdir -p $bigdir/usr/bin
[1983]1983 mkdir -p $bigdir/usr/sbin
[2006]1984 includefile=$MINDI_TMP/$$.includefile.txt
[747]1985
[2409]1986 if [ -e "$DEPLIST_FILE" ]; then
1987 lfiles="$DEPLIST_FILE $DEPLIST_DIR/*"
1988 else
1989 lfiles="$DEPLIST_DIR/*"
1990 fi
[1885]1991 lines=`grep -vx " *#.*" $lfiles | grep -vx "" | wc -l`
[2006]1992 ParseModprobeForIncludes $includefile
[2019]1993 lines=$(($lines+`cat $includefile | wc -l`))
[2006]1994 cat $lfiles $includefile | GenerateGiantDependencyList $needlist $lines
[747]1995 res=$?
[2006]1996 rm -f $includefile
[747]1997 if [ "$YOUR_KERNEL_SUCKS" ]; then
[925]1998 pwd=`pwd`
[2712]1999 cd "$MINDI_TMP"
[747]2000 for i in `ListKernelModulePaths | HackPathsToFailsafe` ; do
[2712]2001 tar cf - ./$i 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || Die "PDDI can't copy $i->$bigdir" $MINDI_TMP/$$.log
[747]2002 done
[925]2003 for i in $EXTRA_MODS ; do
[1810]2004 j=`find lib/modules/$FAILSAFE_KVER -name $i.*o.gz 2> /dev/null`
2005 [ ! "$j" ] && echo "WARNING - cannot find failsafe module $i.o.gz" >> $LOGFILE
[925]2006 for k in $j ; do
[2712]2007 tar cf - $k 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "ERROR on module $k" $MINDI_TMP/$$.log
[925]2008 echo "Added failsafe module $k to ramdisk" >> $LOGFILE
2009 done
2010 done
[2712]2011 cd "$pwd"
[747]2012 else
[925]2013 ListKernelModulePaths >> $needlist
[747]2014 fi
2015 if [ "$res" -ne "0" ] ; then
[1902]2016 Die "You have $res files present in dependency list\nbut absent from filesystem."
[747]2017 fi
2018 FindAndAddUserKeyboardMappingFile
2019 mkdir -p $bigdir/tmp
[1885]2020 if [ _"$MONDO_SHARE" != _"" ]; then
[940]2021 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
2022 cp -f $MINDI_TMP/mondo-restore.cfg $bigdir/tmp &> /dev/null
[747]2023 fi
2024 [ -d "/mnt/.boot.d" ] && echo "Oh Jebus" > $bigdir/tmp/DUMBASS-GENTOO
2025 DropOptimizedLibraries $needlist $bigdir
2026 echo -en "Assembling dependency files"
2027 CopyDependenciesToDirectory < $needlist $bigdir
2028
[925]2029 # also copy io.sys and msdos.sys, if we can find them
[747]2030 for i in `mount | cut -d' ' -f3` ; do
[925]2031 for j in io.sys msdos.sys ; do
[963]2032 [ -e "$i/$j" ] && cp -f $i/$j $bigdir 2>> $LOGFILE
[925]2033 done
[747]2034 done
2035
[925]2036 # master boot record, too
[940]2037 i=`cat $MINDI_TMP/BOOTLOADER.DEVICE 2> /dev/null`
[747]2038 if [ "$i" ] ; then
[963]2039 LogIt "Backing up $i's MBR"
[925]2040 dd if=$i of=$bigdir/BOOTLOADER.MBR bs=446 count=1 >> $LOGFILE 2>> $LOGFILE
2041 sleep 1
2042 sync
2043 j=$i
2044 [ -h "$j" ] && j=`readlink -f $j`
[963]2045 LogIt "Creating /dev/boot_device ($j)"
[925]2046 mkdir -p $bigdir/dev
[2089]2047 cp -pRdf $j $bigdir/dev/boot_device 2>> $LOGFILE || Die "Unable to create /dev/boot_device on ramdisk"
[747]2048 fi
2049
2050 old_pwd=`pwd`
[2712]2051 cd "$bigdir"
[747]2052
[1983]2053 # Get terminfo content
2054 ti="usr/share/terminfo/l"
2055 if [ -d /$ti ]; then
2056 mkdir -p $ti
2057 cp -Rdf /$ti/* $ti 2>> $LOGFILE || LogIt "WARNING - error occurred while copying terminfo"
[747]2058 fi
[1764]2059 if [ -e "$MONDO_SHARE/restore-scripts" ]; then
[747]2060 cp -Rdf $MONDO_SHARE/restore-scripts/* . 2>> $LOGFILE
[1335]2061 [ "$?" -ne "0" ] && [ _"$MONDO_SHARE" != _"" ] && Die "Cannot find/install $MONDO_SHARE/restore-scripts"
[747]2062 fi
[2290]2063 if [ -d "/lib/dev-state" ]; then
2064 tar cf - -C / ./lib/dev-state 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Unable to handle /lib/dev-state" $MINDI_TMP/$$.log
2065 fi
[2712]2066 cd "$old_pwd"
[747]2067 echo -e "$DONE"
2068 TOTAL_BIGDIR_SIZE=`du -sk $bigdir | cut -f1`
[940]2069 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]2070 CheckMountlist $MINDI_TMP/mountlist.txt
[1902]2071 mkdir -p $bigdir/tmp
[2092]2072 cp -f $MINDI_TMP/mountlist.txt $bigdir/tmp/mountlist.txt 2>> $LOGFILE || Die "Cannot copy mountlist.txt from $MINDI_TMP to data disk"
[1885]2073 if [ _"$MONDO_SHARE" != _"" ]; then
[1902]2074 cp -f $bigdir/tmp/mountlist.txt $MINDI_TMP/. 2>> $LOGFILE
[1885]2075 fi
[2032]2076 if [ $LVM != "false" ]; then
2077 $MINDI_LIB/analyze-my-lvm > $bigdir/tmp/i-want-my-lvm
2078 if [ "$?" -ne "0" ]; then
2079 LVM="false"
2080 rm -f $bigdir/tmp/i-want-my-lvm
[2552]2081 else
2082 echo "Your i-want-my-lvm file content is:" >> $LOGFILE
2083 echo "-----------------------------------" >> $LOGFILE
2084 cat $bigdir/tmp/i-want-my-lvm >> $LOGFILE
2085 echo "-----------------------------------" >> $LOGFILE
[2032]2086 fi
2087 fi
[2302]2088 echo "Your mountlist.txt file content is:" >> $LOGFILE
2089 echo "-----------------------------------" >> $LOGFILE
[1902]2090 cat $bigdir/tmp/mountlist.txt >> $LOGFILE
[2302]2091 echo "-----------------------------------" >> $LOGFILE
[2432]2092
[2092]2093 echo -en "$FILES_IN_FILELIST" > $bigdir/FILES-IN-FILELIST 2>> $LOGFILE
2094 echo -en "$LAST_FILELIST_NUMBER" > $bigdir/LAST-FILELIST-NUMBER 2>> $LOGFILE
[1902]2095 if [ _"$MONDO_SHARE" != _"" ]; then
2096 for q in filelist.full.gz biggielist.txt ; do
2097 [ ! -e "$MINDI_TMP/$q" ] && Die "Cannot find $MINDI_TMP/$q"
2098 cp -pRdf $MINDI_TMP/$q $bigdir/tmp 2>> $LOGFILE
2099 done
2100 fi
2101
2102 echo -en "Tarring and zipping the data content..."
2103 size_of_all_tools=`du -sk $bigdir | cut -f1`
[2712]2104 (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]2105 du -sk $imagesdir/*gz >> $LOGFILE
2106 echo -e "$DONE"
2107
[747]2108 FRIENDLY_OUTSTRING="Boot and data disk images were created."
[1902]2109 rm -rf $bigdir
[747]2110 rm -f $needlist
2111}
2112
2113
2114ProcessLDD() {
[1784]2115 local incoming f d nd bd bnd
[747]2116 read incoming
[1784]2117 while [ "$incoming" != "" ]; do
[859]2118 # We take the full path name of the dyn. lib. we want
[2431]2119 incoming=`echo "$incoming" | $AWK '{if (match($1,/\//)) {print $1} else {if (match($3,/\//)) print $3} fi}'`
[1526]2120 for f in $incoming ; do
[1784]2121 # echo modified file name if one of the parent dir is a link
2122 # by replacing the original dirname by the destination of the link
2123 d="`dirname $f`"
2124 found="false"
2125 while [ "$d" != "/" ]; do
2126 if [ -h "$d" ]; then
2127 nd=`readlink -f $d`
2128 bd=`basename $d`
2129 bnd=`basename $nd`
2130 f=`echo $f | sed "s~/$bd/~/$bnd/~"`
2131 echo $d
2132 fi
2133 d="`dirname $d`"
2134 done
2135
[1721]2136 echo "$f"
2137 echo "`ReadAllLink $f`"
[747]2138 done
2139 read incoming
2140 done
2141}
2142
2143
2144Prompt() {
2145 echo -en "$1"
2146 read line
2147}
2148
2149
2150ReadLine() {
2151 local i incoming
2152 read incoming
2153 i=0
2154 while [ "$i" -le "32" ] && [ "$incoming" = "" ] ; do
[925]2155 i=$(($i+1))
2156 read incoming
[747]2157 done
2158 echo "$incoming"
2159}
2160
2161
2162SizeOfPartition() {
2163 local devpath drive res stub
2164 device=$1
2165 if [ "`echo "$device" | grep -F "/dev/md"`" != "" ] ; then
[925]2166 res=`SizeOfRaidPartition $device`
2167 [ "$res" = "" ] && Die "Cannot find $device's size - is your /etc/raidtab sane?"
2168 echo "$res"
2169 return 0
[747]2170 fi
[925]2171 # patch from Bill <bill@iwizard.biz> - 2003/08/25
[960]2172 res=`$FDISK -s $device 2>> $LOGFILE`
[925]2173 # end patch
[2448]2174 # take only the first in case of multiple mount (cifs, nfs, ...)
2175 [ "$res" = "" ] && res=`df -k -P -x supermount | tr -s '\t' ' ' | grep -F "$device " | cut -d' ' -f2 | head -1`
[747]2176 [ "$res" = "" ] && res="-1"
2177 echo $res
2178 return 0
2179}
2180
2181
2182SizeOfRaidPartition() {
2183 local real_dev smallest_size silly tmp
2184
2185 silly=999999999
2186 smallest_size=$silly
2187
2188 for real_dev in `GetRaidDevMembers $1` ; do
[925]2189 tmp=`SizeOfPartition $real_dev`
2190 [ "$tmp" -lt "$smallest_size" ] && smallest_size=$tmp
[747]2191 done
2192
2193 if [ "$smallest_size" = "$silly" ] ; then
[925]2194 echo "-1"
2195 return 1
[747]2196 else
[925]2197 echo "$smallest_size"
2198 return 0
[747]2199 fi
2200}
2201
2202
2203StripComments()
2204{
2205 local tempfile
[925]2206
[940]2207 tempfile=$MINDI_TMP/$$.strip.txt
[963]2208 cp -f $1 $tempfile 2>> $LOGFILE
[747]2209 $AWK '{if (substr($0,0,1)!="#" || substr($0,0,3)=="#!/") {print $0;};}' $tempfile > $1
2210 rm -f $tempfile
2211 echo "Stripped comments from $2" >> $LOGFILE
2212}
2213
2214
[925]2215
[747]2216StripExecutable()
2217{
2218 local tmpfile
[925]2219
[940]2220 tmpfile=$MINDI_TMP/stripped.$$.dat
[747]2221 [ -d "$1" ] || [ -h "$1" ] && return
[963]2222 cp -f $1 $tmpfile 2>> $LOGFILE
[747]2223 strip $tmpfile 2> /dev/null
2224 if [ "$?" -eq "0" ] ; then
[963]2225 cp -f $tmpfile $1 2>> $LOGFILE
[925]2226 echo "Stripped binary $2" >> $LOGFILE
[747]2227 fi
2228 rm -f $tmpfile
2229}
2230
[2292]2231KernelVer() {
2232 local fkern_ver fname
[747]2233
[2292]2234 fname=$1
2235 file $fname | grep -q gzip
2236 if [ "$?" -eq "0" ] ; then
2237 # Used by ia64
2238 fkern_ver=`gzip -cd $fname | strings 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2239 else
2240 fkern_ver=`strings $fname 2> /dev/null | grep "[2-9]+*[.][0-9]+*[.][0-9]+*[^\@]*@"`
2241 fi
2242 echo "$fkern_ver"
2243}
2244
2245
[747]2246TryToFindKernelPath() {
2247 local fname incoming res fkern_ver we_want_version possible_kernels noof_kernels kernelpath kdate duff_kernels
[925]2248
[2292]2249 we_want_version=$KERVERRUN
[747]2250 possible_kernels=""
2251 duff_kernels=""
2252
2253 if [ "$ARCH" = "ia64" ] ; then
2254 root="/boot/efi/efi"
2255 else
2256 root="/"
2257 fi
[2681]2258 # See if we're booted from a Xen kernel
2259 if [ -d /proc/sys/xen ]; then
2260 # It's a Xen kernel
2261 KERNEL_IS_XEN="yes"
2262 LogIt "It's a Xen kernel..."
2263 fi
2264
2265 for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/'` ; do
[925]2266 [ ! -e "$fname" ] && continue
[747]2267 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[2292]2268 fkern_ver=`KernelVer $fname`
[747]2269 [ "$fkern_ver" = "" ] && continue
2270 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2271 [ -f "$fname" ] || continue
2272 [ -h "$fname" ] && continue
2273 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2274 file $fname | grep -q gzip
2275 if [ "$?" -eq "0" ] ; then
2276 # Used by ia64
2277 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[963]2278 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2279 duff_kernels="$fname $duff_kernels"
2280 else
[747]2281 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2282 possible_kernels="$fname $possible_kernels"
[925]2283 fi
[747]2284 else
[925]2285 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[963]2286 LogIt "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2287 duff_kernels="$fname $duff_kernels"
2288 else
[747]2289 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2290 possible_kernels="$fname $possible_kernels"
[925]2291 fi
[747]2292 fi
2293 done
2294 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2295 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2296 fi
2297 if [ ! "$possible_kernels" ] ; then
[963]2298 LogIt "No kernel matches exactly. Are there any duff kernels?"
[747]2299 possible_kernels="$duff_kernels"
2300 if [ ! "$possible_kernels" ] ; then
[963]2301 LogIt "Sorry, no duff kernels either"
[747]2302 else
[963]2303 LogIt "I bet you're running Debian or Gentoo, aren't you?"
2304 LogIt "Your kernel doesn't have a sane builddate. Oh well..."
[747]2305 fi
2306 fi
[2681]2307 if [ $KERNEL_IS_XEN = "yes" ]; then
2308 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2309 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2310 FindMboot32Binary
2311 fi
[2829]2312 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2313 noof_kernels=`CountItemsIn "$possible_kernels"`
[747]2314 if [ "$noof_kernels" -eq "0" ] ; then
[963]2315 LogIt "Could not find your kernel."
[925]2316 if [ -e "/boot/vmlinuz" ] ; then
[963]2317 LogIt "Using /boot/vmlinuz as a last resort."
[925]2318 output=/boot/vmlinuz
[747]2319 else
[925]2320 output=""
2321 fi
[747]2322 elif [ "$noof_kernels" -eq "1" ] ; then
2323 kernelpath=`echo "$possible_kernels" | sed s/' '//`
[2292]2324 echo "Your kernel is $kernelpath (v$KERVERRUN)" >> $LOGFILE
[747]2325 output="$kernelpath"
2326 else
2327 for i in $possible_kernels ; do
[2292]2328 if echo $i | grep "$KERVERRUN" ; then
[925]2329 LogIt "OK, I used my initiative and found that "
[2829]2330 LogIt "$i is probably your kernel. "
[925]2331 output="$i"
2332 fi
[747]2333 done
[2681]2334 if [ -n "$output" ]; then
2335 if echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null ; then
2336 output=/boot/vmlinuz
2337 echo "Schlomo, this one's for you." >> $LOGFILE
2338 else
2339 LogIt "Two or more possible kernels found. You may specify any one of them and the "
2340 LogIt "boot disks will still work, probably. If one does not work, try another."
2341 LogIt "$possible_kernels"
2342 echo ""
2343 fi
2344 fi
2345 fi
2346 if [ $KERNEL_IS_XEN = "yes" ]; then
2347 if [ "$noof_xenkernels" -eq "0" ]; then
2348 xenkernelpath=""
2349 elif [ "$noof_xenkernels" -eq "1" ]; then
2350 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
2351 echo "Your Xen kernel is $xenkernelpath (v$KERVERRUN)" >> $LOGFILE
[925]2352 else
[2681]2353 for i in $possible_xenkernels ; do
[2829]2354 if echo $i | grep "$KERVERRUN" ; then
[2681]2355 LogIt "OK, I used my initiative and found that "
[2829]2356 LogIt "$i is probably your Xen kernel. "
[2681]2357 xenkernelpath="$i"
2358 fi
2359 done
2360 if [ -n "$xenkernelpath" ]; then
2361 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2362 if [ ! -n "$new_possible_xenkernels" ]; then
2363 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
2364 LogIt "Using $xenkernelpath"
2365 else
[2829]2366 LogIt "Two or more possible Xen kernels found. You may specify any one of them and the "
[2681]2367 LogIt "boot disks will still work, probably. If one does not work, try another."
[2829]2368 LogIt "$possible_xenkernels"
[2681]2369 echo ""
2370 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
2371 LogIt "Using $xenkernelpath"
2372 fi
2373 fi
[925]2374 fi
[2681]2375 xenkernelname=`basename $xenkernelpath`
2376 if [[ -z "$xenkernelpath" || ! -f "$xenkernelpath" ]]; then
2377 Die "Cannot find Xen kernel $xenkernelpath, aborting"
2378 fi
[747]2379 fi
[2681]2380 echo "$output"
[747]2381}
2382
2383
2384TurnTgzIntoRdz() {
[1983]2385 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]2386
[747]2387 tgz_dir_fname=$1
2388 rdz_fname=$2
[1983]2389 kernelsize=$3
[1885]2390 maxsize=$(($BOOT_SIZE-$kernelsize))
[747]2391 maxsize=$(($maxsize*2)); # to allow for compression of 50%
[940]2392 tempfile=$MINDI_TMP/temp.rd
2393 mountpoint=$MINDI_TMP/mnt1
[747]2394 res=0
2395 echo -en "..."
2396 dd if=/dev/zero of=$tempfile bs=1k count=$ramdisk_size &> /dev/null || Die "Not enough room for temporary ramdisk (TurnTgzIntoRdz)"
2397 echo -en "..."
[1764]2398 echo "Creating ext2 filesystem on $tempfile" >> $LOGFILE
2399 mke2fs -b 1024 -m 1 -i 2048 -F $tempfile >> $LOGFILE 2>> $LOGFILE || Die "Unable to create an ext2 file system on $tempfile"
[747]2400 echo -en "..."
2401 mkdir -p $mountpoint
2402 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."
2403 echo -en "..."
2404 old_pwd=`pwd`
[2712]2405 cd "$mountpoint"
[2034]2406
2407 # AL04Oct08: Check whether /lib64 is a link and if so explicitly create one in rootfs
[2042]2408 if [ -h "/lib64" ]; then
2409 mkdir -p lib || LogIt "Unable to create lib in $mountpoint."
2410 ln -s lib lib64 || LogIt "/lib64 is a symbolic link, but I couldn't create it in $mountpoint."
2411 fi
[2034]2412
[959]2413 cp -Rdf $tgz_dir_fname/* . 2>&1 >> $LOGFILE
[747]2414 tar -zxf symlinks.tgz || Die "Cannot untar symlinks.tgz"
[1914]2415
[747]2416 cd dev || Die "Can't cd to dev"
2417 tar -zxf dev-entries.tgz || Die "Cannot untar dev-entries.tgz"
2418 rm -f dev-entries.tgz
2419 cd ..
2420
2421 for w in insmod.static insmod.static.old ; do
[925]2422 s=`which $w 2> /dev/null`
2423 if [ -e "$s" ] ; then
[2156]2424 tar cf - -C / $s 2> /dev/null | tar xf -
[925]2425 fi
[747]2426 done
2427
2428 [ -e "/dev/.devfsd" ] && echo "/dev/.devfsd found" > tmp/USE-DEVFS
[1724]2429
[1882]2430 # Handle the case where busybox and mount are dynamically linked
[1786]2431 file $MINDI_LIB/rootfs/bin/busybox 2>&1 | grep -q "dynamically"
2432 if [ $? -eq 0 ]; then
[1927]2433 # We want to use the real mount and all the supported variants (nfs, cifs, ...)
2434 rm -f bin/mount $MINDI_TMP/busy.lis
[2440]2435 mountlis=`grep -E "mount|fuse|ssh" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2 | sort -u`
[2438]2436 LocateDeps $MINDI_LIB/rootfs/bin/busybox $mountlis >> $MINDI_TMP/busy.lis
2437 # Special for libs
[2440]2438 for f in `grep -E "libnss" $DEPLIST_FILE $DEPLIST_DIR/* | grep -v " *#.*" | cut -d: -f2`; do
[2438]2439 echo "`ReadAllLink $f`" >> $MINDI_TMP/busy.lis
[1927]2440 done
[2438]2441 # Initial / are trucated by tar
[2166]2442 tar cf - $mountlis `sort -u $MINDI_TMP/busy.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in mount analysis" $MINDI_TMP/$$.log
[1786]2443 rm -f $MINDI_TMP/busy.lis
2444 fi
2445
[2438]2446 # Copy of files mandatory for ssh to automate mount if sshfs is used
2447 mkdir $mountpoint/.ssh
[2439]2448 cp -rp ~root/.ssh/*.pub ~root/.ssh/config ~root/.ssh/known* $mountpoint/.ssh 2> /dev/null
[2438]2449 echo > $mountpoint/tmp/myssh << EOF
2450ssh -o StrictHostKeyChecking=no $*
2451EOF
2452 chmod 755 $mountpoint/tmp/myssh
2453
[2039]2454 # Copy of files mandatory for ld.so
[2042]2455 cp -rp /etc/ld.so.c* $mountpoint/etc
[2039]2456
[2164]2457 # Avoid an issue on some distro (RHEL5)
2458 rm -f $mountpoint/etc/ld.so.conf.d/kernelcap*
2459
[1914]2460 mkdir -p $mountpoint/tmp
[1724]2461 # Management of udev (which includes modprobe in rules)
[1759]2462 ps auxww | grep -v grep | grep -qw udevd
[1716]2463 if [ $? -eq 0 ]; then
[1914]2464 echo "udev device manager found" > $mountpoint/tmp/USE-UDEV
[1759]2465 LogIt "udev device manager found"
[2166]2466 tar cf - -C / /etc/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /etc/udev analysis" $MINDI_TMP/$$.log
[1790]2467 # This avoids NIC remapping if on another machine at restore time on Debian at least
[2145]2468 rm -f ./etc/udev/rules.d/z[0-9][0-9]_persistent-net.rules
2469 # This avoids NIC remapping if on another machine at restore time on Ubuntu at least
2470 rm -f ./etc/udev/rules.d/[0-9][0-9]-persistent-net.rules
[2166]2471 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
[1720]2472 if [ -x /sbin/udevd ]; then
[1781]2473 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2474 lis=""
2475 # Get only the files which exist in that list
[1815]2476 # and potentially their symlink structure
[1781]2477 for i in $lis2; do
[1815]2478 if [ -h $i ]; then
2479 j=$i
2480 while [ -h $j ]; do
2481 lis="$lis $j"
2482 j=`readlink $j`
2483 done
2484 lis="$lis $j"
2485 elif [ -f $i ]; then
[1781]2486 lis="$lis $i"
2487 fi
2488 done
2489 # And their deps
[1759]2490 LocateDeps $lis > $MINDI_TMP/udev.lis
2491 for i in $lis; do
2492 if [ "`echo $i | cut -c1`" = "/" ]; then
2493 j=`echo $i | cut -c2-`
[1998]2494 [ "$j" != "" ] && rm -f $j
[1759]2495 fi
2496 done
[2166]2497 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]2498 rm -f $MINDI_TMP/udev.lis
[1720]2499 else
2500 echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
[1724]2501 echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
[1914]2502 rm -f $mountpoint/tmp/USE-UDEV
[1720]2503 fi
[1716]2504 fi
[1786]2505
[1761]2506 # Management of potential HW info (Proliant only at the moment)
[1880]2507 rm -rf $MINDI_CACHE/bkphw
2508 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2509 if [ -d $MINDI_CACHE/bkphw ]; then
[1761]2510 LogIt "Hardware Information found and saved ..."
[1880]2511 cp -rp $MINDI_CACHE/bkphw .
2512 if [ -f $MINDI_CACHE/tools.files ]; then
2513 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
[1863]2514 LocateDeps $lis > $MINDI_TMP/tools.lis
[2166]2515 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]2516 fi
[1880]2517 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2518 mv -f $MINDI_CACHE/mindi-rsthw .
[1761]2519 chmod 755 ./mindi-rsthw
2520 fi
[1880]2521 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
[1761]2522 fi
2523
[2183]2524 # Management of perl scripts delivered needed at restore time
2525 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2526 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2527
[1885]2528 for w in cdrom groovy-stuff ; do
[747]2529 mkdir -p mnt/$w
2530 done
2531
[2166]2532 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]2533
[2712]2534 cd "$old_pwd"
[747]2535 echo -en "..."
2536 old_pwd=`pwd`
2537 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[2712]2538 cd "$MINDI_TMP"
[1885]2539 needed_modules_path=lib/modules/$FAILSAFE_KVER
[747]2540 else
2541 cd /
2542 if [ "${kernelname}" != "" ]
2543 then
[1885]2544 needed_modules_path=lib/modules/${kernelname}
[747]2545 else
[2292]2546 needed_modules_path=lib/modules/$KERVERRUN
[747]2547 fi
2548 fi
[1885]2549
2550 needed_modules=""
[1993]2551 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
[1885]2552
[2380]2553 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[747]2554 # For PXE boot
2555 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2556 fi
[1715]2557 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2558 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2559 fi
[1727]2560 for i in $DENY_MODS; do
2561 echo "Removing $i from the list of modules to load" >> $LOGFILE
2562 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2563 done
2564
[1885]2565 [ -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]2566 for i in $list_of_groovy_mods ; do
[1885]2567 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
[747]2568 done
[1914]2569
[2600]2570 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
[747]2571 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2572 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[747]2573 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
[2712]2574 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
[1914]2575 # Uncompress modules if not using udev and native modprobe
[1815]2576 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2577 if [ "`echo "$i" | grep -F ".gz"`" ]; then
[1914]2578 echo "Uncompressing $i" >> $LOGFILE
[1727]2579 gunzip -f $mountpoint/$i
[1815]2580 fi
[1727]2581 fi
[747]2582 done
[1815]2583
2584 # Also copy modules.dep in case of udev so that normal modprobe works
[2712]2585 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]2586
[2680]2587 # Copy FW in case some drivers needs it
2588 if [ -d "/lib/firmware" ]; then
2589 cp -rp /lib/firmware $mountpoint/lib
2590 fi
2591
[1885]2592 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
[747]2593 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2594 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2595 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2596 rm -f $mountpoint/sbin/devfsd
2597 fi
[2712]2598 cd "$old_pwd"
[747]2599 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2600 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2601 rm -f $mountpoint/zero
[1885]2602 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2603 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[2092]2604 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2605 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
[747]2606 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2607 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2608 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2609 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[747]2610 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2611 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2612 fi
2613 mkdir -p $mountpoint/proc
[2438]2614 echo "---------------------------" >> $LOGFILE
2615 echo "Content of initial ramdisk:" >> $LOGFILE
2616 echo "---------------------------" >> $LOGFILE
[2712]2617 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
[2438]2618 echo "---------------------------" >> $LOGFILE
2619
[1230]2620 # Determine what filesystem to use for initrd image
2621 echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2622 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2623 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
[2390]2624 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
[1230]2625 # say what will be used
[2390]2626 echo "Creating an $gvFileSystem initrd image..." >> $LOGFILE
[1230]2627 # kernel expects linuxrc in ext2 filesystem
[2712]2628 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
[1230]2629 # unmount loop filesystem and create image file using the standard approach
2630 umount $mountpoint || Die "Cannot unmount $tempfile"
[1764]2631 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
[1794]2632 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
[2564]2633 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
[1799]2634 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
[1764]2635 rm -f ${rdz_fname}.tmp
[1230]2636 # log that we are done
[1821]2637 echo "...done." >> $LOGFILE
[2390]2638 elif [ "$gvFileSystem" = "initramfs" ]; then
[1230]2639 # say what will be used
[1821]2640 echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
[1230]2641 # make sure that cpio is there
2642 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2643 # go into filesystem
[2712]2644 cd "$mountpoint"
[1230]2645 # kernel expects init in cpio filesystem
2646 ln -sf sbin/init init
2647 # create cpio image file and unmount loop filesystem
[1929]2648 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
[2712]2649 cd "$old_pwd"
[1230]2650 umount $mountpoint || Die "Cannot unmount $tempfile"
2651 # log that we are done
2652 echo "...done." >> $LOGFILE
[2390]2653 else
[1230]2654 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
[2390]2655 fi
2656
[747]2657 if [ "$res" -eq "0" ] ; then
2658 echo -en "..."
2659 else
2660 echo -en "\rMade an rdz WITH ERRORS. \n"
2661 fi
2662 return 0
2663}
2664
2665
2666##############################################################################
[1021]2667#----------------------------------- Main -----------------------------------#
[747]2668##############################################################################
2669
[1885]2670# Now we can create what we need
2671mkdir -p $MINDI_TMP
[747]2672
[1885]2673# Purge from potential old run
2674if [ _"$MINDI_CACHE" = _"" ]; then
2675 Die "MINDI_CACHE undefined"
2676fi
2677
2678if [ "$1" = "--printvar" ] ; then
2679 shift
2680 if [ _"$1" != _"" ] ; then
2681 set | grep -Ew "^$1" | cut -d= -f2
2682 fi
[2183]2683 exit 0
[1885]2684fi
2685
[747]2686> $LOGFILE
2687echo "mindi v$MINDI_VERSION" >> $LOGFILE
2688echo "$ARCH architecture detected" >> $LOGFILE
2689echo "mindi called with the following arguments:" >> $LOGFILE
2690echo "$@" >> $LOGFILE
[800]2691echo "Start date : `date`" >> $LOGFILE
[1684]2692echo "-----------------------------" >> $LOGFILE
[747]2693
2694[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2695
[1010]2696# Log some capital variables
2697[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
[1885]2698echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
[1010]2699echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2700echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2701[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2702echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
[1885]2703if [ -f $MINDI_CONFIG ]; then
2704 echo "-----------------------------" >> $LOGFILE
2705 echo " Mindi configuration file " >> $LOGFILE
2706 echo "-----------------------------" >> $LOGFILE
2707 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2708 echo "-----------------------------" >> $LOGFILE
2709fi
[1010]2710
[1885]2711
[747]2712trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]2713
2714# Sanity checks
2715which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2716which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2717which 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."
2718which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2719if which awk &> /dev/null ; then
2720 if ! which gawk &> /dev/null ; then
2721 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"
2722 fi
2723fi
2724which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
[2222]2725[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
[1010]2726
[2292]2727[ "`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]2728
2729# Update the PATH variable if incomplete
2730if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2731 PATH=$PATH:/sbin:/usr/sbin
2732 export PATH
2733 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2734 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2735 echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2736fi
2737
[1885]2738# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2739if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2740 source $MINDI_LIB/FindDistroFailsafe
2741 # Log kernel image
2742 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2743else
2744 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2745fi
[1010]2746
[1737]2747if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
[1010]2748 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2749fi
2750
[925]2751### BERLIOS
[747]2752### Fix as it's not mandatory on ia64
2753if [ "$ARCH" = "ia64" ] ; then
[1010]2754 if which elilo &> /dev/null ; then
2755 LILO_EXE=elilo
2756 else
[2024]2757 LILO_EXE=`which false 2> /dev/null`
[1010]2758 fi
[747]2759else
2760 FindIsolinuxBinary
2761fi
2762trap "Aborted" SIGTERM
2763DONE="\r\t\t\t\t\t\t\t\tDone. "
2764kernelpath=""
[1010]2765MONDO_ROOT=/var/cache/mondo
[747]2766mkdir -p $MONDO_ROOT
2767
2768if [ -d "/proc/lvm" ]; then
2769 # LVM v1
2770 LVMCMD=""
2771 LVM="v1"
2772elif [ -d "/dev/mapper" ]; then
2773 # LVM v2
2774 LVMCMD="lvm"
2775 LVM="v2"
2776else
2777 LVM="false"
2778fi
[1021]2779echo "LVM set to $LVM" >> $LOGFILE
2780echo "----------" >> $LOGFILE
[1230]2781echo "mount result:" >> $LOGFILE
2782echo "-------------" >> $LOGFILE
2783mount >> $LOGFILE
2784echo "-------------" >> $LOGFILE
[1315]2785if [ -e /etc/raidtab ]; then
2786 echo "-------------" >> $LOGFILE
2787 echo "/etc/raidtab content:" >> $LOGFILE
2788 echo "-------------" >> $LOGFILE
2789 cat /etc/raidtab >> $LOGFILE
2790fi
2791echo "-------------" >> $LOGFILE
[1418]2792echo "cat /proc/cmdline:" >> $LOGFILE
2793echo "-------------" >> $LOGFILE
2794cat /proc/cmdline >> $LOGFILE
2795echo "-------------" >> $LOGFILE
[2014]2796echo "cat /proc/swaps:" >> $LOGFILE
2797echo "-------------" >> $LOGFILE
2798cat /proc/swaps >> $LOGFILE
2799echo "-------------" >> $LOGFILE
[2015]2800echo "cat /proc/partitions:" >> $LOGFILE
2801echo "-------------" >> $LOGFILE
2802cat /proc/partitions >> $LOGFILE
2803echo "-------------" >> $LOGFILE
2804echo "cat /proc/filesystems:" >> $LOGFILE
2805echo "-------------" >> $LOGFILE
2806cat /proc/filesystems >> $LOGFILE
2807echo "-------------" >> $LOGFILE
[1021]2808echo "lsmod result:" >> $LOGFILE
2809echo "-------------" >> $LOGFILE
2810lsmod >> $LOGFILE
[2431]2811MODULES="`cat /proc/modules | $AWK '{print $1}'`"
[1531]2812if [ -x /usr/sbin/esxcfg-module ]; then
[1797]2813 echo "-------------" >> $LOGFILE
[1497]2814 echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2815 echo "-------------" >> $LOGFILE
2816 echo "VMWare modules" >> $LOGFILE
2817 echo "-------------" >> $LOGFILE
[1531]2818 /usr/sbin/esxcfg-module -l >> $LOGFILE
[2431]2819 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
[1497]2820fi
[1851]2821echo "FORCE_MODS:" >> $LOGFILE
[1021]2822echo "-------------" >> $LOGFILE
[1851]2823echo $FORCE_MODS >> $LOGFILE
[1882]2824echo "-------------" >> $LOGFILE
[1851]2825echo "DENY_MODS:" >> $LOGFILE
2826echo "-------------" >> $LOGFILE
2827echo $DENY_MODS >> $LOGFILE
2828echo "-------------" >> $LOGFILE
[1796]2829echo "df result:" >> $LOGFILE
[1785]2830echo "----------" >> $LOGFILE
[1796]2831df -T >> $LOGFILE
[1785]2832echo "-------------" >> $LOGFILE
[1230]2833echo "Liste of extra modules is:" >> $LOGFILE
2834echo "$EXTRA_MODS" >> $LOGFILE
2835echo "-------------" >> $LOGFILE
[747]2836
[1723]2837# Compute libata version
[2649]2838laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
[1723]2839# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]2840if [ "`echo $MODULES | grep libata`" ]; then
[1727]2841 if [ "$laver" = "2" ]; then
[1726]2842 DENY_MODS="$DENY_MODS ide-generic"
[1727]2843 echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
[1726]2844 echo "-------------" >> $LOGFILE
2845 fi
[1723]2846fi
2847
[2457]2848# Check for ISO_CMD command
2849if [ ! -x $ISO_CMD ]; then
2850 echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2851fi
2852
[747]2853FLOPPY_WAS_MOUNTED=""
2854for mtpt in /media/floppy /mnt/floppy /floppy ; do
2855 if mount | grep -w $mtpt &> /dev/null ; then
2856 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2857 umount $mtpt
2858 fi
2859done
2860
[1684]2861#
2862# If we have a USB device we need to store info
2863# and remove it from the parameters line
2864#
[747]2865if [ "$#" -ne "0" ] ; then
[1684]2866 if [ "$1" = "--usb" ] ; then
2867 shift
2868 USBDEVICE=$1
2869 if [ _"$USBDEVICE" = _"" ]; then
2870 Die "No USB device specified"
2871 fi
2872 shift
2873 fi
2874fi
2875
2876if [ "$#" -ne "0" ] ; then
[747]2877 if [ "$1" = "--findkernel" ] ; then
2878 res=`TryToFindKernelPath`
[1336]2879 # Avoids logfile content for mondo
2880 export MONDO_SHARE=""
[747]2881 if [ "$res" = "" ] ; then
[2838]2882 if [ $KERNEL_IS_XEN = "yes" ]; then
2883 echo "$xenkernelpath"
2884 MindiExit 0
2885 else
2886 MindiExit -1
2887 fi
[747]2888 else
2889 echo "$res"
[925]2890 MindiExit 0
[747]2891 fi
[1720]2892 elif [ "$1" = "--locatedeps" ] ; then
2893 [ ! "$2" ] && Die "Please specify the binary to look at"
[2438]2894 LocateDeps $*
[1720]2895 # Avoids logfile content for mondo
2896 export MONDO_SHARE=""
2897 MindiExit $?
[1815]2898 elif [ "$1" = "--readalllink" ] ; then
2899 [ ! "$2" ] && Die "Please specify the binary to look at"
2900 ReadAllLink $2
2901 # Avoids logfile content for mondo
2902 export MONDO_SHARE=""
2903 MindiExit $?
[2731]2904 elif [ "$1" = "--makemessage" ] ; then
2905 MakeMessageFile
2906 MindiExit 0
[747]2907 elif [ "$1" = "--makemountlist" ] ; then
2908 [ ! "$2" ] && Die "Please specify the output file"
2909 MakeMountlist $2
[2432]2910 CheckMountlist $2
[1336]2911 # Avoids logfile content for mondo
2912 export MONDO_SHARE=""
[925]2913 MindiExit $?
2914 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2915 echo "Mindi v$MINDI_VERSION"
[1336]2916 # Avoids logfile content for mondo
2917 export MONDO_SHARE=""
[925]2918 MindiExit 0
[747]2919 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]2920 MONDO_TMP=$2
2921 # Change MINDI_TMP for the one provided by mondo
2922 # So that it can get back the built files
[2153]2923 if [ _"$MONDO_TMP" = _"" ]; then
2924 Die "MONDO_TMP is empty, aborting"
2925 fi
2926 if [ _"$MONDO_TMP" = _"/" ]; then
2927 Die "MONDO_TMP is /, aborting"
2928 fi
[2092]2929 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
[1010]2930 rmdir $MINDI_TMP
[1486]2931 export MINDI_TMP=$MONDO_TMP
[953]2932 mkdir -p $MINDI_TMP
[2238]2933
[1696]2934 # This is the scratch dir in mondo - subdir images
[1880]2935 MINDI_CACHE=$3
[2238]2936
[925]2937 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[2681]2938 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2939
[747]2940###
2941### Sq-Modification...
2942### Attempt to locate kernel specific module path
2943### if module path is found then use it other wise use uname -r to set it...
2944###
[2629]2945 if [ $KERNEL_IS_XEN = "yes" ]; then
2946 LogIt "xenkernelpath = $xenkernelpath"
2947 LogIt "xenkernelname = $xenkernelname"
2948 fi
[2657]2949 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
[747]2950 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
2951 then
[963]2952 LogIt "Module path for ${kernelpath} not found..."
2953 LogIt "using running kernel\'s modules."
[2292]2954 kernelname=$KERVERRUN
[747]2955 fi
[2657]2956 LogIt "kernelname = $kernelname"
2957 LogIt "kernelpath = $kernelpath"
[747]2958###
2959### end of Sq-Modification
2960###
[925]2961 TAPEDEV=$5
2962 TAPESIZE=$6
2963 FILES_IN_FILELIST=$7
2964 USE_LZO=$8
2965 CDRECOVERY=$9
[747]2966 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
2967 IMAGE_DEVS=""
2968 else
2969 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
2970 fi
[925]2971 if [ "${11}" ] ; then
2972 LILO_OPTIONS=""
2973 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
2974 fi
2975 LAST_FILELIST_NUMBER=${12}
[747]2976 ESTIMATED_TOTAL_NOOF_SLICES=${13}
[2564]2977 export MINDI_EXCLUDE_DEVS="${14}"
[747]2978 USE_COMP="${15}"
2979 USE_LILO="${16}"
[925]2980 USE_STAR="${17}"
2981 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]2982 DIFFERENTIAL="${19}"
[998]2983 USE_GZIP="${20}"
2984 NOT_BOOT="${21}"
[747]2985 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]2986 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[747]2987 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[963]2988 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
[1696]2989 # MONDO_ROOT is the real scratchdir
[1880]2990 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
[938]2991 if [ _"$MONDO_ROOT" != _"" ]; then
2992 mkdir -p $MONDO_ROOT
2993 else
2994 Die "MONDO_ROOT is undefined"
2995 fi
[747]2996 else
[925]2997 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
2998 MindiExit -1
[747]2999 fi
3000fi
[2238]3001
3002if [ _"$MINDI_CACHE" != _"" ]; then
3003 rm -rf $MINDI_CACHE/* 2> /dev/null
3004 mkdir -p $MINDI_CACHE
3005fi
3006
[747]3007[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3008
[1684]3009if [ _"$MONDO_SHARE" = _"" ]; then
[963]3010 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3011 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3012 LogIt "BusyBox sources are available from http://www.busybox.net"
[747]3013 LogIt "------------------------------------------------------------------------------"
3014else
[1315]3015 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
[747]3016fi
[1005]3017if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3018 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3019else
3020 LogIt "Unable to find mindi-busybox, please install it"
3021 MindiExit -1
3022fi
[747]3023
3024for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
[2753]3025 modprobe $i >> $LOGFILE 2>> $LOGFILE
[747]3026done
3027
3028KERN_DISK_MADE=""
3029
3030echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3031echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3032echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3033if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[963]3034 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]3035 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3036 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]3037 CheckMountlist $MINDI_TMP/mountlist.txt
[940]3038 mkdir -p $MINDI_TMP/small-all/tmp
[2712]3039 cd "$MINDI_TMP/small-all"
[2092]3040 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]3041 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]3042 sleep 2
[963]3043 LogIt "Done. Exiting."
[925]3044 MindiExit 0
[747]3045fi
3046
[1690]3047if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1684]3048 LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
3049fi
3050
[747]3051if [ "$kernelpath" = "" ] ; then
[1335]3052 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]3053 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3054 read ch
3055 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3056 USE_OWN_KERNEL="yes"
[1809]3057 else
3058 USE_OWN_KERNEL="no"
[747]3059 fi
3060 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]3061 YOUR_KERNEL_SUCKS=""
3062 kernelpath=`TryToFindKernelPath`
3063 if [ "$kernelpath" = "" ] ; then
3064 echo -n "Please enter kernel path : "
3065 read kernelpath
3066 fi
[747]3067 else
[925]3068 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]3069 fi
3070fi
3071if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
[1885]3072 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3073 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3074 source $MINDI_LIB/FindDistroFailsafe
3075 # Log kernel image
3076 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3077 kernelpath="$FAILSAFE_KBIN"
3078 LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
3079 LogIt "The failsafe kernel is $kernelpath.\n"
3080 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3081 LogIt "disks then it may still be a result of a problem with your kernel.\n"
3082 pwd=`pwd`
[2712]3083 cd "$MINDI_TMP"
[1885]3084 mkdir -p lib/modules
3085 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
[2712]3086 cd "$pwd"
[1885]3087 else
3088 kernelpath=$MINDI_LIB/vmlinuz
3089 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3090 LogIt "However, you are still running your kernel. If Mindi fails to create your"
3091 LogIt "disks then it may still be a result of a problem with your kernel."
3092 pwd=`pwd`
[2712]3093 cd "$MINDI_TMP"
[1885]3094 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
[2712]3095 cd "$pwd"
[1885]3096 fi
[747]3097 YOUR_KERNEL_SUCKS="Your kernel sucks"
3098fi
[1880]3099echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
[963]3100[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
[747]3101
[965]3102[ "$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]3103
[1983]3104PrepareDataDiskImages
3105
[747]3106ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3107rds=$(($ramdisk_size-$((ramdisk_size%4096))))
[1983]3108export ramdisk_size=$rds
[747]3109
3110echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
[1567]3111if [ "$ARCH" = "ia64" ] ; then
[1983]3112 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
[1567]3113else
[2073]3114 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
[747]3115fi
3116
3117[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3118...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3119
[1684]3120if [ _"$MONDO_SHARE" = _"" ]; then
[1983]3121 ListImagesForUser
3122 OfferToMakeBootableISO
[1684]3123 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
[1983]3124 OfferToMakeBootableUSB
[1684]3125 fi
[963]3126 LogIt "Finished."
[747]3127elif [ "$TAPEDEV" ] ; then
[2078]3128 if [ "$ARCH" != "ia64" ] ; then
3129 # We need to keep the img file as boot file for ia64 platform
3130 rm -f $MINDI_CACHE/{*img,*iso}
3131 else
3132 rm -f $MINDI_CACHE/*iso
3133 fi
[1898]3134 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3135 OfferToMakeBootableUSB
[1898]3136 fi
[1983]3137 OfferToMakeBootableISO
[1880]3138 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3139 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]3140 else
[925]3141 Die "Cannot find all.tar.gz, to be written to tape"
[747]3142 fi
[1695]3143elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3144 OfferToMakeBootableUSB
[747]3145else
[1983]3146 OfferToMakeBootableISO
[747]3147fi
3148# cleanup
[963]3149LogIt "$FRIENDLY_OUTSTRING"
[747]3150for mtpt in $FLOPPY_WAS_MOUNTED ; do
3151 mount $mtpt
3152done
[925]3153MindiExit 0
Note: See TracBrowser for help on using the repository browser.