source: MondoRescue/branches/3.0/mindi/mindi@ 2919

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