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

Last change on this file since 2412 was 2412, checked in by Bruno Cornec, 15 years ago
  • sshfs also needs ssh at restore time in initrd
  • Better list of mandatory tools
  • Adds fuse and sshfs support in initrd
  • Split deplist.txt into multiple conf files under deplist.d in the conf dir. This will allow to have a minimal.conf file for initrd content to analyze to improve support of new embedded feature in the future (sshfs, live install). The other conf files contain the additional commands to put in the all.tar.gz. For the moment, mindi is still working the same. THis infra will allow that support in a near future. deplist.txt is now reserved for the admin additional commands.
  • Remove useless script

(Backport from 2.2.9)

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