source: MondoRescue/branches/3.2/mindi/rootfs/etc/init.d/rcS@ 3277

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