source: MondoRescue/branches/3.0/mindi/rootfs/etc/init.d/rcS@ 3104

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