source: MondoRescue/branches/2.2.10/mindi/mindi@ 2391

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