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

Last change on this file since 2345 was 2345, checked in by Bruno Cornec, 15 years ago

In NFS mode also propose access to expert, interactive, ... entry at boot prompt
(backport from 2.2.9)

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