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

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

r3513@localhost: bruno | 2009-10-02 00:09:16 +0200

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