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

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

Remove useless conf files created under /tmp and never used

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