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

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