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

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