source: MondoRescue/branches/2.2.9/mindi/rootfs/sbin/init@ 2885

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