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

Last change on this file since 2878 was 2878, checked in by Bruno Cornec, 13 years ago
  • Uses the -d option of the mount command to avoid leaving loop devices in use. Probably provoked by the usage of a more recent busybox, but anyway that option doesn't hurt, and does nothing for non-loop devices. Should fix the problems reported on the ML with NFS and more than 8 ISO images (8 being the default number of loop devices available)
  • Property svn:keywords set to Id
File size: 26.0 KB
Line 
1#!/bin/sh
2#
3# $Id: init 2878 2011-10-04 23:20:58Z bruno $
4#
5# init script launched during the restore process
6#------------------------------------------------------------
7
8
9CaughtSoftReset() {
10 trap SIGTERM
11 reboot
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 if [ `/sbin/udevadm --version` -ge 146 ]; then
690 /sbin/udevadm triger --type=failed
691 else
692 /sbin/udevadm trigger --retry-failed
693 fi
694fi
695}
696
697ExtractDataDisksAndLoadModules() {
698 LogIt "Installing additional tools ..." 1
699 install-additional-tools
700 # Keep the kernel silent again
701 PKLVL=`cut -f1 /proc/sys/kernel/printk`
702 echo 0 > /proc/sys/kernel/printk
703 ModprobeAllModules
704 echo $PKLVL > /proc/sys/kernel/printk
705
706 # Retry failed udev events now that local filesystems are mounted read-write
707 # (useful for rules creating network ifcfg files)
708 if [ -e "/tmp/USE-UDEV" ] ; then
709 UdevadmTrigger
710 fi
711}
712
713# ------------------------ main -----------------------
714
715MINDI_VER=PBVER
716MINDI_REV=PBREV
717trap CaughtSoftReset SIGTERM
718LOGFILE=/var/log/mondorestore.log
719PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
720GROOVY=/tmp/groovy-stuff
721USER=root
722ARCH=`uname -m`
723
724export PATH GROOVY USER LOGFILE ARCH
725
726echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV})"
727
728mount -o remount rw /
729[ ! "$GROOVY" ] && Die "I'm not groovy!"
730for i in $GROOVY /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
731 mkdir -p $i
732done
733#/bin/update
734mount /proc/ /proc -v -t proc
735mkdir /sys 2> /dev/null
736mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
737# For ESX 3
738[ -d /proc/vmware ] && ! grep -q /vmfs /proc/mounts && mount -t vmfs /vmfs /vmfs
739rm -f /foozero
740
741if [ "`grep -i denymods /proc/cmdline`" ]; then
742 export DENY_MODS="`cat /proc/cmdline | sed 's~.*denymods=\"\(.*\)\".*~\1~'` mondonone"
743else
744 export DENY_MODS=" "
745fi
746if [ "`grep -i 'obdr ' /tmp/mondo-restore.cfg 2> /dev/null`" ]; then
747 # Do not try to load usb storage when dealing with OBDR it makes the modprobe hang :-(
748 export DENY_MODS="usb-storage $DENY_MODS"
749fi
750if [ "`grep -i forcemods /proc/cmdline`" ]; then
751 export FORCE_MODS="`cat /proc/cmdline | sed 's~.*forcemods=\"\(.*\)\".*~\1~'` mondonone"
752else
753 export FORCE_MODS=" "
754fi
755if [ "`grep -i excludedevs /proc/cmdline`" ]; then
756 export MINDI_EXCLUDE_DEVS="`cat /proc/cmdline | sed 's~.*excludedevs=\"\(.*\)\".*~\1~'` mondonone"
757 for d in $MINDI_EXCLUDE_DEVS ; do
758 echo "Mountlist exclusion == $d"
759 perl -i -ne 'print $_ unless m~$d~' /tmp/mountlist.txt
760 done
761else
762 export MINDI_EXCLUDE_DEVS=" "
763fi
764
765echo "Activating a potential USB keyboard/mouse"
766StartUSBKbd
767
768if [ -f /proc/sys/kernel/exec-shield ]; then
769 echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
770fi
771
772if [ -f /proc/modules ]; then
773 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
774fi
775
776if [ -e "/tmp/USE-UDEV" ] ; then
777 RunUdevd
778fi
779ExtractDevTarballs
780LaunchTerminals
781
782# Keeping kernel silent for module insertion
783PKLVL=`cut -f1 /proc/sys/kernel/printk`
784echo 0 > /proc/sys/kernel/printk
785ModprobeAllModules
786echo $PKLVL > /proc/sys/kernel/printk
787
788EnableCcissIfAppropriate
789#-------------------------------
790#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
791#-------------------------------
792UseTmpfs
793if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
794 LogIt "Warning - /tmp/mondo-restore.cfg not found"
795fi
796if [ "`grep -i pxe /proc/cmdline`" ] || [ "`grep -i net /proc/cmdline`" ]; then
797 # We need to get here exported variables from start-netfs
798 . /sbin/start-netfs
799fi
800
801if [ "`grep -i 'obdr ' /tmp/mondo-restore.cfg 2>/dev/null`" ] || [ "`grep -i ' udev' /tmp/mondo-restore.cfg 2>/dev/null`" ]; then
802 HandleTape
803 ExtractDataDisksAndLoadModules
804elif [ "`grep -i pxe /proc/cmdline`" ]; then
805 # Simulate a local CD
806 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
807 CD_MOUNTED_OK=yes
808 ExtractDataDisksAndLoadModules
809 # Fake the conf file to force it to NFS mode, even if we made originally a CD (mandatory for mondorestore to work correctly)
810 sed -i "s/backup-media-type.*/backup-media-type netfs/" /tmp/mondo-restore.cfg
811elif [ "`grep -i usb= /proc/cmdline`" ] || [ "`grep -i usb /tmp/mondo-restore.cfg 2>/dev/null | grep media-type`" ]; then
812 . /sbin/start-usb
813
814 # Simulate a local CD
815 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
816 CD_MOUNTED_OK=yes
817 ExtractDataDisksAndLoadModules
818else
819 HandleCDROM
820 ExtractDataDisksAndLoadModules
821 # We need to get here exported variables from start-netfs
822 . /sbin/start-netfs
823fi
824res=$?
825ConfigureLoggingDaemons
826if [ -e "/tmp/USE-DEVFS" ] ; then
827 umount -d /mnt/cdrom 2> /dev/null
828 mv /dev/cdrom /cdrom.lnk 2> /dev/null
829 CD_MOUNTED_OK=""
830 RunDevfsd
831fi
832LoadKeymap
833WelcomeMessage
834RstHW
835echo "Starting potential Raid/Multipath ..."
836[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
837PauseForRaids
838StartRaids
839StartMpath
840StartLvms
841CopyBootDevEntry
842mkdir -p /tmp/tmpfs
843sleep 2
844#clear
845if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
846 LogIt "Creating /dev/md/* softlinks just in case." 1
847 mkdir -p /dev/md
848 cp -af /dev/md0 /dev/md/0 2> /dev/null
849 cp -af /dev/md1 /dev/md/1 2> /dev/null
850 cp -af /dev/md2 /dev/md/2 2> /dev/null
851fi
852
853if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
854 res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
855 [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
856 [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
857 [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
858 #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
859fi
860hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
861
862# Log some useful info
863LogIt "init (from mindi v$MINDI_VER-r${MINDI_REV})"
864LogIt "/proc/cmdline is:"
865LogIt "----------"
866cat /proc/cmdline >> $LOGFILE
867LogIt "----------"
868LogIt "df result:"
869LogIt "----------"
870df >> $LOGFILE
871LogIt "-------------"
872LogIt "mount result:"
873LogIt "-------------"
874mount >> $LOGFILE
875LogIt "-------------"
876LogIt "lsmod result:"
877LogIt "-------------"
878lsmod >> $LOGFILE
879LogIt "-------------"
880LogIt "dmesg result:"
881LogIt "-------------"
882dmesg >> $LOGFILE
883LogIt "-------------"
884LogIt "/proc/swaps:" >> $LOGFILE
885LogIt "-------------"
886cat /proc/swaps >> $LOGFILE
887LogIt "-------------"
888LogIt "/proc/filesystems:" >> $LOGFILE
889LogIt "-------------"
890cat /proc/filesystems >> $LOGFILE
891LogIt "-------------"
892LogIt "/proc/partitions:" >> $LOGFILE
893LogIt "-------------"
894cat /proc/partitions >> $LOGFILE
895LogIt "-------------"
896LogIt "fdisk result:" >> $LOGFILE
897LogIt "-------------"
898fdisk -l >> $LOGFILE
899LogIt "-------------"
900if [ -f /tmp/mondo-restore.cfg ]; then
901 LogIt "/tmp/mondo-restore.cfg result:" >> $LOGFILE
902 LogIt "-------------"
903 cat /tmp/mondo-restore.cfg >> $LOGFILE
904fi
905
906ide-opt
907
908#ctrlaltdel soft
909for i in null stdout stdin stderr ; do
910 cp -af /dev/$i /tmp
911done
912# Not sure it's still needed, but shouldn't hurt
913if [ -e "/tmp/USE-UDEV" ] ; then
914 UdevadmTrigger
915fi
916if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
917 LogIt "backup-media-type is specified in config file - great."
918 LogIt "Calling post-init"
919 # start-netfs moved it under /tmp as the NFS share is already unmounted
920 if [ "`echo $pre | grep -E '^/tmp/isodir'`" ]; then
921 pre=`echo $pre | sed 's|^/tmp/isodir|/tmp|'`
922 fi
923 if [ -x $pre ]; then
924 echo "Executing preliminary script $pre"
925 LogIt "Executing preliminary script $pre"
926 $pre
927 fi
928 post-init
929else
930 LogIt "backup-media-type is not specified in config file."
931 LogIt "I think this media has no archives on it."
932fi
933if [ "`grep -i "post=" /proc/cmdline`" ] ; then
934 for i in `cat /proc/cmdline` ; do
935 echo $i | grep -qi post= && post=`echo $i | cut -d= -f2`
936 done
937 # start-netfs moved it under /tmp as the NFS share is already unmounted
938 if [ "`echo $post | grep -E '^/tmp/isodir'`" ]; then
939 post=`echo $post | sed 's|^/tmp/isodir|/tmp|'`
940 fi
941 if [ -r $post ]; then
942 echo "Executing final script $post"
943 LogIt "Executing final script $post"
944 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
945 mount-me
946 fi
947 chmod 755 $post
948 $post
949 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
950 unmount-me
951 fi
952 fi
953fi
954if grep "RESTORE" /proc/cmdline > /dev/null 2> /dev/null ; then
955 echo "Rebooting in 10 seconds automatically as per reboot order"
956 echo -en "Press ^C to interrupt if you have to ..."
957 for i in 1 2 3 4 5 6 7 8 9 10 ; do
958 sleep 1
959 echo -en "."
960 done
961 echo "Boom."
962 sleep 1
963else
964 echo -en "Type 'exit' to reboot the PC\n"
965 umount -d /mnt/cdrom 2> /dev/null
966 mount / -o rw,remount > /dev/null 2> /dev/null
967 LogIt "Launching Shell"
968 sh
969fi
970CaughtSoftReset
971# reboot
Note: See TracBrowser for help on using the repository browser.