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

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

r3737@localhost: bruno | 2010-03-14 20:57:44 +0100

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