source: MondoRescue/branches/2.2.10/mindi/rootfs/sbin/init@ 2592

Last change on this file since 2592 was 2592, checked in by Bruno Cornec, 14 years ago

r3724@localhost: bruno | 2010-03-10 00:46:58 +0100

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