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

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