source: MondoRescue/branches/2.2.9/mindi/mindi@ 2183

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

Tries to solve issue on ia64 where perl modules used by mindi were missing by adding a dedicated script handling them based on what is used on mandriva to make rpm deps

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