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

Last change on this file since 2603 was 2603, checked in by Bruno Cornec, 14 years ago

r3757@localhost: bruno | 2010-03-17 15:05:13 +0100

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