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

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