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

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