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

Last change on this file since 2883 was 2883, checked in by Bruno Cornec, 13 years ago
  • Fix #501 by pushing BOOT_SIZE to 36864 for certain Ubuntu cases
  • Property svn:executable set to *
  • Property svn:keywords set to Rev Id
File size: 115.1 KB
RevLine 
[747]1#!/bin/bash
2
3# $Id: mindi 2883 2011-10-07 17:46:01Z 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=""
56xenkernelname=""
[2629]57
[747]58MY_FSTAB=/etc/fstab
59TAPE_MODS="ht st osst ide-tape ide_tape"
[2834]60SCSI_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]61
62# ide-probe-mod
[2857]63IDE_MODS="ide ide-floppy floppy ide-generic ide-detect ide-mod ide-disk ide_disk ide-cd ide_cd ide_cd_mod ide-cd_mod ide-cs ide-core ide_core ide-gd_mod ide_gd_mod edd paride ata_generic ide_pci_generic ata_piix libata dock via82cxxx generic nvidia ahci libahci sata_nv cmd64x pata_amd pata_marvell pata_serverworks pata_sis pata_sil680 pata_jmicron amd74xx sis5513 jmicron sata_promise sata_via serverworks sata_svw blkbk virtio virtio_ring virtio_pci virtio_blk virtio_balloon"
[747]64PCMCIA_MODS="pcmcia_core ds yenta_socket"
[2722]65USB_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]66NET_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]67CDROM_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]68# Those modules will only go on the backup media, not the boot media.
[2861]69EXTRA_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]70# Replace with that line for HP OCMP e.g.
[2073]71#DENY_MODS="MPS_Driver_Mapper mps octtldrv tscttl streams kqemu fdomain"
[1828]72DENY_MODS="kqemu"
[1399]73# Force some modules to be included
[1354]74FORCE_MODS=""
[925]75
[2857]76# Find MBR in case of bootable USB device to build
[2855]77MBRFILE=/usr/lib/syslinux/mbr.bin
[2857]78[ ! -r "$MBRFILE" ] && MBRFILE=/usr/lib64/syslinux/mbr.bin
79[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/syslinux/mbr.bin
80[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib/syslinux/mbr.bin
81[ ! -r "$MBRFILE" ] && MBRFILE=/usr/share/lib64/syslinux/mbr.bin
[2855]82
[747]83LOGFILE=/var/log/mindi.log
[1880]84MINDI_CACHE=/var/cache/mindi
[747]85BOOT_MEDIA_MESSAGE="\
86To format and restore all files automatically, type 'nuke' <enter>.\n\
87To restore some/all files interactively, type 'interactive' <enter>.\n\
88To compare the archives with your filesystem, type 'compare' <enter>.\n\
89To boot to a command-line prompt (expert mode), type 'expert' <enter>.\n\
90You may add one or more of the following parameters as well:-\n\n\
91 donteject - mondorestore will not eject the CD; this is useful if, for\n\
92 instance, your PC's case has a concealed CD-ROM drive\n\
93 noresize - your mountlist will not be adjusted to use your unallocated\n\
94 hard disk space\n\
95 textonly - do not call any Newt library routines; this is unattractive\n\
96 but valuable if you find your Newt library has bugs in it\n\n\
97e.g. Type 'nuke donteject textonly' if you have an unstable Newt library and \n\
98a PC whose CD-ROM drive tray would be damaged if it unexpectedly ejected.\n\
99"
[925]100FDISK=$MINDI_SBIN/parted2fdisk
[747]101
[925]102# Using a config file allow to overwrite some values
103MINDI_CONFIG="$MINDI_CONF/mindi.conf"
104if [ -f $MINDI_CONFIG ]; then
105 . $MINDI_CONFIG
106fi
[1885]107DEPLIST_FILE="$MINDI_CONF/deplist.txt"
[2409]108DEPLIST_DIR="$MINDI_CONF/deplist.d"
109
[1885]110ISO_CMD="/usr/bin/mkisofs"
111ISO_OPT="-J -r -v -p Mindi -publisher http://www.mondorescue.org -A Mindi"
[925]112
[2457]113# Mandriva system e.g. use cdrkit, which uses genisoimage instead of mkisofs.
114# However, they use exactly the same command line parameters, so just
115# use genisoimage if it's available.
116if [ ! -x $ISO_CMD ]; then
117 ISO_CMD=/usr/bin/genisoimage
118fi
119
[2685]120# Last function called before exiting
121# Parameter is exit code value
122# Should be declared here as used immediately below potentialy
123MindiExit() {
124 echo "Mindi $MINDI_VERSION is exiting" >> $LOGFILE
125 echo "End date : `date`" >> $LOGFILE
126 if [ _"$MONDO_SHARE" != _"" ] ; then
127 echo "------------- mindi logfile included -------------------------" >> /var/log/mondoarchive.log
128 cat $LOGFILE >> /var/log/mondoarchive.log
129 echo "--------------------------------------------------------------">> /var/log/mondoarchive.log
130 fi
131
132 cd /
133 sync&
134
135 # Clean temporary files only when standalone mindi
136 if [ _"$MINDI_TMP" != _"$MONDO_TMP" ]; then
137 rm -Rf $MINDI_TMP
138 fi
139 exit $1
140}
141
[2880]142LogOnly() {
[2685]143 echo -e "$1" >> $LOGFILE
144 if [ _"$2" != _"" ]; then
145 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
146 fi
147 rm -f "$2"
148}
149
[2880]150# Function to log on screen only
151LogScreen() {
152 if [ -e /dev/stderr ] ; then
153 echo -e "$1" >> /dev/stderr
154 elif [ -e /usr/bin/logger ] ; then
155 /usr/bin/logger -s $1
156 fi
157}
[2685]158
[2880]159# Function to log in log file only
160LogFile() {
161
162 echo -e "$1" >> $LOGFILE
163 if [ _"$2" != _"" ]; then
164 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
165 fi
166 rm -f "$2"
167}
168
169# Function to log in both screen and logfile
170LogAll() {
171 LogScreen "$1"
172 LogFile "$1" "$2"
173}
174
175# Preserved for compatibility
176LogIt() {
177 LogAll "$1" "$2"
178}
179
180
[2685]181Die() {
182 local i
183 if [ "$1" = "" ] ; then
184 LogIt "FATAL ERROR"
185 else
186 LogIt "FATAL ERROR. $1"
187 fi
188 if [ _"$2" != _"" ]; then
189 grep -Ev "tar: Removing \`/\'" "$2" >> $LOGFILE
190 fi
191 rm -f "$2"
192
193 LogIt "Please e-mail a copy of $LOGFILE to the mailing list."
194 LogIt "See http://www.mondorescue.org for more information."
195 LogIt "WE CANNOT HELP unless you enclose that file.\n"
196 MindiExit -1
197}
198
[1485]199# Now we can create what we need
[2150]200MINDI_TMP=`mktemp -d $TMPDIR/mindi.XXXXXXXXXX`
201if [ $? -ne 0 ]; then
202 df $TMPDIR
203 Die "Unable to create a temporary directory ! Check space on $TMPDIR"
204fi
[2153]205if [ _"$MINDI_TMP" = _"" ]; then
206 Die "MINDI_TMP is empty, aborting"
207fi
208if [ _"$MINDI_TMP" = _"/" ]; then
209 Die "MINDI_TMP is /, aborting"
210fi
[2150]211export MINDI_TMP
[940]212
[747]213# ----------------------------------------------------------------------------
214
215
216AbortHere() {
217 [ "$mountpoint" ] && umount $mountpoint 2>> $LOGFILE
218 Die "Program is terminating in response to signal received from OS/user"
219}
220
221
222Aborted() {
223 trap SIGHUP SIGTERM SIGTRAP SIGINT
[1880]224 [ "$MINDI_CACHE" != "" ] && rm -f $MINDI_CACHE/mindi*img $MINDI_CACHE/*gz $MINDI_CACHE/mindi.iso
[747]225 [ "$minidir_root" != "" ] && rm -Rf $minidir_root/*
226 Die "User abort."
227}
228
229
230AddFileToCfgIfExists() {
231 [ -e "$1" ] && echo -en "$2 `cat $1`\n" >> $3
232}
233
234
235AddKeyboardMappingFile() {
236 local mappath r included_list included_item i res ii sss
237 mappath=$1
238 KBDEPTH=$(($KBDEPTH+1))
239 [ "$KBDEPTH" -gt "128" ] && Die "Edit $MINDI_SBIN/mindi and disable FindAndAddUserKeyboardMappingFile (line 2160, approx.)"
240 if [ -e "$bigdir/$mappath" ] ; then
241 echo "$mappath already added" >> $LOGFILE
242 return
243 elif [ -d "$bigdir/$mappath" ] ; then
244 echo "Cannot add $mappath: it's a directory. Sorry."
245 return
246 fi
247 echo "Added kbd map $mappath" >> $LOGFILE
248 if [ ! -e "$mappath" ] ; then
[1764]249 mappath=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
[747]250 if [ ! -e "$mappath" ] ; then
[963]251 LogIt "Cannot add $mappath: kbd map file not found"
[747]252 return
253 fi
254 else
255 echo -en "`basename $mappath | tr '.' '#' | sed s/#kmap#gz// | sed s/#inc#gz//` " | tr '#' '.'
256 fi
257
258 mkdir -p $bigdir/etc
[2712]259 tar cf - -C / $mappath 2>> $MINDI_TMP/$$.log | (cd "$bigdir" ; tar xf -) || LogIt "AKMF -- Could not copy $mappath to $bigdir" $MINDI_TMP/$$.log
[747]260 if [ "`echo $mappath | grep -F ".gz"`" ] ; then
261 included_list=`gzip -dc $mappath | grep -Fi include | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
262 else
263 included_list=`grep -Fi include $mappath | sed s/'"'// | sed s/'"'// | cut -d' ' -f2`
264 fi
265 for included_item in $included_list ; do
[925]266 if [ ! -e "$included_item" ] ; then
[1764]267 sss=`grep -F "${included_item}.inc" $MINDI_TMP/keymaps.find`
268 [ "$sss" = "" ] && sss=`grep -F "$included_item" $MINDI_TMP/keymaps.find`
[925]269 for ii in $sss ; do
[747]270 [ -e "$ii" ] && AddKeyboardMappingFile $ii
[925]271 done
272 else
273 AddKeyboardMappingFile $included_item
274 fi
[747]275 done
276}
277
278
279CopyDependenciesToDirectory() {
[1989]280 local outdir incoming fname counter d found
[747]281 outdir=$1
282 mkdir -p $outdir
283 incoming=`ReadLine`
284 counter=0
285 while [ "$incoming" != "" ] ; do
[1526]286 # Non absolute file names should not arrive till here => skipped
287 if [ `echo "$incoming" | cut -c1` != '/' ]; then
288 LogIt "Unable to handle $incoming"
289 incoming=`ReadLine`
290 continue
291 fi
292 # no parent directory of incoming should be a link, copy is not possible in that case
293 d=`dirname "$incoming"`
294 found="false"
295 while [ $d != "/" -a $found = "false" ]; do
296 [ -h "$d" ] && found="true"
297 d=`dirname "$d"`
298 done
299 if [ -d "$incoming" ] && [ ! -h "$incoming" ]; then
[747]300 find $incoming/* -maxdepth 0 2> /dev/null | CopyDependenciesToDirectory $outdir
[1526]301 elif [ -e "$incoming" ] && [ $found = "false" ]; then
[2712]302 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]303
304 # Only uncompress modules if not using udevd
305 if [ "`echo "$incoming" | grep "lib/modules/.*\..*o\.gz"`" != "" ] && [ "`ps auxww | grep -v grep | grep -qw udevd`" != "" ]; then
306 gunzip -f $outdir/$incoming || LogIt "Cannot gunzip $outdir/$incoming"
[925]307 fi
[1989]308 [ -x "$outdir" ] && StripExecutable $outdir "-$filename-"
[925]309 counter=$(($counter+1))
310 if [ "$counter" -ge "5" ] ; then
311 counter=0
312 echo -en "."
313 fi
[747]314 fi
315 incoming=`ReadLine`
316 done
317}
318
319
320CountItemsIn() {
321 local r
322 r=0
323 for q in $1 ; do
324 r=$(($r+1))
325 done
326 echo $r
327}
328
329
330DropOptimizedLibraries() {
331 local outdir filelist list_of_optimized_libraries optimized_lib_name vanilla_lib_name reason msg resolved res
332 filelist=$1
333 outdir=$2
334
335 list_of_optimized_libraries=`grep "lib/i[5-7]86/" $filelist`
336 if [ "$list_of_optimized_libraries" = "" ] ; then
[859]337 return 0
[747]338 fi
339 echo -en "Dropping i686-optimized libraries if appropriate"
340 for optimized_lib_name in $list_of_optimized_libraries ; do
[859]341 echo -en "."
342 reason=""
[1483]343 vanilla_lib_name=`echo "$optimized_lib_name" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
[859]344 echo "$vanilla_lib_name" >> $filelist
[2168]345 echo "Adding $vanilla_lib_name to filelist" >> $LOGFILE
[859]346 mkdir -p $outdir$optimized_lib_name > /dev/null 2> /dev/null
347 rmdir $outdir$optimized_lib_name > /dev/null 2> /dev/null
[2168]348
349 # This may return multiple files
350 for resolved in `ReadAllLink $vanilla_lib_name`; do
351 echo "Adding as deps $resolved to filelist" >> $LOGFILE
352 vanilla_resolved_name=`echo "$resolved" | sed -e 's/i[5-7]86//' -e 's/cmov//' -e 's/nosegneg//' | tr -s '/' '/'`
353 mkdir -p $outdir$resolved> /dev/null 2> /dev/null
354 rmdir $outdir$resolved > /dev/null 2> /dev/null
355 ln -sf $vanilla_resolved_name $outdir$resolved
356 echo "Excluding deps $resolved" >> $LOGFILE
357 grep -Fvx "$resolved" "$filelist" > $filelist.tmp
358 echo "Replacing it with $vanilla_resolved_name" >> $LOGFILE
359 echo "$vanilla_resolved_name" >> $filelist.tmp
360 mv -f $filelist.tmp $filelist
361 done
[747]362 done
[925]363 $AWK '{ print $1; }' $filelist | sort -u > $filelist.tmp
[747]364 mv -f $filelist.tmp $filelist
365 echo -e "$DONE"
366}
367
368
369FindAndAddUserKeyboardMappingFile() {
370 local r res mapfile mappath included_item included_list keyfile mp locale
[963]371 LogIt "Analyzing your keyboard's configuration."
[747]372 KEYDIR=/lib/kbd
373 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share/kbd # Slackware
374 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/lib/kbd
375 [ ! -e "$KEYDIR" ] && KEYDIR=/usr/share
[1713]376 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole
377 [ ! -e "$KEYDIR" ] && KEYDIR=/etc/condole-setup
[747]378 if [ ! -e "$KEYDIR" ] ; then
[963]379 LogIt "Keyboard mapping directory not found. I shall use default map at boot-time."
[747]380 return 0
381 fi
382 if [ -e "/etc/sysconfig/keyboard" ] ; then
383 echo "Red Hat-style config detected." >> $LOGFILE
384 keyfile=/etc/sysconfig/keyboard
385 elif [ -e "/etc/rc.d/rc.keymap" ] ; then
386 echo "Slackware-style config detected." >> $LOGFILE
387 keyfile=/etc/rc.d/rc.keymap
388 elif [ -e "/etc/rc.config" ] ; then
389 echo "Debian-style config detected." >> $LOGFILE
390 keyfile=/etc/rc.config
391 elif [ -e "/etc/console/boottime.kmap.gz" ] ; then
392 echo "Debian-style config detected." >> $LOGFILE
393 echo -en "Adding the following keyboard mapping tables: "
394 mkdir -p $bigdir/tmp
395 echo "/etc/console/boottime.kmap.gz" > $bigdir/tmp/KEYMAP-LIVES-HERE
396 KBDEPTH=0
397 mkdir -p $bigdir/etc/console
[963]398 cp /etc/console/boottime.kmap.gz $bigdir/etc/console 2>> $LOGFILE
[2864]399 echo ""
[747]400 echo -e "$DONE"
401 return 0
[2828]402 elif [ -e "/etc/console-setup/boottime.kmap.gz" ] || [ -e "/etc/console-setup/cached.kmap.gz" ] ; then
[1713]403 echo "Ubuntu-style config detected." >> $LOGFILE
404 echo -en "Adding the following keyboard mapping tables: "
405 mkdir -p $bigdir/tmp
[2828]406 if [ -e "/etc/console-setup/boottime.kmap.gz" ] ; then
407 kbdfile="/etc/console-setup/boottime.kmap.gz"
408 else
409 kbdfile="/etc/console-setup/cached.kmap.gz"
410 fi
411 echo $kbdfile > $bigdir/tmp/KEYMAP-LIVES-HERE
[1713]412 KBDEPTH=0
413 mkdir -p $bigdir/etc/console-setup
[2828]414 cp $kbdfile $bigdir/etc/console-setup 2>> $LOGFILE
[2864]415 echo ""
[1713]416 echo -e "$DONE"
417 return 0
[2744]418 elif [ -e "/etc/rc.conf" ] ; then
[2748]419 echo "ArchLinux config detected." >> $LOGFILE
[2744]420 keyfile=/etc/rc.conf
[1465]421 elif [ -e "/etc/conf.d/keymaps" ] ; then
422 echo "Gentoo-style config detected." >> $LOGFILE
423 keyfile=/etc/conf.d/keymaps
[747]424 else
425 echo -en "Searching for rc.config ..."
426 keyfile=`find /etc -name rc.config | head -n1`
427 if [ "$keyfile" = "" ] || [ ! -e "$keyfile" ] ; then
[963]428 LogIt "Unknown config detected. Default keyboard map will be used."
[747]429 return
430 else
431 echo "Found $keyfile" >> $LOGFILE
432 fi
433 fi
434 if [ ! -e "$KEYDIR/keymaps" ] ; then
[963]435 LogIt "Keyboard mapping directory not found. Default keyboard map will be used."
[747]436 return
437 fi
438 echo "keyfile=$keyfile" >> $LOGFILE
439 locale=`grep -F KEYTABLE "$keyfile" | tr -d '"' |cut -d'=' -f2`
440 [ ! "$locale" ] && locale=`grep '.map$' "$keyfile" | sed 's/^.* //'` # Slackware
[2744]441 [ ! "$locale" ] && locale=`grep -E '^KEYMAP=' "$keyfile" | tr -d '"' |cut -d'=' -f2` # Gentoo & ArchLinux
[747]442 echo "locale=$locale" >> $LOGFILE
[1764]443 #
444 # Process the keymaps dir once for all
445 # AddKeyboardMappingFile will use it recursively
446 #
447 find $KEYDIR/keymaps > $MINDI_TMP/keymaps.find
448 mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep -F "/${locale}." | grep -vx " *#.*"`
449 [ ! "$mp" ] && mp=`grep "i[3-8]86" $MINDI_TMP/keymaps.find | grep "$locale[^r][^/]" | grep -vx " *#.*"`
[747]450 # If we have multiple keymaps then log it !!
451 echo "$mp" | grep -q " "
452 if [ $? -eq 0 ]; then
453 echo "WARNING: Multiple keymaps found: $mp" | tee -a $LOGFILE
454 echo "The following one will be used" >> $LOGFILE
455 fi
456 for i in $mp ; do
457 mappath=$i
458 [ -e "$i" ] && [ ! -d "$i" ] && break
459 done
460 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
[1854]461 mappath=$(find / -name "*/kbd/keymaps/*/$locale")
[747]462 fi
463 echo "mappath = $mappath" >> $LOGFILE
464 if [ ! -e "$mappath" ] || [ -d "$mappath" ] ; then
[963]465 LogIt "Keyboard mapping file not found. Default keyboard map will be used."
[747]466 return
467 fi
468 echo -en "Adding the following keyboard mapping tables: "
469 mkdir -p $bigdir/tmp
470 echo "$mappath" > $bigdir/tmp/KEYMAP-LIVES-HERE
[2055]471 KBDEPTH=0
[747]472 AddKeyboardMappingFile $mappath
[2864]473 echo ""
[747]474 echo -e "$DONE"
[1764]475 rm -f $MINDI_TMP/keymaps.find
[747]476 return 0
477}
478
479
[2629]480FindMboot32Binary() {
481 MBOOTC32=/usr/lib/syslinux/mboot.c32
482 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib/syslinux/mboot.c32
483 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/lib64/syslinux/mboot.c32
484 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/syslinux/mboot.c32
485 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib/syslinux/mboot.c32
486 [ ! -e "$MBOOTC32" ] && MBOOTC32=/usr/share/lib64/syslinux/mboot.c32
487 [ ! -e "$MBOOTC32" ] && MBOOTC32=`find / -name mboot.c32 | grep -x "/.*/mboot.c32"`
488 [ ! -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]489 LogFile "Found mboot.c32 at $MBOOTC32"
[2629]490}
491
[747]492FindIsolinuxBinary() {
493 ISOLINUX=/usr/lib/isolinux.bin
494 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib/syslinux/isolinux.bin
[1491]495 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/lib64/syslinux/isolinux.bin
[747]496 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/syslinux/isolinux.bin
497 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib/syslinux/isolinux.bin
[1491]498 [ ! -e "$ISOLINUX" ] && ISOLINUX=/usr/share/lib64/syslinux/isolinux.bin
[1854]499 [ ! -e "$ISOLINUX" ] && ISOLINUX=`find / -name isolinux.bin | grep -x "/.*/isolinux.bin"`
[747]500 [ ! -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'"
501 echo "Found isolinux.bin at $ISOLINUX" >> $LOGFILE
502}
503
504
505FindSpecificModuleInPath() {
506 local modpaths pwd line
507 pwd=`pwd`
508 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[2712]509 cd "$MINDI_TMP"
[747]510 else
511 cd /
512 fi
513 if [ ! -e "$1" ] ; then
[963]514 LogIt "WARNING - cannot search specific path '$1'"
[747]515 return 1
516 fi
[2553]517 # Find all files and links (required for some VMWare VMs)
[2600]518 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]519 echo "$modpaths"
[2712]520 cd "$pwd"
[747]521}
522
523
524GenerateGiantDependencyList() {
525 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
526
527 echo -en "Analyzing dependency requirements"
528 outfile=$1
[940]529 tempfile=$MINDI_TMP/$$.txt
[747]530 incoming=`ReadLine`
531
532 > $tempfile
533 progress=0
534 res=0
535 noof_lines=$2
536 while [ "$incoming" != "" ] ; do
[861]537 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
538 incoming=`ReadLine`
539 continue
540 fi
541 if [ "$incoming" = "LVMFILES:" ] ; then
542 break
543 fi
[747]544 filelist=`GenerateListForFile "$incoming"`
545 r=$?
[963]546 [ "$r" -ne "0" ] && LogIt "$incoming not found"
[747]547 res=$(($res+$r))
[861]548# echo "'$incoming' generates filelist '$filelist'" >> $LOGFILE
[747]549 for fname in $filelist ; do
[861]550 [ "$fname" != "" ] && echo "$fname" >> $tempfile
[747]551 done
552 progress=$(($progress+1))
553 echo -en "\r\t\t\t\t\t\t\t\t"
554 i=$(($progress*100))
555 i=$(($i/$noof_lines))
556 echo -en "$i"
557 echo -en "%"
558 modres=$(($progress%4))
559 [ "$modres" -eq "0" ] && echo -en "\t/"
560 [ "$modres" -eq "1" ] && echo -en "\t-"
561 [ "$modres" -eq "2" ] && echo -en "\t\\"
562 [ "$modres" -eq "3" ] && echo -en "\t|"
563 incoming=`ReadLine`
564 done
[861]565 if [ "$incoming" = "LVMFILES:" ] ; then
566 incoming=`ReadLine`
567 lvmversion=""
568 while [ "$incoming" != "" ] ; do
569 if echo "$incoming" | grep -x " *#.*" &> /dev/null ; then
570 incoming=`ReadLine`
571 continue
572 fi
573 filelist=`GenerateListForFile "$incoming"`
574 for tool in $filelist ; do
575 lvmresolved=`readlink -f $tool`
[1342]576 if [ "$tool" = "$lvmresolved" ]; then
[861]577 echo "$tool" >> $tempfile
578 elif echo "$lvmresolved" | grep "lvmiopversion" &> /dev/null ; then
579 if [ "$lvmversion" = "" ] ; then
580 lvmversion=`$lvmresolved`
581 echo "$lvmresolved" >> $tempfile
582 fi
583 toolstripped=`echo $tool | $AWK -F / '{print $NF;}'`
[1342]584 if [ "$lvmversion" = "200" ]; then
[861]585 # pvdata and lvmcreate_initrd don't exist in LVM2
586 case "$toolstripped" in
587 "pvdata")
588 continue
589 ;;
590 "lvmcreate_initrd")
591 continue
592 ;;
593 esac
594 fi
595 toolpath="/sbin/lvm-"$lvmversion"/"$toolstripped
596 if [ -e "$toolpath" ] ; then
597 echo "$toolpath" >> $tempfile
598 echo "$tool" >> $tempfile
599 else
600 toolpath="/lib/lvm-"$lvmversion"/"$toolstripped
601 fi
602 if [ -e "$toolpath" ] ; then
603 echo "$toolpath" >> $tempfile
604 echo "$tool" >> $tempfile
605 else
606 echo "Where are your LVM-Tools? Couldn't find $tool"
607 fi
608 else
609 echo "$tool" >> $tempfile
610 fi
611 done
612 progress=$(($progress+1))
613 echo -en "\r\t\t\t\t\t\t\t\t"
614 i=$(($progress*100))
615 i=$(($i/$noof_lines))
616 echo -en "$i"
617 echo -en "%"
618 modres=$(($progress%4))
619 [ "$modres" -eq "0" ] && echo -en "\t/"
620 [ "$modres" -eq "1" ] && echo -en "\t-"
621 [ "$modres" -eq "2" ] && echo -en "\t\\"
622 [ "$modres" -eq "3" ] && echo -en "\t|"
623 incoming=`ReadLine`
624 done
[747]625 fi
626 echo -en "$DONE\nMaking complete dependency list"
627
628 tr -s '/' '/' < $tempfile | sort -u > $tempfile.new
629 mv -f $tempfile.new $tempfile
630 > $outfile.pre
631 progress=0
632 noof_lines=`cat $tempfile | wc -l`
[1876]633 echo "---------------------------------" >> $LOGFILE
634 echo "List of dependencies: " >> $LOGFILE
635 echo "---------------------------------" >> $LOGFILE
[747]636 for fname in `cat $tempfile` ; do
[1876]637 echo "$fname" | tee -a $LOGFILE >> $outfile.pre
638 LocateDeps $fname | tee -a $LOGFILE >> $outfile.pre
[925]639 progress=$(($progress+1))
[747]640 echo -en "\r\t\t\t\t\t\t\t\t"
641 i=$(($progress*100))
642 i=$(($i/$noof_lines))
643 echo -en "$i"
644 echo -en "%"
[925]645 modres=$(($progress%4))
[747]646 [ "$modres" -eq "0" ] && echo -en "\t/"
647 [ "$modres" -eq "1" ] && echo -en "\t-"
648 [ "$modres" -eq "2" ] && echo -en "\t\\"
649 [ "$modres" -eq "3" ] && echo -en "\t|"
650 done
[1684]651 if [ _"$MONDO_SHARE" != _"" ]; then
[925]652 mkdir -p $bigdir/tmp
653 mkdir -p $bigdir/sbin
654 mkdir -p $bigdir/bin
[940]655 if [ -e "$MINDI_TMP/post-nuke.tgz" ] ; then
[963]656 LogIt "\nIncorporating post-nuke tarball"
[925]657 old_pwd=`pwd`
[2712]658 cd "$bigdir"
[2166]659 tar -zxf $MINDI_TMP/post-nuke.tgz 2>> $MINDI_TMP/$$.log || LogIt "Error occurred when untarring post-nuke tarball" $MINDI_TMP/$$.log
[2712]660 cd "$old_pwd"
[747]661 fi
[963]662 if cp -f $MINDI_TMP/mondo*restore $bigdir/usr/bin 2>> $LOGFILE ; then
[925]663 LocateDeps $bigdir/usr/bin/mondo*restore >> $outfile.pre
664 else
[963]665 LogIt "Cannot find mondo*restore in mondo's tempdir, $MINDI_TMP"
666 LogIt "I bet you've got a spare copy of Mondo or Mindi floating around on your system."
[925]667 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."
668 Die "Odd."
669 fi
[2092]670 cp -f $MINDI_TMP/BOOTLOADER.* $bigdir 2>> $LOGFILE || LogIt "\nMondo v1.2x defaults to LILO as the bootloader, BTW."
[2380]671 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
672 LogIt "\nIncorporating Network-related settings"
673 for r in NETFS-* ISO-PREFIX ; do
[963]674 cp -f $MINDI_TMP/$r $bigdir/tmp 2>> $LOGFILE || Die "Cannot copy $r - did you run out of disk space?"
[925]675 echo "Copying $r to ramdisk" >> $LOGFILE
676 done
677 fi
[747]678 fi
[925]679 tr ' ' '\n' < $outfile.pre | tr -s '/' '/' | grep -Fvx "" | sort -u | grep -Ev "/libX11|/libXext|/libXi|/libgtk|/libgdk" > $outfile
[747]680 rm -f $tempfile $outfile.pre
681 [ "$res" -eq "0" ] && echo -e "\r\t\t\t\t\t\t\t\t$DONE" || echo "\nFailed."
682 return $res
683}
684
685
686GenerateListForFile() {
687 local files_found loc fname incoming i res
688 incoming="$1"
689 files_found=""
690 res=0
691
692 for fname in $incoming ; do
693 files_found="$files_found `LocateFile $fname`"
694 done
695
696 echo "$files_found" | tr ' ' '\n' | sort -u | tr '\n' ' '
697}
698
699
700# Returns all disk devices which are part of a raid array
701GetAllRaidMembers() {
702 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*device/ if(\$2) {print \$2}" < /etc/raidtab
703}
704
705
706GetFileSizeList() {
707 local i
708 for i in `find $1 -type d -o -print` ; do
709 du -sk $i
710 done
711}
712
713
714GetHomeDir() {
715 local res loc
716 loc=`which $1 2>/dev/null`
717 res=`file $loc | $AWK '{print $NF;}'`
718 dirname $res
719}
720
721
[1230]722# Check kernel filesystem capabilites for accessing initrd image
[2429]723# Could be ext2 FS (old mode) or initramfs (new mode)
[1230]724#
725# Interface definition:
726# param #1: absolute path to kernel image
727GetInitrdFilesystemToUse() {
728
729 # interface test: make sure we have one parameter
730 if [ $# -ne 1 ]; then
731 Die "GetInitrdFilesystemToUse(): Expected 1 parameter, got $#."
732 fi
733
734 # interface parameters
735 local lvKernelImage=$1
736
737 # local constants (filesystem magic strings)
738 local lcMagicCramfs="<3>cramfs: wrong magic"
[2047]739 local lcMagicExt2fs="EXT2-fs: blocksize too small for device."
[2390]740 local lcMagicExt3fs="<3>EXT3-fs: blocksize too small for journal device."
[2311]741 local lcMagicInitfs="<6>checking if image is initramfs...|<6>Unpacking initramfs...|<6>Trying to unpack rootfs image as
742initramfs"
[1230]743
744 # local variables
745 local lvOffset
746 local lvScanRes
747 local lvUseFilesystem
748
749 # say where we are.
[2495]750 echo " GetInitrdFilesystemToUse(): called with parameter: $lvKernelImage" >> $LOGFILE
[1230]751
752 # verify that file exists
753 [ ! -f $lvKernelImage ] && Die "File $lvKernelImage not found. Terminating."
754
[1566]755 # Kernel may be gzip compressed
[1730]756 file $lvKernelImage 2>&1 | grep -q gzip
[1566]757 if [ $? -eq 0 ]; then
[2390]758 lvScanRes=`gzip -cd $lvKernelImage | strings | grep -E "$lcMagicCramfs|$lcMagicExt2fs|$lcMagicExt3fs|$lcMagicInitfs"`
[2429]759
760 # determine which filesystem to use for initrd image: ext2|3fs, gzip'ed cpio (initramfs) or cramfs
761 if [ `echo $lvScanRes | grep -Ec "$lcMagicExt2fs"` -eq 1 ]; then
762 lvUseFilesystem="ext2fs"
763 elif [ `echo $lvScanRes | grep -Ec "$lcMagicExt3fs"` -eq 1 ]; then
764 lvUseFilesystem="ext3fs"
765 elif [ `echo $lvScanRes | grep -Ec "$lcMagicInitfs"` -eq 1 ]; then
766 lvUseFilesystem="initramfs"
767 elif [ `echo $lvScanRes | grep -Ec "$lcMagicCramfs"` -eq 1 ]; then
768 lvUseFilesystem="cramfs"
[2393]769 else
[2429]770 lvUseFilesystem="UNSUPPORTED"
[2393]771 fi
772
[2429]773 else
774 # In that case, we are after 2.6.30 and use the supported initramfs
[1230]775 lvUseFilesystem="initramfs"
776 fi
777 # say what we are using
[2429]778 echo " GetInitrdFilesystemToUse(): Filesytem to use for initial ram disk is $lvUseFilesystem.\n" >> $LOGFILE
[1230]779
780 # return file system to use
781 echo "$lvUseFilesystem"
782
783}
784
[747]785# Searches parent raid device of given disk device
786# $1: disk device (i.e. /dev/hda1)
787GetParentRaidDev() {
788 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {dev=\$2} /^[[:space:]]*device/ {if(\$2==\"$1\") {print dev; exit}}" < /etc/raidtab
789}
790
791
792# Searches members of raid device
793# $1: raid device (/dev/md...)
794GetRaidDevMembers() {
795 $AWK "/^[[:space:]]*#/ {next} /^[[:space:]]*raiddev/ {if(dev) exit; if(\$2 == \"$1\") dev=\$2} /^[[:space:]]*device/ {if(dev) {print \$2}}" < /etc/raidtab
796}
797
798
799HackPathsToFailsafe() {
[2292]800 local incoming newpath stub i pwd
[747]801 incoming=`ReadLine`
802 pwd=`pwd`
[2712]803 cd "$MINDI_TMP"
[747]804 while [ "$incoming" != "" ] ; do
[925]805 stub=`basename $incoming`
806 newpath=`FindSpecificModuleInPath lib/modules/$FAILSAFE_KVER $stub`
807 for i in $newpath ; do
808 echo "$i"
809 done
810 read incoming
[747]811 done
[2712]812 cd "$pwd"
[747]813}
814
815
816ListAllPartitions() {
817 local res currline partition all_partitions ap_orig remaining i j
818
[2070]819 grep -Evx " *#.*| *none.*" $MY_FSTAB | $AWK '/^\/dev\/[imhs]d||^LABEL=\/|^UUID=/ && !/\/fdd|\/cdr|\/zip|\/floppy/ {print $1}'
[747]820 [ -e "/etc/raidtab" ] && $AWK '/^ *device/ {print $2}' /etc/raidtab
[1824]821 if [ -e "/vmfs/volumes" ]; then
822 # For VMWare ESX 3 get the device names of these volumes
[2431]823 vdf -P | grep -E '/vmfs/volumes' | $AWK '{print $1}'
[1824]824 fi
[747]825 return
826}
827
828
829ListImagesForUser() {
830 local path fname
[1983]831 path=$MINDI_CACHE
[747]832 echo -en "In the directory '$path' you will find the images:-\n"
833 for fname in `ls $path | grep -F mindi-` ; do
834 printf "%19s " $fname
835 done
836 echo " "
837}
838
839
840ListKernelModulePaths() {
[2583]841 local module_list module fname r kern
[1399]842 module_list="$MODULES"
[1230]843 # Remove unwanted modules from list
844 for i in $DENY_MODS; do
845 module_list=`echo ${module_list} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
[1726]846 EXTRA_MODS=`echo ${EXTRA_MODS} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
[1230]847 done
[747]848###
849### Sq-Modification ... Use kernelname for module search path if specified
850###
851 if [ "${kernelname}" != "" -a "${kernelname}" != "FAILSAFE" ]
852 then
853 kern=${kernelname}
854 else
[2292]855 kern="$KERVERRUN"
[747]856 fi
[2292]857 export KERVER=$kern
[747]858###
859### Sq-Mod End
860###
[2471]861 # Get rid of duplicates, so that if a live kernel module also appears
862 # in $EXTRA_MODS that it won't get reported as "live module file not found" twice.
863 for module in `echo $module_list $EXTRA_MODS | tr ' ' '\n' | sort -u` ; do
[747]864 r=`find /lib/modules/$kern -type f | grep "/${module}\..*o" | tail -n1`
[2471]865 if [ -z "$r" ]; then
866 if [ "`echo "$MODULES" | grep -w $module`" ]; then
867 r="[live module file not found]"
868 else
869 r="[extra module file not found]"
870 fi
[2583]871 else
872 [ -f "$r" ] && echo "$r"
[2471]873 fi
[747]874 echo "module $module --> $r" >> $LOGFILE
875 done
876 find /lib/modules/$kern/modules.* -type f 2> /dev/null
877}
878
[1784]879#
880# Critical function which computes all dependencies (dyn. lib.)
881# for a list of binaries
882#
[747]883LocateDeps() {
884 local incoming fname deps
[1724]885 incoming="$*"
[747]886 for fname in $incoming ; do
887 if [ ! -e "$fname" ] ; then
[963]888 echo "WARNING - $fname does not exist; cannot be LDD'd." >> $LOGFILE
[747]889 if echo $fname | grep lvm &> /dev/null ; then
890 echo "This warning only affects you if you are using LVM." >> $LOGFILE
[1399]891 if echo "$MODULES" | grep lvm &> /dev/null ; then
[747]892 echo "I think you are, so please take heed!" >> $LOGFILE
893 else
894 echo "I don't think you are, so don't worry about it." >> $LOGFILE
895 fi
896 fi
897 elif [ -h "$fname" ] && [ -x "$fname" ] ; then
898 echo "$fname is softlink" >> $LOGFILE
899 else
[1526]900 ldd $fname 2> /dev/null | ProcessLDD
[747]901 fi
902 done
903}
904
[925]905
[860]906# Give all symlinks recursively of a full path name
907ReadAllLink() {
908 file="$1"
[747]909
[2174]910 echo $file | grep -q '\.\./'
[2175]911 if [ $? -eq 0 ]; then
[2174]912 # We need to normalise the path with .. in it
913 file=`echo $file | perl -pi -e 's|([^/]+)/([^/]+)/\.\./([^/]+)|$1/$3|'`
914 fi
[1883]915 echo "$file"
[860]916 if [ ! -h $file ]; then
917 return 0
918 fi
[747]919
[1883]920 link=`readlink $file`
[862]921 d=`dirname $file`
[1883]922 fchar=`echo $link | cut -c1`
923 # If mother dir is a link print it
[1230]924 if [ -h "$d" ]; then
[1784]925 echo "$d"
[1883]926 d=`readlink $d`
927 fi
928 if [ "$fchar" != "/" ]; then
929 # Relative or local link
930 ReadAllLink "$d/$link"
[860]931 else
[1883]932 # Absolute path
933 ReadAllLink $link
[1230]934 fi
[860]935}
936
[925]937
[747]938LocateFile() {
939 local i path fname_to_find location output resolved tmp stub cache_id loclist
940 fname_to_find="$1"
[1526]941 # It's an absolute path
[747]942 if echo "$fname_to_find" | grep -x "/.*" ; then
[859]943 output="$fname_to_find"
[860]944 if [ -h "$output" ] ; then
945 output="`ReadAllLink $output` $output"
946 fi
[859]947 echo "$output"
948 return 0
[747]949 fi
[1526]950 # It's not an absolute path
[747]951 output=""
[1526]952 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
953 #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
954 [ -h "$path" ] && continue
955 [ ! -e "$path/$fname_to_find" ] && continue
956 output="$path/$fname_to_find $output"
957 if [ -h "$path/$fname_to_find" ] ; then
958 output="`ReadAllLink $path/$fname_to_find` $output"
959 fi
[747]960 done
961 if [ "$output" = "" ] ; then
[860]962 return 1
[747]963 fi
964 echo "$output"
965 return 0
966}
967
968
969# Called by TurnTgzIntoRdz, to make /tmp/mondo-restore.cfg
970MakeMondoConfigFile() {
971 local outfile use_lzo use_comp use_star
972 outfile=$1
973 > $outfile
974 [ "$TAPESIZE" ] && echo "media-size $TAPESIZE" >> $outfile
975 [ "$TAPEDEV" ] && echo "media-dev $TAPEDEV" >> $outfile
[1698]976 [ "$USBDEVICE" ] && echo "usb-dev $USBDEVICE" >> $outfile
[747]977 [ "$FILES_IN_FILELIST" ] && echo "files-in-filelist $FILES_IN_FILELIST" >> $outfile
978 [ "$LAST_FILELIST_NUMBER" ] && echo "last-filelist-number $LAST_FILELIST_NUMBER" >> $outfile
979 [ "$INTERNAL_TAPE_BLOCK_SIZE" ] && echo "internal-tape-block-size $INTERNAL_TAPE_BLOCK_SIZE" >> $outfile
980 use_lzo=$USE_LZO; [ "$use_lzo" = "" ] && use_lzo="no"
[998]981 use_gzip=$USE_GZIP; [ "$use_gzip" = "" ] && use_gzip="no"
[747]982 use_comp=$USE_COMP; [ "$use_comp" = "" ] && use_comp="yes"
983 use_star=$USE_STAR; [ "$use_star" = "" ] && use_star="no"
984 echo "use-lzo $use_lzo" >> $outfile
[998]985 echo "use-gzip $use_gzip" >> $outfile
[747]986 echo "use-star $use_star" >> $outfile
987 echo "use-comp $use_comp" >> $outfile
988 echo "datestamp `date`" >> $outfile
989 [ "$ESTIMATED_TOTAL_NOOF_SLICES" ] && echo "total-slices $ESTIMATED_TOTAL_NOOF_SLICES" >> $outfile
[2380]990 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-IPADDR netfs-client-ipaddr $outfile
991 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-NETMASK netfs-client-netmask $outfile
992 AddFileToCfgIfExists $MINDI_TMP/NETFS-CLIENT-BROADCAST netfs-client-broadcast $outfile
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() {
1028 local scratchdir mountlist all_partitions current_partition \
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
1039# scratchdir, mountlist(OUT)
[940]1040 scratchdir=$MINDI_TMP
[747]1041 mountlist=$1
1042
1043# NB: partition = device
1044# NB: mountpt = where the device is mounted
1045
1046 [ -e "$MY_FSTAB" ] || Die "Cannot find your fstab file ($MY_FSTAB)"
1047
[1684]1048 [ "$mountlist" != "" ] && rm -Rf $mountlist
[747]1049 > $mountlist
1050 all_partitions=""
1051
1052 if [ $LVM != "false" ]; then
[1885]1053 echo -en "Analyzing LVM...\n"
[968]1054 $MINDI_LIB/analyze-my-lvm > $MINDI_TMP/lvm.res
[971]1055 if [ $? -ne 0 ]; then
[963]1056 LVM="false"
1057 fi
[2536]1058 # Excluded LVs and GVs are not reported here
[2424]1059 all_partitions=`cat $MINDI_TMP/lvm.res | grep -F ">>>" | cut -d' ' -f2-`
[747]1060 fi
1061 all_partitions="$all_partitions `ListAllPartitions 2> /dev/null`"
1062 for i in $IMAGE_DEVS ; do
1063 mount | grep -F "$i " > /dev/null 2> /dev/null && Die "Sorry, $i is already mounted! CANNOT DO IMAGEDEV on it if it's mounted."
1064 done
1065 [ "$IMAGE_DEVS" != "" ] && all_partitions="`echo "$all_partitions $IMAGE_DEVS" | tr ' ' '\n' | sort -u | tr '\n ' ' '`"
[1755]1066 printf " %-15s %-15s %-15s %-15s %-15s\n" DEVICE MOUNTPOINT FORMAT "SIZE (MB)" LABEL/UUID | tee -a $LOGFILE
[747]1067 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"
1068 for c_p in $all_partitions ; do
[2452]1069 # Skip evices, network FS, cisf
1070 [ "`echo "$useless_dev" | grep -F "$c_p"`" != "" ] || [ "`echo "$c_p" | grep ":"`" != "" ] || [ "`echo "$c_p" | grep -E "^//"`" != "" ]&& continue
[747]1071 [ "`echo "$c_p" | grep -x "/dev/cdroms.*"`" ] && continue
1072 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]1073 current_partition=`readlink -f $c_p`
[747]1074 [ "`echo "$current_partition" | grep -F "/dev/mapper"`" != "" ] && current_partition="$c_p"
1075 [ "`echo "$useless_dev" | grep -F "$current_partition"`" ] && continue
1076 else
1077 current_partition="$c_p"
1078 fi
1079 [ "$c_p" = "none" ] && continue
[2193]1080 # Debian 5 does that
1081 [ "$c_p" = "proc" ] && continue
[747]1082 redhat_label=""
[1831]1083 label=""
[957]1084 uuid=""
[861]1085 absolute_partition=`readlink -f $c_p`
[747]1086 partition_mountpt=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $2}' | head -n1`
1087
1088 # Detects noauto partitions not mounted and exclude them
1089 partition_option=`tr -s '\t' ' ' < $MY_FSTAB | /bin/grep -w "$current_partition" | /bin/grep -vx " *#.*" | $AWK '{print $4}' | head -n1`
1090 if [ "`echo "$partition_option" | grep -i noauto`" != "" ] && [ "`mount | grep -w "$partition_mountpt"`" = "" ] ; then
1091 continue
1092 fi
1093
[1986]1094 # set default in case we dont't find it
1095 str_to_find_fmt_with=$current_partition
1096
[747]1097 # This part tries to retrieve the correct device from a LABEL line in /etc/fstab
1098 # current_partition contains only first column of /etc/fstab
1099 if [ "`echo "$current_partition" | /bin/grep -i "LABEL="`" != "" ]; then
[980]1100 redhat_label=`echo "$current_partition" | cut -d'=' -f2`
[747]1101 actual_dev=""
[853]1102
1103 # 1st try, findfs - the RHEL way of finding labels and their partitions
1104 if [ -x "/sbin/findfs" ]; then
[2847]1105 actual_dev=`/sbin/findfs LABEL="${redhat_label}" 2> /dev/null`
[853]1106 fi
[747]1107
[853]1108 # 2nd try : blkid, the good way for all LABEL except swap
1109 if [ "x$actual_dev" = "x" -a -x "/sbin/blkid" ]; then
[980]1110 actual_dev=`/sbin/blkid | /bin/grep "$redhat_label" | grep LABEL= | cut -d':' -f1`
[747]1111 # For LVM FS it will give a /dev/dm-# which should then be converted
[748]1112 if [ $LVM = "v2" ] && [ "`echo $actual_dev | grep '/dev/dm'`" ]; then
[963]1113 major=`/bin/ls -l $actual_dev | $AWK '{print $5}'`
1114 minor=`/bin/ls -l $actual_dev | $AWK '{print $6}'`
[747]1115 for dev in `ls /dev/mapper/*`; do
[963]1116 major1=`/bin/ls -l $dev | $AWK '{print $5}'`
1117 minor1=`/bin/ls -l $dev | $AWK '{print $6}'`
[747]1118 if [ $major1 = $major ] && [ $minor1 = $minor ]; then
[963]1119 actual_dev=`/bin/ls -l $dev | $AWK '{print $10}'`
[747]1120 break
1121 fi
1122 done
1123 fi
1124 fi
1125
[853]1126 # 3rd try, which works on a standard partition (ext2/3), but not on swap
[747]1127 # For LVM gives a /dev/mapper entry
1128 if [ "x$actual_dev" = "x" ]; then
[980]1129 actual_dev=`/bin/mount -l | /bin/grep "\[$redhat_label\]" | cut -d' ' -f1`
[747]1130 fi
1131
[853]1132 # 4th try, with vol_id
[747]1133 # SWAP only
1134 if [ "x$actual_dev" = "x" -a -x "/sbin/vol_id" ]; then
[963]1135 list_swaps=`cat /proc/swaps | /bin/grep "/dev/" | $AWK '{ print $1 }' `
[747]1136 for dev_swap in $list_swaps ; do
1137 dev_exists=`/sbin/vol_id $dev_swap | /bin/grep "$redhat_label"`
1138 if [ "x$dev_exists" != "x" ]; then
1139 actual_dev=$dev_swap
1140 break;
1141 fi
1142 done
1143 fi
1144
[853]1145 # 5th try : pre-formated LABEL. Format is : LABEL=SWAP-mydevice or SW-mydevice. e.g. : LABEL=SWAP-hda5
[789]1146 # LABEL=SW-cciss/c0d0p3 (RDP)
[853]1147 # or could be a string that isn't a complete device name (eg. LABEL =SWAP-cciss/c0d0p)
[747]1148 # SWAP only
[789]1149 if [ "x$actual_dev" = "x" -a _"`echo $current_partition | /bin/grep -iE 'LABEL=SWAP|LABEL=SW-'`" != _"" ]; then
[2013]1150 skip=""
[2292]1151 uname=$KERVERRUN
[2013]1152 [ "`echo $uname | grep "2.4.[0-9]"`" != "" ] && skip=16
1153 # 2.6.12 needs 16 (FC3)
1154 [ "`echo $uname | grep "2.6.[0-1]"`" != "" ] && skip=16
1155 # 2.6.19 and upper needs 1052
1156 [ "`echo $uname | grep "2.6.19"`" != "" ] && skip=1052
1157 [ "`echo $uname | grep "2.6.[2-9]"`" != "" ] && skip=1052
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
2305 if [ -d /proc/sys/xen ]; then
2306 # It's a Xen kernel
2307 KERNEL_IS_XEN="yes"
[2880]2308 LogFile "It's a Xen kernel..."
[2681]2309 fi
2310
2311 for fname in `find $root -maxdepth 2 -type f | grep -Ei 'lin|kern|xen' | grep -Ev '^/proc/|^/net/'` ; do
[925]2312 [ ! -e "$fname" ] && continue
[747]2313 [ "$fname" = "/boot/vmlinuz.shipped" ] && [ -f "/boot/vmlinuz" ] && continue; # ignore SuSE's extra kernel
[2292]2314 fkern_ver=`KernelVer $fname`
[747]2315 [ "$fkern_ver" = "" ] && continue
2316 [ "`echo "$fkern_ver" |grep -F "$we_want_version "`" = "" ] && continue
[925]2317 [ -f "$fname" ] || continue
2318 [ -h "$fname" ] && continue
2319 kdate=`uname -v | $AWK '{for(i=1;i<NF;i++){if(index($i,":")){print $i;};};}' | $AWK '{print $NF;}'`
2320 file $fname | grep -q gzip
2321 if [ "$?" -eq "0" ] ; then
2322 # Used by ia64
2323 if [ "`gzip -cd $fname | strings 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2880]2324 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting? Naughty but I'll allow it..."
[925]2325 duff_kernels="$fname $duff_kernels"
2326 else
[747]2327 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2328 possible_kernels="$fname $possible_kernels"
[925]2329 fi
[747]2330 else
[925]2331 if [ "`strings $fname 2> /dev/null | grep -F "$kdate"`" = "" ] ; then
[2880]2332 LogFile "Have you recompiled your kernel \"$fname\" w/o rebooting?\n Naughty but I'll allow it..."
[925]2333 duff_kernels="$fname $duff_kernels"
2334 else
[747]2335 [ "`echo "$fname" | grep -F "vmlinux"`" ] && continue
2336 possible_kernels="$fname $possible_kernels"
[925]2337 fi
[747]2338 fi
2339 done
2340 if [ ! "$possible_kernels" ] && uname -a | grep Knoppix > /dev/null ; then
[925]2341 possible_kernels=`find /boot/vmlinuz-2.* | tail -n1`
[747]2342 fi
2343 if [ ! "$possible_kernels" ] ; then
[2880]2344 LogFile "No kernel matches exactly. Are there any duff kernels?"
[747]2345 possible_kernels="$duff_kernels"
2346 if [ ! "$possible_kernels" ] ; then
[2880]2347 LogFile "Sorry, no duff kernels either"
[747]2348 else
[2880]2349 LogFile "I bet you're running Debian or Gentoo, aren't you?"
2350 LogFile "Your kernel doesn't have a sane builddate. Oh well..."
[747]2351 fi
2352 fi
[2681]2353 if [ $KERNEL_IS_XEN = "yes" ]; then
2354 possible_xenkernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -i "xen" | sort -u | tr '\n' ' '`
2355 noof_xenkernels=`CountItemsIn "$possible_xenkernels"`
2356 FindMboot32Binary
2357 fi
[2829]2358 possible_kernels=`echo "$possible_kernels" | tr -s ' ' '\n' | grep -vi "xen" | sort -u | tr '\n' ' '`
2359 noof_kernels=`CountItemsIn "$possible_kernels"`
[747]2360 if [ "$noof_kernels" -eq "0" ] ; then
[2880]2361 LogFile "Could not find your kernel."
[925]2362 if [ -e "/boot/vmlinuz" ] ; then
[2880]2363 LogFile "Using /boot/vmlinuz as a last resort."
[925]2364 output=/boot/vmlinuz
[747]2365 else
[925]2366 output=""
2367 fi
[747]2368 elif [ "$noof_kernels" -eq "1" ] ; then
[2880]2369 kp=`echo "$possible_kernels" | sed s/' '//`
2370 LogFile "Your kernel is $kp (v$KERVERRUN)"
2371 output="$kp"
[747]2372 else
2373 for i in $possible_kernels ; do
[2880]2374 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2375 LogFile "OK, I used my initiative and found that "
2376 LogFile "$i is probably your kernel. "
[925]2377 output="$i"
[2858]2378 break
[925]2379 fi
[747]2380 done
[2858]2381 if [ ! -n "$output" ]; then
[2880]2382 if [ "`echo " $possible_kernels " | grep -F "/boot/vmlinuz " &> /dev/null`" ]; then
[2681]2383 output=/boot/vmlinuz
[2880]2384 LogFile "Schlomo, this one's for you."
[2681]2385 else
[2880]2386 LogFile "Two or more possible kernels found. You may specify any one of them and the "
2387 LogFile "boot disks will still work, probably. If one does not work, try another."
2388 LogFile "$possible_kernels"
2389 output=""
[2681]2390 fi
2391 fi
2392 fi
2393 if [ $KERNEL_IS_XEN = "yes" ]; then
2394 if [ "$noof_xenkernels" -eq "0" ]; then
2395 xenkernelpath=""
2396 elif [ "$noof_xenkernels" -eq "1" ]; then
2397 xenkernelpath=`echo "$possible_xenkernels" | sed s/' '//`
[2880]2398 LogFile "Your Xen kernel is $xenkernelpath (v$KERVERRUN)"
[925]2399 else
[2681]2400 for i in $possible_xenkernels ; do
[2880]2401 if [ "`echo $i | grep "$KERVERRUN"`" ]; then
2402 LogFile "OK, I used my initiative and found that "
2403 LogFile "$i is probably your Xen kernel. "
[2681]2404 xenkernelpath="$i"
[2858]2405 break
[2681]2406 fi
2407 done
[2858]2408 if [ ! -n "$xenkernelpath" ]; then
[2681]2409 new_possible_xenkernels=`echo "$possible_xenkernels" | tr -s ' ' '\n' | grep -E "^/boot" | sort -u | tr '\n' ' '`
2410 if [ ! -n "$new_possible_xenkernels" ]; then
2411 xenkernelpath=`echo $new_possible_xenkernels | tr -s ' ' '\n' | head -1`
[2880]2412 LogFile "Using $xenkernelpath"
[2681]2413 else
[2880]2414 LogFile "Two or more possible Xen kernels found. You may specify any one of them and the "
2415 LogFile "boot disks will still work, probably. If one does not work, try another."
2416 LogFile "$possible_xenkernels"
2417 output=""
[2681]2418 xenkernelpath=`echo $possible_xenkernels | tr -s ' ' '\n' | head -1`
[2880]2419 LogFile "Using $xenkernelpath"
[2681]2420 fi
2421 fi
[925]2422 fi
[2681]2423 xenkernelname=`basename $xenkernelpath`
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
[2166]2520 tar cf - -C / /lib*/udev 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in /lib/udev analysis" $MINDI_TMP/$$.log
[1720]2521 if [ -x /sbin/udevd ]; then
[1781]2522 lis2=`grep -Ev '^#' $MINDI_CONF/udev.files`
2523 lis=""
2524 # Get only the files which exist in that list
[1815]2525 # and potentially their symlink structure
[1781]2526 for i in $lis2; do
[1815]2527 if [ -h $i ]; then
2528 j=$i
2529 while [ -h $j ]; do
2530 lis="$lis $j"
2531 j=`readlink $j`
2532 done
2533 lis="$lis $j"
2534 elif [ -f $i ]; then
[1781]2535 lis="$lis $i"
2536 fi
2537 done
2538 # And their deps
[1759]2539 LocateDeps $lis > $MINDI_TMP/udev.lis
2540 for i in $lis; do
2541 if [ "`echo $i | cut -c1`" = "/" ]; then
2542 j=`echo $i | cut -c2-`
[1998]2543 [ "$j" != "" ] && rm -f $j
[1759]2544 fi
2545 done
[2166]2546 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]2547 rm -f $MINDI_TMP/udev.lis
[1720]2548 else
2549 echo "udevd daemon not in standard place (/sbin)" 2>&1 | tee -a $LOGFILE
[1724]2550 echo "mindi will use static devices which may cause problems" 2>&1 | tee -a $LOGFILE
[1914]2551 rm -f $mountpoint/tmp/USE-UDEV
[1720]2552 fi
[1716]2553 fi
[1786]2554
[2882]2555 # Management of potential HW info (ProLiant only at the moment)
[1880]2556 rm -rf $MINDI_CACHE/bkphw
2557 mindi-bkphw $MINDI_CACHE $MINDI_CONF | tee -a $LOGFILE
2558 if [ -d $MINDI_CACHE/bkphw ]; then
[1761]2559 LogIt "Hardware Information found and saved ..."
[1880]2560 cp -rp $MINDI_CACHE/bkphw .
2561 if [ -f $MINDI_CACHE/tools.files ]; then
2562 lis=`grep -Ev '^#' $MINDI_CACHE/tools.files`
[1863]2563 LocateDeps $lis > $MINDI_TMP/tools.lis
[2166]2564 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]2565 fi
[1880]2566 if [ -f $MINDI_CACHE/mindi-rsthw ]; then
2567 mv -f $MINDI_CACHE/mindi-rsthw .
[1761]2568 chmod 755 ./mindi-rsthw
2569 fi
[1880]2570 rm -f $MINDI_TMP/tools.lis $MINDI_CACHE/tools.files
[1761]2571 fi
2572
[2183]2573 # Management of perl scripts delivered needed at restore time
2574 mindi-get-perl-modules `cat $MINDI_CONF/perl-scripts` > $MINDI_TMP/perl.lis
2575 tar cf - `cat $MINDI_TMP/perl.lis` 2>> $MINDI_TMP/$$.log | tar xf - || LogIt "Problem in perl scripts analysis" $MINDI_TMP/$$.log
2576
[1885]2577 for w in cdrom groovy-stuff ; do
[747]2578 mkdir -p mnt/$w
2579 done
2580
[2166]2581 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]2582
[2712]2583 cd "$old_pwd"
[747]2584 echo -en "..."
2585 old_pwd=`pwd`
2586 if [ "$YOUR_KERNEL_SUCKS" ] ; then
[2712]2587 cd "$MINDI_TMP"
[1885]2588 needed_modules_path=lib/modules/$FAILSAFE_KVER
[747]2589 else
2590 cd /
2591 if [ "${kernelname}" != "" ]
2592 then
[1885]2593 needed_modules_path=lib/modules/${kernelname}
[747]2594 else
[2292]2595 needed_modules_path=lib/modules/$KERVERRUN
[747]2596 fi
2597 fi
[1885]2598
2599 needed_modules=""
[1993]2600 list_of_groovy_mods="$CDROM_MODS $FORCE_MODS"
[1885]2601
[2380]2602 if [ -e "$MINDI_TMP/NETFS-DEV" ] ; then
[747]2603 # For PXE boot
2604 list_of_groovy_mods="$list_of_groovy_mods $NET_MODS"
2605 fi
[1715]2606 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
2607 list_of_groovy_mods="$list_of_groovy_mods $EXTRA_MODS"
2608 fi
[1727]2609 for i in $DENY_MODS; do
2610 echo "Removing $i from the list of modules to load" >> $LOGFILE
2611 list_of_groovy_mods=`echo ${list_of_groovy_mods} | tr ' ' '\n' | grep -Ev "^${i}$" | tr '\n' ' '`
2612 done
2613
[1885]2614 [ -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]2615 for i in $list_of_groovy_mods ; do
[1885]2616 needed_modules="$needed_modules `FindSpecificModuleInPath $needed_modules_path $i`"
[747]2617 done
[1914]2618
[2600]2619 for i in `echo $needed_modules | tr ' ' '\n' | sort -u`; do
[747]2620 [ -e "$i" ] && s=`du -sk $i | cut -f1` || s=""
[940]2621 [ "$YOUR_KERNEL_SUCKS" ] && i=$MINDI_TMP/$i
[747]2622 echo "Adding $i ($s KB) to the rootfs" >> $LOGFILE
[2712]2623 tar cf - -C / $i 2>> $MINDI_TMP/$$.log | (cd "$mountpoint" ; tar xf -) || LogIt "Unable to copy $i to $mountpoint" $MINDI_TMP/$$.log
[1914]2624 # Uncompress modules if not using udev and native modprobe
[1815]2625 if [ ! -f $mountpoint/tmp/USE-UDEV ]; then
2626 if [ "`echo "$i" | grep -F ".gz"`" ]; then
[1914]2627 echo "Uncompressing $i" >> $LOGFILE
[1727]2628 gunzip -f $mountpoint/$i
[1815]2629 fi
[1727]2630 fi
[747]2631 done
[1815]2632
2633 # Also copy modules.dep in case of udev so that normal modprobe works
[2712]2634 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]2635
[2680]2636 # Copy FW in case some drivers needs it
2637 if [ -d "/lib/firmware" ]; then
2638 cp -rp /lib/firmware $mountpoint/lib
2639 fi
2640
[1885]2641 if [ ! -e "/sbin/devfsd" ] || [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] ; then
[747]2642 echo "Deleting devfsd daemon from ramdisk" >> $LOGFILE
2643 [ ! -e "/sbin/devfsd" ] && echo "...because /sbin/devfsd not found" >> $LOGFILE
2644 [ "$kernelpath" = "$MINDI_LIB/vmlinuz" ] && echo "...because kernel is failsafe" >> $LOGFILE
2645 rm -f $mountpoint/sbin/devfsd
2646 fi
[2712]2647 cd "$old_pwd"
[747]2648 [ "$TAPEDEV" ] && echo -en "$TAPEDEV" > $mountpoint/tmp/TAPEDEV-LIVES-HERE
2649 dd if=/dev/zero of=$mountpoint/zero &> /dev/null
2650 rm -f $mountpoint/zero
[1885]2651 if [ _"$MONDO_SHARE" != _"" ]; then
[747]2652 MakeMondoConfigFile $mountpoint/tmp/mondo-restore.cfg
[2092]2653 cp -f $mountpoint/tmp/mondo-restore.cfg $MINDI_TMP 2>> $LOGFILE || Die "Cannot copy mondo-restore.cfg to ramdisk"
2654 cp -f $MINDI_TMP/mountlist.txt $mountpoint/tmp/ 2>> $LOGFILE || Die "Cannot copy mountlist to ramdisk"
[747]2655 echo -en "$FILES_IN_FILELIST" > $mountpoint/tmp/FILES-IN-FILELIST
2656 echo -en "$LAST_FILELIST_NUMBER" > $mountpoint/tmp/LAST-FILELIST-NUMBER
2657 [ "$USE_LZO" = "yes" ] && echo -en "Pras 4 Pres 2004" >> $mountpoint/tmp/USING-LZO
[998]2658 [ "$USE_GZIP" = "yes" ] && echo -en "YES" >> $mountpoint/tmp/USING-GZIP
[747]2659 [ "$USE_COMP" = "yes" ] && echo -en "Compression, yep" >> $mountpoint/tmp/USING-COMP
2660 [ "$USE_STAR" = "yes" ] && echo -en "Using star. Hooray." >> $mountpoint/tmp/USING-STAR
2661 fi
2662 mkdir -p $mountpoint/proc
[2438]2663 echo "---------------------------" >> $LOGFILE
2664 echo "Content of initial ramdisk:" >> $LOGFILE
2665 echo "---------------------------" >> $LOGFILE
[2712]2666 (cd "$mountpoint" ; ls -Rla ) >> $LOGFILE
[2438]2667 echo "---------------------------" >> $LOGFILE
2668
[1230]2669 # Determine what filesystem to use for initrd image
2670 echo "Call GetInitrdFilesystemToUse() with parameter ${kernelpath} to get filesystem to use for initrd." >> $LOGFILE
2671 gvFileSystem=`GetInitrdFilesystemToUse ${kernelpath}`
2672 [ -z gvFileSystem ] && Die "GetFilesystemToUse() failed. Terminating."
[2390]2673 if [ "$gvFileSystem" = "ext2fs" ] || [ "$gvFileSystem" = "ext3fs" ]; then
[1230]2674 # say what will be used
[2390]2675 echo "Creating an $gvFileSystem initrd image..." >> $LOGFILE
[1230]2676 # kernel expects linuxrc in ext2 filesystem
[2712]2677 ( cd "$mountpoint" && ln -sf sbin/init linuxrc )
[1230]2678 # unmount loop filesystem and create image file using the standard approach
2679 umount $mountpoint || Die "Cannot unmount $tempfile"
[1764]2680 dd if=$tempfile bs=1k 2> /dev/null > ${rdz_fname}.tmp 2> /dev/null
[1794]2681 bs=`tune2fs -l ${rdz_fname}.tmp | grep -E '^Block size:' | cut -d: -f2 | sed 's/^ *//'`
[2564]2682 MINDI_ADDITIONAL_BOOT_PARAMS="$MINDI_ADDITIONAL_BOOT_PARAMS ramdisk_blocksize=$bs"
[1799]2683 gzip -c9 ${rdz_fname}.tmp > $rdz_fname
[1764]2684 rm -f ${rdz_fname}.tmp
[1230]2685 # log that we are done
[1821]2686 echo "...done." >> $LOGFILE
[2390]2687 elif [ "$gvFileSystem" = "initramfs" ]; then
[1230]2688 # say what will be used
[1821]2689 echo "Creating a gzip'ed cpio (AKA initramfs) initrd image..." >> $LOGFILE
[1230]2690 # make sure that cpio is there
2691 which cpio &> /dev/null; [ $? -eq 0 ] || Die "cpio not found. Please install package cpio and try again."
2692 # go into filesystem
[2712]2693 cd "$mountpoint"
[1230]2694 # kernel expects init in cpio filesystem
2695 ln -sf sbin/init init
2696 # create cpio image file and unmount loop filesystem
[1929]2697 find . -print | cpio -o -H newc | gzip -9 > $rdz_fname 2> /dev/null
[2712]2698 cd "$old_pwd"
[1230]2699 umount $mountpoint || Die "Cannot unmount $tempfile"
2700 # log that we are done
2701 echo "...done." >> $LOGFILE
[2390]2702 else
[1230]2703 Die "Filesystem $gvFileSystem not supported for initrd image. Terminating."
[2390]2704 fi
2705
[747]2706 if [ "$res" -eq "0" ] ; then
2707 echo -en "..."
2708 else
2709 echo -en "\rMade an rdz WITH ERRORS. \n"
2710 fi
2711 return 0
2712}
2713
2714
2715##############################################################################
[1021]2716#----------------------------------- Main -----------------------------------#
[747]2717##############################################################################
2718
[1885]2719# Now we can create what we need
2720mkdir -p $MINDI_TMP
[747]2721
[1885]2722# Purge from potential old run
2723if [ _"$MINDI_CACHE" = _"" ]; then
2724 Die "MINDI_CACHE undefined"
2725fi
2726
2727if [ "$1" = "--printvar" ] ; then
2728 shift
2729 if [ _"$1" != _"" ] ; then
2730 set | grep -Ew "^$1" | cut -d= -f2
2731 fi
[2183]2732 exit 0
[1885]2733fi
2734
[747]2735> $LOGFILE
2736echo "mindi v$MINDI_VERSION" >> $LOGFILE
2737echo "$ARCH architecture detected" >> $LOGFILE
2738echo "mindi called with the following arguments:" >> $LOGFILE
2739echo "$@" >> $LOGFILE
[800]2740echo "Start date : `date`" >> $LOGFILE
[1684]2741echo "-----------------------------" >> $LOGFILE
[747]2742
2743[ -e "/sbin/mkdosfs" ] && [ ! -e "/sbin/mkfs.vfat" ] && ln -sf /sbin/mkdosfs /sbin/mkfs.vfat
2744
[1010]2745# Log some capital variables
2746[ "$MINDI_PREFIX" = "XXX" ] && Die "Mindi has not been installed correctly."
[1885]2747echo "MONDO_SHARE = $MONDO_SHARE" >> $LOGFILE
[1010]2748echo "MINDI_LIB = $MINDI_LIB" >> $LOGFILE
2749echo "MINDI_SBIN = $MINDI_SBIN" >> $LOGFILE
2750[ "$MINDI_CONF" = "YYY" ] && Die "Mindi has not been installed correctly."
2751echo "MINDI_CONF = $MINDI_CONF" >> $LOGFILE
[1885]2752if [ -f $MINDI_CONFIG ]; then
2753 echo "-----------------------------" >> $LOGFILE
2754 echo " Mindi configuration file " >> $LOGFILE
2755 echo "-----------------------------" >> $LOGFILE
2756 grep -Ev '^#' $MINDI_CONFIG >> $LOGFILE
2757 echo "-----------------------------" >> $LOGFILE
2758fi
[1010]2759
[1885]2760
[747]2761trap AbortHere SIGTERM SIGHUP SIGQUIT SIGKILL SIGABRT SIGINT
[1010]2762
2763# Sanity checks
2764which which > /dev/null 2> /dev/null || Die "Please install 'which'."
2765which strings > /dev/null 2> /dev/null || Die "Please install binutils and libbinutils; you have no 'strings' executable."
2766which 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."
2767which gawk > /dev/null 2> /dev/null && AWK=`which gawk 2>/dev/null` || AWK="`which awk 2>/dev/null`"
2768if which awk &> /dev/null ; then
2769 if ! which gawk &> /dev/null ; then
2770 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"
2771 fi
2772fi
2773which mke2fs > /dev/null 2> /dev/null || Die "Please put mke2fs in system path"
[2222]2774[ ! -e "$FDISK" ] && Die "Cannot find $FDISK"
[1010]2775
[2292]2776[ "`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]2777
2778# Update the PATH variable if incomplete
2779if [ -e "/sbin/mkfs" ] && ! which mkfs &> /dev/null ; then
2780 PATH=$PATH:/sbin:/usr/sbin
2781 export PATH
2782 echo "Your PATH did not include /sbin or /usr/sbin. I have fixed that, temporarily." >> $LOGFILE
2783 echo "However, you may wish to ask your vendor to provide a permanent fix..." >> $LOGFILE
2784 echo " Or you might like to call 'su -' instead of 'su', for example." >> $LOGFILE
2785fi
2786
[1885]2787# If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
2788if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ] && [ "$kernelpath" = "FAILSAFE" ]; then
2789 source $MINDI_LIB/FindDistroFailsafe
2790 # Log kernel image
2791 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
2792else
2793 [ -f "$MINDI_LIB/vmlinuz" ] && FAILSAFE_KVER=`strings $MINDI_LIB/vmlinuz 2> /dev/null | grep -E "2\.[46]" | cut -d' ' -f1`
2794fi
[1010]2795
[1737]2796if ! which mkfs.vfat 1> /dev/null 2> /dev/null ; then
[1010]2797 Die "mkfs.vfat missing from your filesystem - please install your dosfstools RPM or DEB package. Perhaps your PATH environmental variable is broken, too?"
2798fi
2799
[925]2800### BERLIOS
[747]2801### Fix as it's not mandatory on ia64
2802if [ "$ARCH" = "ia64" ] ; then
[1010]2803 if which elilo &> /dev/null ; then
2804 LILO_EXE=elilo
2805 else
[2024]2806 LILO_EXE=`which false 2> /dev/null`
[1010]2807 fi
[747]2808else
2809 FindIsolinuxBinary
2810fi
2811trap "Aborted" SIGTERM
2812DONE="\r\t\t\t\t\t\t\t\tDone. "
2813kernelpath=""
[1010]2814MONDO_ROOT=/var/cache/mondo
[747]2815mkdir -p $MONDO_ROOT
2816
2817if [ -d "/proc/lvm" ]; then
2818 # LVM v1
2819 LVMCMD=""
2820 LVM="v1"
2821elif [ -d "/dev/mapper" ]; then
2822 # LVM v2
2823 LVMCMD="lvm"
2824 LVM="v2"
2825else
2826 LVM="false"
2827fi
[1021]2828echo "LVM set to $LVM" >> $LOGFILE
2829echo "----------" >> $LOGFILE
[1230]2830echo "mount result:" >> $LOGFILE
2831echo "-------------" >> $LOGFILE
2832mount >> $LOGFILE
2833echo "-------------" >> $LOGFILE
[1315]2834if [ -e /etc/raidtab ]; then
2835 echo "-------------" >> $LOGFILE
2836 echo "/etc/raidtab content:" >> $LOGFILE
2837 echo "-------------" >> $LOGFILE
2838 cat /etc/raidtab >> $LOGFILE
2839fi
2840echo "-------------" >> $LOGFILE
[1418]2841echo "cat /proc/cmdline:" >> $LOGFILE
2842echo "-------------" >> $LOGFILE
2843cat /proc/cmdline >> $LOGFILE
2844echo "-------------" >> $LOGFILE
[2014]2845echo "cat /proc/swaps:" >> $LOGFILE
2846echo "-------------" >> $LOGFILE
2847cat /proc/swaps >> $LOGFILE
2848echo "-------------" >> $LOGFILE
[2015]2849echo "cat /proc/partitions:" >> $LOGFILE
2850echo "-------------" >> $LOGFILE
2851cat /proc/partitions >> $LOGFILE
2852echo "-------------" >> $LOGFILE
2853echo "cat /proc/filesystems:" >> $LOGFILE
2854echo "-------------" >> $LOGFILE
2855cat /proc/filesystems >> $LOGFILE
2856echo "-------------" >> $LOGFILE
[1021]2857echo "lsmod result:" >> $LOGFILE
2858echo "-------------" >> $LOGFILE
2859lsmod >> $LOGFILE
[2431]2860MODULES="`cat /proc/modules | $AWK '{print $1}'`"
[1531]2861if [ -x /usr/sbin/esxcfg-module ]; then
[1797]2862 echo "-------------" >> $LOGFILE
[1497]2863 echo "VMWare ESX server detected - Enabling dedicated support" >> $LOGFILE
2864 echo "-------------" >> $LOGFILE
2865 echo "VMWare modules" >> $LOGFILE
2866 echo "-------------" >> $LOGFILE
[1531]2867 /usr/sbin/esxcfg-module -l >> $LOGFILE
[2431]2868 MODULES="$MODULES `/usr/sbin/esxcfg-module -l | $AWK '{print $1}'`"
[1497]2869fi
[1851]2870echo "FORCE_MODS:" >> $LOGFILE
[1021]2871echo "-------------" >> $LOGFILE
[1851]2872echo $FORCE_MODS >> $LOGFILE
[1882]2873echo "-------------" >> $LOGFILE
[1851]2874echo "DENY_MODS:" >> $LOGFILE
2875echo "-------------" >> $LOGFILE
2876echo $DENY_MODS >> $LOGFILE
2877echo "-------------" >> $LOGFILE
[1796]2878echo "df result:" >> $LOGFILE
[1785]2879echo "----------" >> $LOGFILE
[1796]2880df -T >> $LOGFILE
[1785]2881echo "-------------" >> $LOGFILE
[1230]2882echo "Liste of extra modules is:" >> $LOGFILE
2883echo "$EXTRA_MODS" >> $LOGFILE
2884echo "-------------" >> $LOGFILE
[747]2885
[1723]2886# Compute libata version
[2649]2887laver=`modinfo libata 2> /dev/null | grep -Ei '^Version:' | cut -d: -f2 | cut -d. -f1 | sed 's/ *//g' 2> /dev/null`
[1723]2888# If libata v2 is used then remove ide-generic as it will perturbate boot
[1726]2889if [ "`echo $MODULES | grep libata`" ]; then
[1727]2890 if [ "$laver" = "2" ]; then
[1726]2891 DENY_MODS="$DENY_MODS ide-generic"
[1727]2892 echo "ide-generic removed from module list as your system uses libata v2+" >> $LOGFILE
[1726]2893 echo "-------------" >> $LOGFILE
2894 fi
[1723]2895fi
2896
[2457]2897# Check for ISO_CMD command
2898if [ ! -x $ISO_CMD ]; then
2899 echo "NOTE: No CD image (ISO file) utility found" >> $LOGFILE
2900fi
2901
[747]2902FLOPPY_WAS_MOUNTED=""
2903for mtpt in /media/floppy /mnt/floppy /floppy ; do
2904 if mount | grep -w $mtpt &> /dev/null ; then
2905 FLOPPY_WAS_MOUNTED="$FLOPPY_WAS_MOUNTED $mtpt"
2906 umount $mtpt
2907 fi
2908done
2909
[1684]2910#
2911# If we have a USB device we need to store info
2912# and remove it from the parameters line
2913#
[747]2914if [ "$#" -ne "0" ] ; then
[1684]2915 if [ "$1" = "--usb" ] ; then
2916 shift
2917 USBDEVICE=$1
2918 if [ _"$USBDEVICE" = _"" ]; then
2919 Die "No USB device specified"
2920 fi
2921 shift
2922 fi
2923fi
2924
2925if [ "$#" -ne "0" ] ; then
[747]2926 if [ "$1" = "--findkernel" ] ; then
[2880]2927 resk=`TryToFindKernelPath`
[1336]2928 # Avoids logfile content for mondo
2929 export MONDO_SHARE=""
[2880]2930 if [ "$resk" = "" ] ; then
[2838]2931 if [ $KERNEL_IS_XEN = "yes" ]; then
2932 echo "$xenkernelpath"
[2880]2933 LogOnly "xenkernelpath = $xenkernelpath"
[2860]2934 MindiExit 0
[2838]2935 else
[2860]2936 MindiExit -1
[2838]2937 fi
[747]2938 else
[2880]2939 echo "$resk"
2940 LogOnly "kernelpath = $resk"
[2860]2941 MindiExit 0
[747]2942 fi
[1720]2943 elif [ "$1" = "--locatedeps" ] ; then
2944 [ ! "$2" ] && Die "Please specify the binary to look at"
[2438]2945 LocateDeps $*
[1720]2946 # Avoids logfile content for mondo
2947 export MONDO_SHARE=""
2948 MindiExit $?
[1815]2949 elif [ "$1" = "--readalllink" ] ; then
2950 [ ! "$2" ] && Die "Please specify the binary to look at"
2951 ReadAllLink $2
2952 # Avoids logfile content for mondo
2953 export MONDO_SHARE=""
2954 MindiExit $?
[2731]2955 elif [ "$1" = "--makemessage" ] ; then
2956 MakeMessageFile
2957 MindiExit 0
[747]2958 elif [ "$1" = "--makemountlist" ] ; then
2959 [ ! "$2" ] && Die "Please specify the output file"
2960 MakeMountlist $2
[2432]2961 CheckMountlist $2
[1336]2962 # Avoids logfile content for mondo
2963 export MONDO_SHARE=""
[925]2964 MindiExit $?
2965 elif [ "$1" = "-V" ] || [ "$1" = "-v" ] || [ "$1" = "--version" ] || [ "$1" = "-version" ] ; then
2966 echo "Mindi v$MINDI_VERSION"
[1336]2967 # Avoids logfile content for mondo
2968 export MONDO_SHARE=""
[925]2969 MindiExit 0
[747]2970 elif [ "$#" -ge "9" ] && [ "$1" = "--custom" ] ; then
[940]2971 MONDO_TMP=$2
2972 # Change MINDI_TMP for the one provided by mondo
2973 # So that it can get back the built files
[2153]2974 if [ _"$MONDO_TMP" = _"" ]; then
2975 Die "MONDO_TMP is empty, aborting"
2976 fi
2977 if [ _"$MONDO_TMP" = _"/" ]; then
2978 Die "MONDO_TMP is /, aborting"
2979 fi
[2092]2980 mv $MINDI_TMP/* $MINDI_TMP/.??* $MONDO_TMP 2>> $LOGFILE
[1010]2981 rmdir $MINDI_TMP
[1486]2982 export MINDI_TMP=$MONDO_TMP
[953]2983 mkdir -p $MINDI_TMP
[2238]2984
[1696]2985 # This is the scratch dir in mondo - subdir images
[1880]2986 MINDI_CACHE=$3
[2238]2987
[925]2988 kernelpath=$4; [ "$kernelpath" = "(null)" ] && kernelpath=""
[2681]2989 [ "$kernelpath" = "" ] && kernelpath=`TryToFindKernelPath`
2990
[747]2991###
2992### Sq-Modification...
2993### Attempt to locate kernel specific module path
2994### if module path is found then use it other wise use uname -r to set it...
2995###
[2629]2996 if [ $KERNEL_IS_XEN = "yes" ]; then
2997 LogIt "xenkernelpath = $xenkernelpath"
2998 LogIt "xenkernelname = $xenkernelname"
2999 fi
[2657]3000 kernelname=`echo $kernelpath | cut -d'-' -f2- | sed 's/.[bg]z[2]*$//'`
[747]3001 if [ ! -d "/lib/modules/$kernelname" ] && [ "$kernelpath" != "FAILSAFE" ]
3002 then
[963]3003 LogIt "Module path for ${kernelpath} not found..."
3004 LogIt "using running kernel\'s modules."
[2292]3005 kernelname=$KERVERRUN
[747]3006 fi
[2657]3007 LogIt "kernelname = $kernelname"
3008 LogIt "kernelpath = $kernelpath"
[747]3009###
3010### end of Sq-Modification
3011###
[925]3012 TAPEDEV=$5
3013 TAPESIZE=$6
3014 FILES_IN_FILELIST=$7
3015 USE_LZO=$8
3016 CDRECOVERY=$9
[747]3017 if [ "${10}" = "(null)" ] || [ "${10}" = "" ] ; then
3018 IMAGE_DEVS=""
3019 else
3020 IMAGE_DEVS="`echo "${10}" | tr '|' ' '`"
3021 fi
[925]3022 if [ "${11}" ] ; then
3023 LILO_OPTIONS=""
3024 # LogIt "LILO will use conservative settings, to be compatible with older BIOSes."
3025 fi
3026 LAST_FILELIST_NUMBER=${12}
[747]3027 ESTIMATED_TOTAL_NOOF_SLICES=${13}
[2564]3028 export MINDI_EXCLUDE_DEVS="${14}"
[747]3029 USE_COMP="${15}"
3030 USE_LILO="${16}"
[925]3031 USE_STAR="${17}"
3032 INTERNAL_TAPE_BLOCK_SIZE="${18}"
[747]3033 DIFFERENTIAL="${19}"
[998]3034 USE_GZIP="${20}"
3035 NOT_BOOT="${21}"
[747]3036 [ "$USE_COMP" = "" ] && USE_COMP=yes
[998]3037 [ "$USE_GZIP" = "" ] && USE_GZIP=no
[747]3038 [ "$NOT_BOOT" = "" ] && NOT_BOOT=no
[963]3039 [ "$TAPEDEV" ] && LogIt "This is a tape-based backup. Fine."
[1696]3040 # MONDO_ROOT is the real scratchdir
[1880]3041 MONDO_ROOT=`echo $MINDI_CACHE | sed 's/\(.*\)\/.*/\1/'`
[938]3042 if [ _"$MONDO_ROOT" != _"" ]; then
3043 mkdir -p $MONDO_ROOT
3044 else
3045 Die "MONDO_ROOT is undefined"
3046 fi
[747]3047 else
[925]3048 echo "Syntax: mindi (--custom ....)" >> /dev/stderr
3049 MindiExit -1
[747]3050 fi
3051fi
[2238]3052
3053if [ _"$MINDI_CACHE" != _"" ]; then
3054 rm -rf $MINDI_CACHE/* 2> /dev/null
3055 mkdir -p $MINDI_CACHE
3056fi
3057
[747]3058[ "$CDRECOVERY" = "yes" ] || CDRECOVERY=no
3059
[1684]3060if [ _"$MONDO_SHARE" = _"" ]; then
[963]3061 LogIt "Mindi Linux mini-distro generator v$MINDI_VERSION"
3062 LogIt "Latest Mindi is available from http://www.mondorescue.org"
3063 LogIt "BusyBox sources are available from http://www.busybox.net"
[747]3064 LogIt "------------------------------------------------------------------------------"
3065else
[1315]3066 echo "You are using Mindi-Linux v$MINDI_VERSION to make boot+data disks" >> $LOGFILE
[747]3067fi
[1005]3068if [ -f $MINDI_LIB/rootfs/bin/busybox ]; then
3069 LogIt "Mindi-`$MINDI_LIB/rootfs/bin/busybox 2>&1 | head -1`"
3070else
3071 LogIt "Unable to find mindi-busybox, please install it"
3072 MindiExit -1
3073fi
[747]3074
3075for i in loop cdrom ide-cd isofs linear raid0 raid1 raid5 ; do
[2753]3076 modprobe $i >> $LOGFILE 2>> $LOGFILE
[747]3077done
3078
3079KERN_DISK_MADE=""
3080
3081echo "DIFFERENTIAL = $DIFFERENTIAL" >> $LOGFILE
3082echo "INTERNAL TAPE BLOCK SIZE = $INTERNAL_TAPE_BLOCK_SIZE" >> $LOGFILE
3083echo "NOT_BOOT = '$NOT_BOOT'" >> $LOGFILE
3084if [ "$NOT_BOOT" != "" ] && [ "$NOT_BOOT" != "0" ] && [ "$NOT_BOOT" != "no" ] ; then
[963]3085 LogIt "Just creating mondo-restore.cfg and a small all.tar.gz for Mondo. Nothing else."
[940]3086 MakeMondoConfigFile $MINDI_TMP/mondo-restore.cfg
3087 MakeMountlist $MINDI_TMP/mountlist.txt
[2432]3088 CheckMountlist $MINDI_TMP/mountlist.txt
[940]3089 mkdir -p $MINDI_TMP/small-all/tmp
[2712]3090 cd "$MINDI_TMP/small-all"
[2092]3091 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]3092 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]3093 sleep 2
[963]3094 LogIt "Done. Exiting."
[925]3095 MindiExit 0
[747]3096fi
3097
[1690]3098if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1684]3099 LogIt "Including the generation of a Bootable USB device on $USBDEVICE"
3100fi
3101
[747]3102if [ "$kernelpath" = "" ] ; then
[1335]3103 [ _"$MONDO_SHARE" != _"" ] && Die "Please use -k <path> to specify kernel."
[966]3104 echo -en "Do you want to use your own kernel to build the boot disk ([y]/n) ?"
3105 read ch
3106 if [ "$ch" != "n" ] && [ "$ch" != "N" ] ; then
3107 USE_OWN_KERNEL="yes"
[1809]3108 else
3109 USE_OWN_KERNEL="no"
[747]3110 fi
3111 if [ "$USE_OWN_KERNEL" = "yes" ]; then
[925]3112 YOUR_KERNEL_SUCKS=""
3113 kernelpath=`TryToFindKernelPath`
3114 if [ "$kernelpath" = "" ] ; then
3115 echo -n "Please enter kernel path : "
3116 read kernelpath
3117 fi
[747]3118 else
[925]3119 YOUR_KERNEL_SUCKS="That's why you're using mine, dude. :-)"
[747]3120 fi
3121fi
3122if [ "$YOUR_KERNEL_SUCKS" != "" ] || [ "$kernelpath" = "" ] || [ "$kernelpath" = "SUCKS" ] || [ "$kernelpath" = "FAILSAFE" ] ; then
[1885]3123 # If we have a distribution-specific script for finding a FAILSAFE kernel, use it.
3124 if [ -f "$MINDI_LIB/FindDistroFailsafe" ] && [ ! "$1" = "--makemountlist" ]; then
3125 source $MINDI_LIB/FindDistroFailsafe
3126 # Log kernel image
3127 LogIt "FAILSAFE kernel image to be used is: $FAILSAFE_KBIN ($FAILSAFE_KVER)"
3128 kernelpath="$FAILSAFE_KBIN"
3129 LogIt "I shall include a failsafe kernel, not your kernel, in the boot disks.\n"
3130 LogIt "The failsafe kernel is $kernelpath.\n"
3131 LogIt "However, you are still running your kernel. If Mindi fails to create your\n"
3132 LogIt "disks then it may still be a result of a problem with your kernel.\n"
3133 pwd=`pwd`
[2712]3134 cd "$MINDI_TMP"
[1885]3135 mkdir -p lib/modules
3136 cp -a "/lib/modules/$FAILSAFE_KVER" "lib/modules/$FAILSAFE_KVER" || Die "Cannot copy kernel modules."
[2712]3137 cd "$pwd"
[1885]3138 else
3139 kernelpath=$MINDI_LIB/vmlinuz
3140 LogIt "I shall include Mindi's failsafe kernel, not your kernel, in the boot disks."
3141 LogIt "However, you are still running your kernel. If Mindi fails to create your"
3142 LogIt "disks then it may still be a result of a problem with your kernel."
3143 pwd=`pwd`
[2712]3144 cd "$MINDI_TMP"
[1885]3145 bzip2 -dc $MINDI_LIB/lib.tar.bz2 | tar -x || Die "Cannot unzip lib.tar.bz2"
[2712]3146 cd "$pwd"
[1885]3147 fi
[747]3148 YOUR_KERNEL_SUCKS="Your kernel sucks"
3149fi
[1880]3150echo -e "Mindi's temp dir = $MINDI_TMP \nMindi's output dir=$MINDI_CACHE" >> $LOGFILE
[963]3151[ "$(($RANDOM%64))" -eq "0" ] && LogIt "Dude, I've looked inside your computer and it's really dusty..."
[747]3152
[965]3153[ "$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]3154
[1983]3155PrepareDataDiskImages
3156
[747]3157ramdisk_size=$(($size_of_all_tools+$EXTRA_SPACE))
3158rds=$(($ramdisk_size-$((ramdisk_size%4096))))
[1983]3159export ramdisk_size=$rds
[747]3160
3161echo "Ramdisk will be $ramdisk_size KB" >> $LOGFILE
[1567]3162if [ "$ARCH" = "ia64" ] ; then
[1983]3163 PrepareBootDiskImage_LILO $kernelpath || Die "Failed to create ia64 image disk image."
[1567]3164else
[2073]3165 PrepareBootDiskImage_ISOLINUX $kernelpath || Die "Failed to create $ramdisk_size MB disk image."
[747]3166fi
3167
3168[ -e "$MINDI_LIB/memtest.img" ] && BOOT_MEDIA_MESSAGE="$BOOT_MEDIA_MESSAGE\n\
3169...Or type 'memtest' to test your PC's RAM thoroughly.\n"
3170
[1684]3171if [ _"$MONDO_SHARE" = _"" ]; then
[1983]3172 ListImagesForUser
3173 OfferToMakeBootableISO
[1684]3174 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ]; then
[1983]3175 OfferToMakeBootableUSB
[1684]3176 fi
[963]3177 LogIt "Finished."
[747]3178elif [ "$TAPEDEV" ] ; then
[2078]3179 if [ "$ARCH" != "ia64" ] ; then
3180 # We need to keep the img file as boot file for ia64 platform
3181 rm -f $MINDI_CACHE/{*img,*iso}
3182 else
3183 rm -f $MINDI_CACHE/*iso
3184 fi
[1898]3185 if [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3186 OfferToMakeBootableUSB
[1898]3187 fi
[1983]3188 OfferToMakeBootableISO
[1880]3189 if [ -e "$MINDI_CACHE/all.tar.gz" ] ; then
3190 cp -f $MINDI_CACHE/all.tar.gz $MINDI_TMP/ 2>> $LOGFILE
[747]3191 else
[925]3192 Die "Cannot find all.tar.gz, to be written to tape"
[747]3193 fi
[1695]3194elif [ "$PROMPT_MAKE_USB_IMAGE" = "yes" ] && [ "$USBDEVICE" != "" ]; then
[1983]3195 OfferToMakeBootableUSB
[747]3196else
[1983]3197 OfferToMakeBootableISO
[747]3198fi
3199# cleanup
[963]3200LogIt "$FRIENDLY_OUTSTRING"
[747]3201for mtpt in $FLOPPY_WAS_MOUNTED ; do
3202 mount $mtpt
3203done
[925]3204MindiExit 0
Note: See TracBrowser for help on using the repository browser.