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

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