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

Last change on this file since 2913 was 2913, checked in by Bruno Cornec, 12 years ago
  • Fix #358 by using an external program (hpsa_obdr_mode) which can set the mode of the tape to CD-ROM or Sequential at will.

That program will have to be downloaded from http://cciss.sf.net

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