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

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