source: MondoRescue/branches/2.2.9/mindi/rootfs/sbin/init@ 2888

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