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

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