source: MondoRescue/branches/2.2.9/mindi/rootfs/etc/init.d/rcS@ 2893

Last change on this file since 2893 was 2893, checked in by Bruno Cornec, 13 years ago
  • Fix #499 for good, by using a real init from busybox and moving our init script to etc/init.d/rcS. We also now call the reboot from busybox to exit, which indeed reset the system correctly (in a VM at least which wasn't the case before). Reauires a new mindi-busybox as well.
  • Property svn:keywords set to Id
File size: 26.1 KB
RevLine 
[1]1#!/bin/sh
2#
[736]3# $Id: rcS 2893 2011-10-18 10:09:41Z 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() {
[1747]653 local i fname
654 for i in 0 1 2 3 ; do
[1410]655 fname="/proc/driver/cciss/cciss$i"
656 if [ -e "$fname" ] ; then
657 LogIt "Engaging $fname"
658 echo "engage scsi" > $fname
659 LogIt "...result=$?"
660 fi
[1747]661 done
[1]662}
663
[1802]664ModprobeAllModules() {
[1]665
[2562]666 lismod=`find /lib/modules -name '*\.ko*' -o -name '*\.o*'`
667 # loading forced modules first
668 for m in $lismod; do
[1927]669 k=`basename $m | sed 's/\.ko.*$//'`
670 j=`basename $k | sed 's/\.o.*$//'`
[2562]671 echo "$FORCE_MODS" | grep -q "$j "
672 if [ $? -eq 0 ]; then
673 echo "Forcing first $j..."
674 modprobe -q $j
675 fi
676 done
677 for m in $lismod; do
678 k=`basename $m | sed 's/\.ko.*$//'`
679 j=`basename $k | sed 's/\.o.*$//'`
[1830]680 echo "$DENY_MODS" | grep -q "$j "
[1829]681 if [ $? -eq 0 ]; then
[1830]682 echo "Denying $j..."
[1829]683 continue
684 fi
[2562]685 echo "$FORCE_MODS" | grep -q "$j "
686 if [ $? -eq 0 ]; then
687 continue
688 fi
[1829]689 echo "Probing $j..."
[1815]690 modprobe -q $j
[1802]691 done
692}
693
[2755]694UdevadmTrigger() {
[2844]695
696if [ -x /sbin/udevadm ]; then
[2885]697 v=`/sbin/udevadm --version`
698 if [ "$v" -ge "146" ]; then
699 /sbin/udevadm trigger --type=failed
[2755]700 else
701 /sbin/udevadm trigger --retry-failed
702 fi
[2844]703fi
[2755]704}
705
[287]706ExtractDataDisksAndLoadModules() {
[2846]707 LogIt "Installing additional tools ..." 1
[2888]708 # BCO: test return value
[287]709 install-additional-tools
[1800]710 # Keep the kernel silent again
711 PKLVL=`cut -f1 /proc/sys/kernel/printk`
[1802]712 echo 0 > /proc/sys/kernel/printk
[1922]713 ModprobeAllModules
[1800]714 echo $PKLVL > /proc/sys/kernel/printk
[2081]715
716 # Retry failed udev events now that local filesystems are mounted read-write
717 # (useful for rules creating network ifcfg files)
718 if [ -e "/tmp/USE-UDEV" ] ; then
[2755]719 UdevadmTrigger
[2081]720 fi
[287]721}
[1]722
723# ------------------------ main -----------------------
724
[1698]725MINDI_VER=PBVER
726MINDI_REV=PBREV
[1]727trap CaughtSoftReset SIGTERM
[2888]728trap GetShell SIGINTR
[1643]729LOGFILE=/var/log/mondorestore.log
[1236]730PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
[1]731GROOVY=/tmp/groovy-stuff
732USER=root
[2163]733ARCH=`uname -m`
[1]734
[2163]735export PATH GROOVY USER LOGFILE ARCH
736
[1716]737echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV})"
[898]738
[1]739mount -o remount rw /
740[ ! "$GROOVY" ] && Die "I'm not groovy!"
[1885]741for i in $GROOVY /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
[1747]742 mkdir -p $i
[1]743done
744#/bin/update
745mount /proc/ /proc -v -t proc
746mkdir /sys 2> /dev/null
747mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
[1824]748# For ESX 3
749[ -d /proc/vmware ] && ! grep -q /vmfs /proc/mounts && mount -t vmfs /vmfs /vmfs
[1]750rm -f /foozero
751
[1829]752if [ "`grep -i denymods /proc/cmdline`" ]; then
753 export DENY_MODS="`cat /proc/cmdline | sed 's~.*denymods=\"\(.*\)\".*~\1~'` mondonone"
[1830]754else
755 export DENY_MODS=" "
[1829]756fi
[1983]757if [ "`grep -i 'obdr ' /tmp/mondo-restore.cfg 2> /dev/null`" ]; then
[1958]758 # Do not try to load usb storage when dealing with OBDR it makes the modprobe hang :-(
[1960]759 export DENY_MODS="usb-storage $DENY_MODS"
[1958]760fi
[1829]761if [ "`grep -i forcemods /proc/cmdline`" ]; then
762 export FORCE_MODS="`cat /proc/cmdline | sed 's~.*forcemods=\"\(.*\)\".*~\1~'` mondonone"
[1830]763else
764 export FORCE_MODS=" "
[1829]765fi
[2533]766if [ "`grep -i excludedevs /proc/cmdline`" ]; then
[2564]767 export MINDI_EXCLUDE_DEVS="`cat /proc/cmdline | sed 's~.*excludedevs=\"\(.*\)\".*~\1~'` mondonone"
[2580]768 for d in $MINDI_EXCLUDE_DEVS ; do
769 echo "Mountlist exclusion == $d"
770 perl -i -ne 'print $_ unless m~$d~' /tmp/mountlist.txt
771 done
[2533]772else
[2564]773 export MINDI_EXCLUDE_DEVS=" "
[2533]774fi
[1829]775
[1826]776echo "Activating a potential USB keyboard/mouse"
[1787]777StartUSBKbd
778
[1720]779if [ -f /proc/sys/kernel/exec-shield ]; then
780 echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
781fi
[1]782
[1729]783if [ -f /proc/modules ]; then
784 echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
785fi
786
[1716]787if [ -e "/tmp/USE-UDEV" ] ; then
[1747]788 RunUdevd
[1716]789fi
[1798]790ExtractDevTarballs
[1]791LaunchTerminals
[1718]792
[1789]793# Keeping kernel silent for module insertion
794PKLVL=`cut -f1 /proc/sys/kernel/printk`
795echo 0 > /proc/sys/kernel/printk
[1922]796ModprobeAllModules
[1789]797echo $PKLVL > /proc/sys/kernel/printk
[1718]798
[1]799EnableCcissIfAppropriate
800#-------------------------------
801#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
802#-------------------------------
803UseTmpfs
804if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
[1747]805 LogIt "Warning - /tmp/mondo-restore.cfg not found"
[1]806fi
[2182]807if [ "`grep -i pxe /proc/cmdline`" ] || [ "`grep -i net /proc/cmdline`" ]; then
[2380]808 # We need to get here exported variables from start-netfs
809 . /sbin/start-netfs
[2182]810fi
[1]811
[1983]812if [ "`grep -i 'obdr ' /tmp/mondo-restore.cfg 2>/dev/null`" ] || [ "`grep -i ' udev' /tmp/mondo-restore.cfg 2>/dev/null`" ]; then
[1747]813 HandleTape
[287]814 ExtractDataDisksAndLoadModules
[737]815elif [ "`grep -i pxe /proc/cmdline`" ]; then
[287]816 # Simulate a local CD
817 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
[1747]818 CD_MOUNTED_OK=yes
[287]819 ExtractDataDisksAndLoadModules
[2182]820 # Fake the conf file to force it to NFS mode, even if we made originally a CD (mandatory for mondorestore to work correctly)
[2380]821 sed -i "s/backup-media-type.*/backup-media-type netfs/" /tmp/mondo-restore.cfg
[1983]822elif [ "`grep -i usb= /proc/cmdline`" ] || [ "`grep -i usb /tmp/mondo-restore.cfg 2>/dev/null | grep media-type`" ]; then
[1747]823 . /sbin/start-usb
[1698]824
825 # Simulate a local CD
826 echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
[1747]827 CD_MOUNTED_OK=yes
[1698]828 ExtractDataDisksAndLoadModules
[1]829else
[1885]830 HandleCDROM
[287]831 ExtractDataDisksAndLoadModules
[2380]832 # We need to get here exported variables from start-netfs
833 . /sbin/start-netfs
[1]834fi
835res=$?
836ConfigureLoggingDaemons
837if [ -e "/tmp/USE-DEVFS" ] ; then
[2878]838 umount -d /mnt/cdrom 2> /dev/null
[1747]839 mv /dev/cdrom /cdrom.lnk 2> /dev/null
840 CD_MOUNTED_OK=""
841 RunDevfsd
[1]842fi
[1813]843LoadKeymap
844WelcomeMessage
845RstHW
[2559]846echo "Starting potential Raid/Multipath ..."
[2580]847[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
[1]848PauseForRaids
849StartRaids
[2072]850StartMpath
[1]851StartLvms
852CopyBootDevEntry
853mkdir -p /tmp/tmpfs
854sleep 2
855#clear
[241]856if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
[1747]857 LogIt "Creating /dev/md/* softlinks just in case." 1
858 mkdir -p /dev/md
859 cp -af /dev/md0 /dev/md/0 2> /dev/null
860 cp -af /dev/md1 /dev/md/1 2> /dev/null
861 cp -af /dev/md2 /dev/md/2 2> /dev/null
[1]862fi
863
[241]864if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
[1]865 res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
866 [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
867 [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
868 [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
869 #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
870fi
871hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
872
[1403]873# Log some useful info
[1837]874LogIt "init (from mindi v$MINDI_VER-r${MINDI_REV})"
[1413]875LogIt "/proc/cmdline is:"
[2346]876LogIt "----------"
[1403]877cat /proc/cmdline >> $LOGFILE
[2346]878LogIt "----------"
[1413]879LogIt "df result:"
880LogIt "----------"
[1403]881df >> $LOGFILE
[1413]882LogIt "-------------"
883LogIt "mount result:"
884LogIt "-------------"
[1403]885mount >> $LOGFILE
[1413]886LogIt "-------------"
887LogIt "lsmod result:"
888LogIt "-------------"
[1403]889lsmod >> $LOGFILE
[1413]890LogIt "-------------"
[1476]891LogIt "dmesg result:"
892LogIt "-------------"
893dmesg >> $LOGFILE
[2015]894LogIt "-------------"
895LogIt "/proc/swaps:" >> $LOGFILE
896LogIt "-------------"
897cat /proc/swaps >> $LOGFILE
898LogIt "-------------"
899LogIt "/proc/filesystems:" >> $LOGFILE
900LogIt "-------------"
901cat /proc/filesystems >> $LOGFILE
902LogIt "-------------"
903LogIt "/proc/partitions:" >> $LOGFILE
904LogIt "-------------"
905cat /proc/partitions >> $LOGFILE
[2346]906LogIt "-------------"
907LogIt "fdisk result:" >> $LOGFILE
908LogIt "-------------"
909fdisk -l >> $LOGFILE
[2768]910LogIt "-------------"
[2832]911if [ -f /tmp/mondo-restore.cfg ]; then
912 LogIt "/tmp/mondo-restore.cfg result:" >> $LOGFILE
913 LogIt "-------------"
914 cat /tmp/mondo-restore.cfg >> $LOGFILE
915fi
[1403]916
[1983]917ide-opt
[1]918
919#ctrlaltdel soft
920for i in null stdout stdin stderr ; do
[1747]921 cp -af /dev/$i /tmp
[1]922done
[2081]923# Not sure it's still needed, but shouldn't hurt
924if [ -e "/tmp/USE-UDEV" ] ; then
[2844]925 UdevadmTrigger
[2081]926fi
[1]927if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
[1747]928 LogIt "backup-media-type is specified in config file - great."
[2197]929 LogIt "Calling post-init"
[2380]930 # start-netfs moved it under /tmp as the NFS share is already unmounted
[2255]931 if [ "`echo $pre | grep -E '^/tmp/isodir'`" ]; then
[2533]932 pre=`echo $pre | sed 's|^/tmp/isodir|/tmp|'`
[2255]933 fi
934 if [ -x $pre ]; then
935 echo "Executing preliminary script $pre"
936 LogIt "Executing preliminary script $pre"
937 $pre
938 fi
[1747]939 post-init
[1]940else
[1747]941 LogIt "backup-media-type is not specified in config file."
[1885]942 LogIt "I think this media has no archives on it."
[1]943fi
[2255]944if [ "`grep -i "post=" /proc/cmdline`" ] ; then
[2249]945 for i in `cat /proc/cmdline` ; do
[2255]946 echo $i | grep -qi post= && post=`echo $i | cut -d= -f2`
[2249]947 done
[2380]948 # start-netfs moved it under /tmp as the NFS share is already unmounted
[2255]949 if [ "`echo $post | grep -E '^/tmp/isodir'`" ]; then
950 post=`echo $post | sed 's|^/tmp/isodir|/tmp|'`
[2253]951 fi
[2581]952 if [ -r $post ]; then
[2255]953 echo "Executing final script $post"
954 LogIt "Executing final script $post"
955 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
[2253]956 mount-me
957 fi
[2581]958 chmod 755 $post
[2255]959 $post
960 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
[2253]961 unmount-me
962 fi
[2249]963 fi
964fi
[1612]965if grep "RESTORE" /proc/cmdline > /dev/null 2> /dev/null ; then
966 echo "Rebooting in 10 seconds automatically as per reboot order"
967 echo -en "Press ^C to interrupt if you have to ..."
968 for i in 1 2 3 4 5 6 7 8 9 10 ; do
969 sleep 1
970 echo -en "."
971 done
972 echo "Boom."
973 sleep 1
974else
[2888]975 GetShell
[1612]976fi
[1]977CaughtSoftReset
Note: See TracBrowser for help on using the repository browser.