source: MondoRescue/branches/2.2.10/mindi/rootfs/sbin/init@ 2569

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

svn merge -r 2545:2567 /mondorescue/branches/2.2.9

  • Improve device exclusion for LVM by adding support for symlinks and mapper systematically at all levels (PV, VG, LV). Shoul

d really provvide the best support possible for LVM exclusion.

  • Now supports also exclusion of LVs directly
  • Improve mindi by handling excluded devices earlier in the loop.
  • Fix LV exclusion when VGs are excluded (the excludedvgs file has to be removed at start and end of analyze-my-lvm not in fu

nctions, as they are called multiple times)

  • Rename some variables exported to avoid accidental conflict (EXCLUDE_DEVS => MINDI_EXCLUDE_DEVS and ADDITIONAL_BOOT_PARAMS

=> MINDI_ADDITIONAL_BOOT_PARAMS)

  • setfattr also needs the -h flag to restore attributes on symlinks, not on the target file (which may not exist BTW). Should solve #388.
  • Using forcemods="mod1 mod2" will now do something and load those modules first
  • Update web page on distributions to download
  • Add support for ums_cypress module in mindi
  • Fix acl backup which was completely wrong.
  • Fix a bug where LV were not created anymore if no exclusion !!
  • In analyze-my-lvm only use pv.tmp2 when it exists to avoid error msgs

-Adds support for links to modules (.ko pointing to .o) such as with VMWare extensions

  • Adds i-want-my-lvm content in mindi log file
  • Adds vmxnet3 driver support to mindi for some VMWare versions
  • Fix a typo in the way device mapper files where excluded
  • use option -h of getfattr to *not* follow symlinks, which breaks RHEL 5.4 as reported in #388. However, getfacl doesn't provide such an option.
  • Adds some logs for filelist creation
  • Remove option -P from getfattr which may also skip symlinks - Attempt to solve #388
  • Exclude rpc_pipefs type of filesystems from find
  • Suppress unused mode_of_file function
  • Property svn:keywords set to Id
File size: 24.9 KB
Line 
1#!/bin/sh
2#
3# $Id: init 2569 2010-02-02 09:40:28Z bruno $
4#
5# init script launched during the restore process
6#------------------------------------------------------------
7
8export MINDI_CACHE=CCC
9
10if [ -e "/proc/cmdline" ]; then
11 export CMDLINE="/proc/cmdline"
12elif [ -e "/tmp/cmdline" ]; then
13 export CMDLINE="/tmp/cmdline"
14else
15 export CMDLINE="/dev/null"
16fi
17
18
19
20CaughtSoftReset() {
21 trap SIGTERM
22 reboot
23}
24
25
26ConfigureLoggingDaemons() {
27 echo -en "Running klogd..."
28 klogd -c 2 > /dev/null 2> /dev/null
29 echo -en "Done.\nRunning syslogd..."
30 syslogd > /dev/null 2> /dev/null
31 echo "Done."
32 LogIt "klogd and syslogd have been started."
33}
34
35
36
37CopyBootDevEntry() {
38 local outfile devfile
39 devfile=/dev/boot_device
40 outfile=`cat /BOOTLOADER.DEVICE 2> /dev/null`
41 [ ! "$outfile" ] && return 0
42 echo -en "Copying boot device to $outfile..."
43 if [ -e "$outfile" ] ; then
44 echo "not needed."
45 return 0
46 fi
47 mkdir -p $outfile
48 rmdir $outfile
49 cp -pRdf $devfile $outfile
50 if [ "$?" -ne "0" ] ; then
51 echo "Failed."
52 return 1
53 else
54 echo "OK."
55 return 0
56 fi
57}
58
59
60
61Die() {
62 LogIt "Fatal error! $1" 1
63 exit 1
64}
65
66
67
68ExtractDevTarballs() {
69 cd /
70 for fname in ataraid.tgz ida.tgz i2o.tgz rd.tgz raw.tgz cciss.tgz nst.tgz dm.tgz vc.tgz ; do
71 if [ ! -e "/$fname" ] ; then
72 LogIt "/$fname not found; cannot extract to /." 1
73 else
74 echo -en "\rExtracting /$fname... "
75 tar -zxf /$fname || LogIt "Error occurred while extracting /$fname"
76 rm -f /$fname
77 fi
78 done
79 echo -en "\r"
80 LogIt "Extracted additional /dev entries OK. " 1
81}
82
83
84
85LaunchTerminals() {
86 openvt -l /bin/sh
87 openvt -l /bin/sh
88 openvt -l /bin/sh
89 openvt -l /bin/sh
90 openvt -l /bin/sh
91 openvt -l /bin/sh /sbin/wait-for-petris
92 openvt -l /usr/bin/tail -f $LOGFILE
93 # May avoid shell error messages
94 # chmod 666 /dev/tty* /dev/console
95 # By default first serial line is configured as tty
96 # Required to have a correct serial console support (MP on ia64 or VSP with iLO2 e.g.)
97 for i in `cat /proc/cmdline` ; do
98 echo $i | grep -qi serial= && serial=`echo $i | cut -d= -f2`
99 done
100 # Doing that is only valid when using a real serial line
101 if [ -f $serial ]; then
102 LogIt "Redirecting serial $serial to /dev/tty" 1
103 ln -s -f $serial /dev/tty
104 fi
105}
106
107
108LoadKeymap() {
109 local fname
110 fname=`cat $MINDI_CACHE/KEYMAP-LIVES-HERE 2> /dev/null`
111 [ "$fname" = "" ] && return
112 if which loadkeys > /dev/null 2> /dev/null ; then
113 loadkeys $fname
114 else
115 LogIt "Using default keyboard map." 1
116 fi
117}
118
119
120UntarTapeStuff() {
121 local old_pwd res
122 old_pwd=`pwd`
123 cd $GROOVY
124 [ "$1" != "" ] && tapedev=$1
125 [ ! "$tapedev" ] && tapedev=`grep media-dev $MINDI_CACHE/mondorestore.cfg 2>/dev/null | tr -s ' ' ' ' | cut -d' ' -f2`
126 mt -f $tapedev rewind
127 mt -f $tapedev fsf 2
128 dd if=$tapedev bs=32k count=1024 | tar -zx
129 res=$?
130 if [ "$res" -eq "0" ] ; then
131 # Store the dev name in case we changed it interactively
132 if [ -f "$MINDI_CACHE/mondorestore.cfg" ]; then
133 sed -i "s/^media-dev .*$/media-dev $tapedev/" $MINDI_CACHE/mondorestore.cfg
134 fi
135 fi
136 cd $old_pwd
137 return $res
138}
139
140HandleTape() {
141 local res tapedev
142 tapedev="" ; # will be set by UntarTapeStuff()
143
144 # Here we can add the USB storage module, it's working even with OBDR !
145 modprobe -q usb-storage
146 # Tape takes some time to appear
147 sleep 10
148 UntarTapeStuff $tapedev
149 res=$?
150 while [ "$res" -ne "0" ] ; do
151 LogIt "$tapedev failed to act as extended data disk for booting." 1
152 LogIt "Please specify an alternate tape device," 1
153 LogIt "or hit <Enter> to boot from another media." 1
154 echo -en "---> "
155 read tapedev
156 if [ "$tapedev" ] ; then
157 LogIt "User specified $tapedev instead"
158 UntarTapeStuff $tapedev
159 res=$?
160 else
161 LogIt "User opted not to specify an alternate tapedev"
162 res=1
163 break
164 fi
165 done
166 # For post-init
167 export TAPEDEV=$tapedev
168
169 if [ "$res" -ne "0" ] ; then
170 LogIt "Failed to use tape as extended datadisk. Reverting to another media." 1
171 HandleCDROM
172 res=$?
173 else
174 LogIt "Using tape as extended datadisk. Good." 3
175 echo "Using tape as extd ddisk." > /tmp/TAPEDEV-HAS-DATA-DISKS
176 res=0
177 CD_MOUNTED_OK=yes
178 fi
179 return $res
180}
181
182
183
184HandleCDROM() {
185 # Just in case we have an iLO ensure we will map it correctly
186 echo "$DENY_MODS" | grep -q "usb-storage "
187 if [ $? -eq 0 ]; then
188 return
189 fi
190 echo "Activating a potential USB Storage device"
191 modprobe -q usb-storage
192 for i in 1 2 3 4 5 6 7 8 9 10 ; do
193 sleep 1
194 echo -en "."
195 done
196
197 find-and-mount-cdrom
198 res=$?
199 if [ "$res" -ne "0" ] ; then
200 LogIt "First call to find-and-mount-cdrom failed." 1
201 LogIt "Sleeping for 3 seconds and trying again." 1
202 sleep 3
203 find-and-mount-cdrom
204 res=$?
205 fi
206 if [ "$res" -eq "0" ] ; then
207 LogIt "OK, I am running on a CD-ROM. Good." 3
208 CD_MOUNTED_OK=yes
209 else
210 LogIt "You probably not have the right drivers" 3
211 LogIt "to support the hardware on which we are running" 3
212 LogIt "Your archives are probably fine but" 3
213 LogIt "your tape streamer and/or CD-ROM drive are unsupported at that point." 3
214 CD_MOUNTED_OK=""
215 fi
216 return 0
217}
218
219
220# --- cater for arbitrary locations of devfsd.conf by using the
221# config file path compiled into devfsd
222RunDevfsd() {
223 loc=`which devfsd 2> /dev/null`
224 if [ "$loc" != "" ] ; then
225 LogIt "Devfs found. Testing kernel support..."
226 if [ ! -e "/dev/.devfsd" ] ; then
227 mount -t devfs devfs /dev 2>> $LOGFILE
228 if [ "$?" -ne "0" ] ; then
229 LogIt "Error while trying to mount devfs"
230 else
231 LogIt "Devfs mounted OK"
232 fi
233 fi
234 #check if the kernel supports devfs
235 if [ -e "/dev/.devfsd" ] ; then
236 [ -d "/proc/1" ] || mount -n /proc
237 LogIt "Kernel support found. Creating config file and starting devfsd"
238 conffile=`strings $loc | grep -E "devfsd.conf$"`
239 [ "$conffile" ] || conffile="/etc/devfsd.conf"
240 confpath=`echo $conffile | sed "s/\/devfsd\.conf$//"`
241 [ -d "$confpath" ] || mkdir -p $confpath
242 echo -en "REGISTER .* MKOLDCOMPAT\nUNREGISTER .* RMOLDCOMPAT\n" > $conffile
243 devfsd /dev &
244 sleep 5
245 else
246 LogIt "No devfs kernel support."
247 fi
248 fi
249}
250
251# Taken from udev management in Mandriva 2008.0. Kudos guys
252make_extra_nodes () {
253 # there are a few things that sysfs does not export for us.
254 # these things are listed in /etc/udev/links.conf
255 grep '^[^#]' /etc/udev-links.conf | \
256 while read type name arg1; do
257 [ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue
258 case "$type" in
259 L) ln -s $arg1 /dev/$name ;;
260 D) mkdir -p /dev/$name ;;
261 M) mknod /dev/$name $arg1 && chmod 600 /dev/$name;;
262 *) echo "udev-links.conf: unparseable line (%s %s %s)\n" "$type" "$name" "$arg1" ;;
263 esac
264 done
265}
266
267create_dev_makedev() {
268 if [ -e /sbin/MAKEDEV ]; then
269 ln -sf /sbin/MAKEDEV /dev/MAKEDEV
270 else
271 ln -sf /bin/true /dev/MAKEDEV
272 fi
273}
274
275RunUdevd() {
276 # Inspiration from Mandriva 2008.0 startup script
277 echo "Preparing udev environment..."
278 mv /dev /dev.static
279 mkdir /dev
280 mount -n -o size=5M,mode=0755 -t tmpfs none /dev
281 make_extra_nodes
282 mount -n -t devpts -o mode=620 none /dev/pts
283 mount -n -t tmpfs none /dev/shm
284 if [ -e /proc/sys/kernel/hotplug ]; then
285 echo > /proc/sys/kernel/hotplug
286 fi
287 PKLVL=`cut -f1 /proc/sys/kernel/printk`
288 echo 0 > /proc/sys/kernel/printk
289 # Many possibilities depending on udev versions
290 if [ -x /sbin/startudev ]; then
291 /sbin/startudev
292 elif [ -x /sbin/start_udev ]; then
293 /sbin/start_udev
294 fi
295 # Depending on udevd version it gives back the hand or not :-(
296 ps | grep udevd 2> /dev/null 1> /dev/null
297 if [ $? -ne 0 ]; then
298 /sbin/udevd --daemon &
299 echo "Waiting for udev to start..."
300 sleep 5
301 fi
302 mkdir -p /dev/.udev/queue/
303 if [ -x /sbin/udevtrigger ]; then
304 /sbin/udevtrigger
305 fi
306 echo "Waiting for udev to discover..."
307 create_dev_makedev
308 # Newer version use udevadm for that
309 if [ -x /sbin/udevsettle ]; then
310 /sbin/udevsettle --timeout=10
311 elif [ -x /sbin/udevadm ]; then
312 /sbin/udevadm trigger
313 /sbin/udevadm settle --timeout=10
314 fi
315 # It seems we need to have more static devs on some distro were
316 # udev as some other requirements to be covered later on.
317 # So in the mean time:
318 for d in `ls /dev.static`; do
319 if [ ! -e /dev/$d ]; then
320 mv /dev.static/$d /dev
321 fi
322 done
323 rm -rf /dev.static
324 echo $PKLVL > /proc/sys/kernel/printk
325}
326
327RstHW() {
328
329 # Restore the HW configuration if available (NOT by default)
330 answer="NO"
331
332 grep -q nohw $CMDLINE
333 if [ "$?" -eq 0 ]; then
334 return
335 fi
336 if [ -x $MINDI_CACHE/mindi-rsthw ]; then
337 grep -q RESTORE $CMDLINE
338 if [ "$?" -ne 0 ]; then
339 echo "*********************************************************************"
340 echo "Do you want to restore the HW configuration of the original machine ?"
341 echo "(This may dammage your hardware so be sure to check twice before saying yes)"
342 echo "*********************************************************************"
343 echo "Please confirm by typing YES exactly as written here (NO by default)"
344 echo -n "--> "
345 read answer
346 else
347 answer="YES"
348 fi
349 if [ "$answer" = "YES" ] ; then
350 $MINDI_CACHE/mindi-rsthw
351 fi
352 fi
353}
354
355
356#RunDevfsd() {
357# loc=`which devfsd 2> /dev/null`
358# if [ "$loc" != "" ] ; then
359# LogIt "Starting devfsd"
360# devfsd /dev &
361# sleep 5
362# fi
363#}
364
365
366
367StartUSBKbd() {
368# Prepare minimal USB env in case we have USB kbd such as with iLO
369[ -d /proc/bus/usb ] && ! grep -q /proc/bus/usb /proc/mounts && mount -t usbfs none /proc/bus/usb
370echo "$DENY_MODS" | grep -Eq 'uhcd_hci |usbhid |usbcore '
371if [ $? -eq 0 ]; then
372 return
373fi
374modprobe -q uhcd_hci
375modprobe -q usbhid
376}
377
378
379
380StartLvms() {
381 if [ "`grep -i nolvm /proc/cmdline`" ]; then
382 return;
383 fi
384 if [ -e "/tmp/i-want-my-lvm" ] ; then
385 LogIt "Scanning LVM's..." 1
386 if which lvm ; then
387 modprobe -q dm-mod
388 modprobe -q dm_mod
389 lvm vgscan --mknodes
390 else
391 vgscan
392 fi
393
394 # Exclude devices we may not want
395 rm -f /tmp/restorevgs
396 for d in $MINDI_EXCLUDE_DEVS ; do
397 echo " == $d"
398 EXCLUDE_VGS=`grep " $d" /tmp/i-want-my-lvm | grep vgcreate | awk '{print $4}'`
399 vg=`echo $EXCLUDE_VGS | sed "s/ /|/g"`
400 if [ "$vg" != "" ]; then
401 re=" $d|$vg"
402 else
403 re=" $d"
404 fi
405 # Remove VGs from i-want-my-lvm
406 grep -Ev "$re" /tmp/i-want-my-lvm > /tmp/i-want-my-lvm.new
407 mv /tmp/i-want-my-lvm.new /tmp/i-want-my-lvm
408 # Prepare script to restore the VG exluded here if needed
409 for v in $EXCLUDE_VGS; do
410 echo "vgcfgrestore $v" >> /tmp/restorevgs
411 # Remove LVs from mountlist
412 EXCLUDE_LVS=`grep " $v" /tmp/i-want-my-lvm | grep lvcreate | sed "s/^.*-n \([^ ][^ ]*\) .*$/$1/"`
413 for l in $EXCLUDE_LVS; do
414 # FIXME: Should search for all possible device names here
415 grep -Ev "/dev/$v/$l" /tmp/mountlist.txt > /tmp/mountlist.txt.new
416 grep -Ev "/dev/mapper/${v}-$l" /tmp/mountlist.txt.new > /tmp/mountlist.txt
417 done
418 done
419 done
420
421 grep -E "^#.*vgchange" /tmp/i-want-my-lvm | sed "s/^#[ ]*//" > /tmp/start-lvm
422 chmod +x /tmp/start-lvm
423 echo -en "Starting LVM's..."
424 /tmp/start-lvm &
425 for i in 1 2 3 4 5 ; do
426 echo -en "."
427 sleep 1
428 done
429 rm -f /tmp/start-lvm
430 echo "Done."
431 fi
432# If necessary, cannibalize 'analyze-my-lvm'; copy some of its code here,
433# pipe vgscan's output, strip it, run 'vgchange' on its output, etc.etc.
434 LogIt "LVM's have been started."
435}
436
437StartPowerPath() {
438
439 # Taken from the init script of EMC PowerPath on RHEL
440 if [ -f /etc/emcp_devicesDB.dat ]; then
441 if [ -f /etc/emcp_devicesDB.idx ]; then
442 /etc/opt/emcpower/emcpmgr map -p > /dev/null 2>&1
443 fi
444 fi
445
446 /sbin/powermt config > /dev/null 2>&1
447 # Wait for udev to finish creating emcpower devices
448 #
449 pdfound=1
450 for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15; do
451 pdfound=1
452 for pd in `/bin/ls -d /sys/block/emcpower* 2> /dev/null`; do
453 bpd=`basename $pd`
454 if [ ! -e /dev/$bpd ]; then
455 pdfound=0
456 sleep 2
457 break;
458 fi
459 done
460 if [ "$pdfound" -eq 1 ]; then
461 break
462 fi
463 done
464 if [ "$pdfound" -eq 0 ]; then
465 echo "Unable to start PowerPath"
466 fi
467
468 /sbin/powermt load > /dev/null 2>&1
469 /etc/opt/emcpower/emcpmgr map > /dev/null 2>&1
470 /etc/opt/emcpower/powercf -C > /dev/null 2>&1
471 if [ ! -e /etc/powermt.custom ]; then
472 /sbin/powermt save > /dev/null 2>&1
473 fi
474 /sbin/powermt register > /dev/null 2>&1
475 /sbin/powermig transition -startup -noprompt > /dev/null 2>&1
476}
477
478StartMpath() {
479 if [ "`grep -i nompath $CMDLINE`" ]; then
480 return;
481 fi
482 if [ "`grep mpath $MINDI_CACHE/mountlist.txt`" ]; then
483 if [ -x /sbin/multipath ]; then
484 echo "Starting Mpath..."
485 mkdir -p /var/lib/multipath
486 cat > /etc/multipath.conf << EOF
487defaults {
488 user_friendly_names yes
489}
490EOF
491 /sbin/multipath -v 0
492 if [ -x /sbin/kpartx ]; then
493 /sbin/dmsetup ls --target multipath --exec "/sbin/kpartx -a -p p"
494 fi
495 fi
496 fi
497}
498
499StartRaids() {
500 local raid_devices i
501
502 if [ "`grep -i noraid /proc/cmdline`" ]; then
503 return;
504 fi
505
506 raid_devices=`grep /dev/md $MINDI_CACHE/mountlist.txt | cut -d' ' -f1`
507 if which raidstart > /dev/null 2> /dev/null ; then
508 for i in $raid_devices ; do
509 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
510 LogIt "$i is started already; no need to run 'raidstart $i'" 1
511 else
512 LogIt "Running 'raidstart $i'" 1
513 raidstart $i
514 fi
515 done
516 elif which mdrun > /dev/null 2> /dev/null ; then
517 if [ "`grep -i nomd /proc/cmdline`" ]; then
518 return;
519 fi
520 LogIt "Running 'mdrun'" 1
521 mdrun
522 elif which mdadm > /dev/null 2> /dev/null ; then
523 if [ "`grep -i nomd /proc/cmdline`" ]; then
524 return;
525 fi
526 LogIt "Running 'mdadm'" 1
527 for i in $raid_devices ; do
528 if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
529 LogIt "$i is started already; no need to run 'mdadm $i'" 1
530 else
531 if [ -f /etc/mdadm.conf ] ; then
532 LogIt "Running 'mdadm $i' with user supplied /etc/mdadm.conf" 1
533 mdadm -A $i -c /etc/mdadm.conf
534 elif [ -f /etc/mdadm/mdadm.conf ] ; then
535 LogIt "Running 'mdadm $i' with user supplied /etc/mdadm/mdadm.conf" 1
536 mdadm -A $i -c /etc/mdadm/mdadm.conf
537 else
538 LogIt "Running 'mdadm $i'" 1
539 mdadm -Ac partitions -m dev $i
540 fi
541 fi
542 done
543 elif which dmraid > /dev/null 2> /dev/null ; then
544 if [ "`grep -i nodmraid $CMDLINE`" ]; then
545 return;
546 fi
547 for x in $(/sbin/dmraid -ay -i -p -t 2>/dev/null | grep -E -iv "^no " |awk -F ':' '{ print $1 }') ; do
548 echo "Please send the result of /sbin/dmraid -ay -i -p -t to the devteam !!!"
549 return
550 #dmname=$(resolve_dm_name $x)
551 #[ -z "$dmname" ] && continue
552 #/sbin/dmraid -ay -i -p "$dmname" >/dev/null 2>&1
553 #/sbin/kpartx -a -p p "/dev/mapper/$dmname"
554 done
555 else
556 LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
557 fi
558
559}
560
561
562TryAgainToFindCD() {
563 local res
564 mount | grep /mnt/cdrom && return 0
565 [ "`grep "backup_media_type" $MINDI_CACHE/mondorestore.cfg 2> /dev/null | grep "cdstream"`" ] && return
566 LogIt "Trying to mount CD-ROM a 2nd time..."
567 find-and-mount-cdrom --second-try
568 res=$?
569 if [ "$res" -eq "0" ] ; then
570 CD_MOUNTED_OK=yes
571 LogIt "CD-ROM drive mounted successfully." 1
572 else
573 LogIt "I still cannot find or mount the CD-ROM drive, by the way."
574 fi
575}
576
577
578
579UseTmpfs()
580{
581 local mount_cmd
582 echo -en "Mounting /tmp/tmpfs..."
583 mkdir -p /tmp/tmpfs
584# For technical reasons, some sets are as large as 16MB.
585# I am allowing 32MB because selective restore occupies a lot of space.
586 for size in 128m 64m 48m 40m 32m ; do
587 mount_cmd="mount /dev/shm -t tmpfs -o size=$size" ; # was 34m until 04/2003
588 LogIt "Trying '$mount_cmd'"
589 $mount_cmd /tmp/tmpfs 2>> $LOGFILE
590 res=$?
591 [ "$res" -eq "0" ] && break
592 done
593 if [ "$res" -ne "0" ] ; then
594 LogIt "Failed. I could not run '$mount_cmd /tmp/tmpfs'. Your kernel is BROKEN or you do not have enough RAM." 1
595 umount /tmp/tmpfs > /dev/null 2> /dev/null
596 rmdir /tmp/tmpfs
597 ln -sf /mnt/RESTORING/tmp /tmp/tmpfs; # used by mondo-restore
598 LogIt "Failed to mount /tmp/tmpfs; using ugly softlink instead"
599 else
600 LogIt "Great. Pivot succeeded w/ size=$size" 1
601 echo -en "Pivoting /tmp..."
602 umount /tmp/tmpfs
603 mkdir -p /tmp.old
604 mv /tmp/* /tmp.old/
605 rm -f /tmp/*
606 $mount_cmd /tmp
607 mv /tmp.old/* /tmp/
608 rm -rf /tmp.old
609 mkdir -p /tmp/tmpfs
610 echo "Done."
611 LogIt "Successfully mounted dynamic /tmp ramdisk"
612 fi
613}
614
615
616WelcomeMessage()
617{
618 echo "********************************************************************"
619 echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
620 echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
621which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
622 echo "Executables and source code are covered by the GNU GPL. No warranty."
623 echo "running on $ARCH"
624 echo "********************************************************************"
625}
626
627
628EnableCcissIfAppropriate() {
629 local i fname
630 for i in 0 1 2 3 ; do
631 fname="/proc/driver/cciss/cciss$i"
632 if [ -e "$fname" ] ; then
633 LogIt "Engaging $fname"
634 echo "engage scsi" > $fname
635 LogIt "...result=$?"
636 fi
637 done
638}
639
640ModprobeAllModules() {
641
642 lismod=`find /lib/modules -name '*\.ko*' -o -name '*\.o*'`
643 # loading forced modules first
644 for m in $lismod; do
645 k=`basename $m | sed 's/\.ko.*$//'`
646 j=`basename $k | sed 's/\.o.*$//'`
647 echo "$FORCE_MODS" | grep -q "$j "
648 if [ $? -eq 0 ]; then
649 echo "Forcing first $j..."
650 modprobe -q $j
651 fi
652 done
653 for m in $lismod; do
654 k=`basename $m | sed 's/\.ko.*$//'`
655 j=`basename $k | sed 's/\.o.*$//'`
656 echo "$DENY_MODS" | grep -q "$j "
657 if [ $? -eq 0 ]; then
658 echo "Denying $j..."
659 continue
660 fi
661 echo "$FORCE_MODS" | grep -q "$j "
662 if [ $? -eq 0 ]; then
663 continue
664 fi
665 echo "Probing $j..."
666 modprobe -q $j
667 done
668}
669
670ExtractDataDisksAndLoadModules() {
671 echo "Installing additional tools ..."
672 install-additional-tools
673 # Keep the kernel silent again
674 PKLVL=`cut -f1 /proc/sys/kernel/printk`
675 echo 0 > /proc/sys/kernel/printk
676 ModprobeAllModules
677 echo $PKLVL > /proc/sys/kernel/printk
678
679 # Retry failed udev events now that local filesystems are mounted read-write
680 # (useful for rules creating network ifcfg files)
681 if [ -e "$MINDI_CACHE/USE-UDEV" ] ; then
682 if [ -x /sbin/udevadm ]; then
683 /sbin/udevadm trigger --retry-failed
684 fi
685 fi
686}
687
688# ------------------------ main -----------------------
689
690MINDI_VER=PBVER
691MINDI_REV=PBREV
692trap CaughtSoftReset SIGTERM
693LOGFILE=/var/log/mondorestore.log
694PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
695GROOVY=$MINDI_CACHE/groovy-stuff
696USER=root
697ARCH=`uname -m`
698
699export PATH GROOVY USER LOGFILE ARCH
700
701echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV})"
702
703mount -o remount rw /
704[ ! "$GROOVY" ] && Die "I'm not groovy!"
705for i in /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
706 mkdir -p $i
707done
708#/bin/update
709mount /proc/ /proc -v -t proc
710mkdir /sys 2> /dev/null
711mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
712# For ESX 3
713[ -d /proc/vmware ] && ! grep -q /vmfs /proc/mounts && mount -t vmfs /vmfs /vmfs
714rm -f /foozero
715
716if [ "`grep -i denymods $CMDLINE`" ]; then
717 export DENY_MODS="`cat $CMDLINE | sed 's~.*denymods=\"\(.*\)\".*~\1~'` mondonone"
718else
719 export DENY_MODS=" "
720fi
721if [ "`grep -i 'obdr ' $MINDI_CACHE/mondorestore.cfg 2> /dev/null`" ]; then
722 # Do not try to load usb storage when dealing with OBDR it makes the modprobe hang :-(
723 export DENY_MODS="usb-storage $DENY_MODS"
724fi
725if [ "`grep -i forcemods $CMDLINE`" ]; then
726 export FORCE_MODS="`cat $CMDLINE | sed 's~.*forcemods=\"\(.*\)\".*~\1~'` mondonone"
727else
728 export FORCE_MODS=" "
729fi
730if [ "`grep -i excludedevs /proc/cmdline`" ]; then
731 export MINDI_EXCLUDE_DEVS="`cat /proc/cmdline | sed 's~.*excludedevs=\"\(.*\)\".*~\1~'` mondonone"
732else
733 export MINDI_EXCLUDE_DEVS=" "
734fi
735
736echo "Activating a potential USB keyboard/mouse"
737StartUSBKbd
738
739if [ -f /proc/sys/kernel/exec-shield ]; then
740 echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
741fi
742
743if [ -f /proc/modules ]; then
744 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
745fi
746
747if [ -e "$MINDI_CACHE/USE-UDEV" ] ; then
748 RunUdevd
749fi
750ExtractDevTarballs
751LaunchTerminals
752
753# Keeping kernel silent for module insertion
754PKLVL=`cut -f1 /proc/sys/kernel/printk`
755echo 0 > /proc/sys/kernel/printk
756ModprobeAllModules
757echo $PKLVL > /proc/sys/kernel/printk
758
759EnableCcissIfAppropriate
760#-------------------------------
761#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
762#-------------------------------
763UseTmpfs
764if [ ! -e "$MINDI_CACHE/mondorestore.cfg" ] ; then
765 LogIt "Warning - $MINDI_CACHE/mondorestore.cfg not found"
766fi
767if [ "`grep -i pxe $CMDLINE`" ] || [ "`grep -i net $CMDLINE`" ]; then
768 # We need to get here exported variables from start-netfs
769 . /sbin/start-netfs
770fi
771
772if [ "`grep -i 'obdr ' $MINDI_CACHE/mondorestore.cfg 2>/dev/null`" ] || [ "`grep -i ' udev' $MINDI_CACHE/mondorestore.cfg 2>/dev/null`" ]; then
773 HandleTape
774 ExtractDataDisksAndLoadModules
775elif [ "`grep -i pxe $CMDLINE`" ]; then
776 # Simulate a local CD
777 echo "/mnt/cdrom" > $MINDI_CACHE/CDROM-LIVES-HERE
778 CD_MOUNTED_OK=yes
779 ExtractDataDisksAndLoadModules
780 # Fake the conf file to force it to NFS mode, even if we made originally a CD (mandatory for mondorestore to work correctly)
781 sed -i "s/backup-media-type.*/backup-media-type netfs/" $MINDI_CACHE/mondorestore.cfg
782elif [ "`grep -i usb= $CMDLINE`" ] || [ "`grep -i usb $MINDI_CACHE/mondorestore.cfg 2>/dev/null | grep media-type`" ]; then
783 . /sbin/start-usb
784
785 # Simulate a local CD
786 echo "/mnt/cdrom" > $MINDI_CACHE/CDROM-LIVES-HERE
787 CD_MOUNTED_OK=yes
788 ExtractDataDisksAndLoadModules
789else
790 HandleCDROM
791 ExtractDataDisksAndLoadModules
792 # We need to get here exported variables from start-netfs
793 . /sbin/start-netfs
794fi
795res=$?
796ConfigureLoggingDaemons
797if [ -e "$MINDI_CACHE/USE-DEVFS" ] ; then
798 umount /mnt/cdrom 2> /dev/null
799 mv /dev/cdrom /cdrom.lnk 2> /dev/null
800 CD_MOUNTED_OK=""
801 RunDevfsd
802fi
803LoadKeymap
804WelcomeMessage
805RstHW
806StartRaids
807StartMpath
808StartLvms
809CopyBootDevEntry
810mkdir -p /tmp/tmpfs
811sleep 2
812if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ $MINDI_CACHE/mountlist.txt`" != "" ] ; then
813 LogIt "Creating /dev/md/* softlinks just in case." 1
814 mkdir -p /dev/md
815 cp -af /dev/md0 /dev/md/0 2> /dev/null
816 cp -af /dev/md1 /dev/md/1 2> /dev/null
817 cp -af /dev/md2 /dev/md/2 2> /dev/null
818fi
819[ -e "$MINDI_CACHE/mountlist.txt" ] && cp -f $MINDI_CACHE/mountlist.txt $MINDI_CACHE/mountlist.original
820
821if ! [ "`grep -i "pxe" $CMDLINE`" ] ; then
822 res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
823 [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
824 [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
825 [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
826 #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
827fi
828hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
829
830# Log some useful info
831LogIt "init (from mindi v$MINDI_VER-r${MINDI_REV})"
832LogIt "$CMDLINE is:"
833LogIt "----------"
834cat $CMDLINE >> $LOGFILE
835LogIt "----------"
836LogIt "df result:"
837LogIt "----------"
838df >> $LOGFILE
839LogIt "-------------"
840LogIt "mount result:"
841LogIt "-------------"
842mount >> $LOGFILE
843LogIt "-------------"
844LogIt "lsmod result:"
845LogIt "-------------"
846lsmod >> $LOGFILE
847LogIt "-------------"
848LogIt "dmesg result:"
849LogIt "-------------"
850dmesg >> $LOGFILE
851LogIt "-------------"
852LogIt "/proc/swaps:" >> $LOGFILE
853LogIt "-------------"
854cat /proc/swaps >> $LOGFILE
855LogIt "-------------"
856LogIt "/proc/filesystems:" >> $LOGFILE
857LogIt "-------------"
858cat /proc/filesystems >> $LOGFILE
859LogIt "-------------"
860LogIt "/proc/partitions:" >> $LOGFILE
861LogIt "-------------"
862cat /proc/partitions >> $LOGFILE
863LogIt "-------------"
864LogIt "fdisk result:" >> $LOGFILE
865LogIt "-------------"
866fdisk -l >> $LOGFILE
867
868ide-opt
869
870# Not sure it's still needed, but shouldn't hurt
871if [ -e "/tmp/USE-UDEV" ] ; then
872 if [ -x /sbin/udevadm ]; then
873 /sbin/udevadm trigger --retry-failed
874 fi
875fi
876if grep "backup-media-type" $MINDI_CACHE/mondorestore.cfg > /dev/null 2> /dev/null ; then
877 LogIt "backup-media-type is specified in config file - great."
878 LogIt "Calling post-init"
879 # start-netfs moved it under /tmp as the NFS share is already unmounted
880 if [ "`echo $pre | grep -E '^/tmp/isodir'`" ]; then
881 pre=`echo $pre | sed 's|^/tmp/isodir|/tmp|'`
882 fi
883 if [ -x $pre ]; then
884 echo "Executing preliminary script $pre"
885 LogIt "Executing preliminary script $pre"
886 $pre
887 fi
888 post-init
889else
890 LogIt "backup-media-type is not specified in config file."
891 LogIt "I think this media has no archives on it."
892fi
893if [ "`grep -i "post=" $CMDLINE`" ] ; then
894 for i in `cat $CMDLINE` ; do
895 echo $i | grep -qi post= && post=`echo $i | cut -d= -f2`
896 done
897 # start-netfs moved it under /tmp as the NFS share is already unmounted
898 if [ "`echo $post | grep -E '^/tmp/isodir'`" ]; then
899 post=`echo $post | sed 's|^/tmp/isodir|/tmp|'`
900 fi
901 if [ -x $post ]; then
902 echo "Executing final script $post"
903 LogIt "Executing final script $post"
904 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
905 mount-me
906 fi
907 $post
908 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
909 unmount-me
910 fi
911 fi
912fi
913if grep "RESTORE" $CMDLINE > /dev/null 2> /dev/null ; then
914 echo "Rebooting in 10 seconds automatically as per reboot order"
915 echo -en "Press ^C to interrupt if you have to ..."
916 for i in 1 2 3 4 5 6 7 8 9 10 ; do
917 sleep 1
918 echo -en "."
919 done
920 echo "Boom."
921 sleep 1
922else
923 echo -en "Type 'exit' to reboot the PC\n"
924 umount /mnt/cdrom 2> /dev/null
925 mount / -o rw,remount > /dev/null 2> /dev/null
926 LogIt "Launching Shell"
927 sh
928fi
929CaughtSoftReset
930# reboot
Note: See TracBrowser for help on using the repository browser.