root/branches/2.2.10/mindi/rootfs/sbin/init

Revision 2569, 24.9 kB (checked in by bruno, 7 months ago)

svn merge -r 2545:2567 /mondorescue/branches/2.2.9

- Improve device exclusion for LVM by adding support for symlinks and mapper systematically at all levels (PV, VG, LV). Shoul
d really provvide the best support possible for LVM exclusion.
- Now supports also exclusion of LVs directly
- Improve mindi by handling excluded devices earlier in the loop.
- Fix LV exclusion when VGs are excluded (the excludedvgs file has to be removed at start and end of analyze-my-lvm not in fu
nctions, as they are called multiple times)
- Rename some variables exported to avoid accidental conflict (EXCLUDE_DEVS => MINDI_EXCLUDE_DEVS and ADDITIONAL_BOOT_PARAMS
=> MINDI_ADDITIONAL_BOOT_PARAMS)
- setfattr also needs the -h flag to restore attributes on symlinks, not on the target file (which may not exist BTW). Should

solve #388.

- Using forcemods="mod1 mod2" will now do something and load those modules first
- Update web page on distributions to download
- Add support for ums_cypress module in mindi
- Fix acl backup which was completely wrong.
- Fix a bug where LV were not created anymore if no exclusion !!
- In analyze-my-lvm only use pv.tmp2 when it exists to avoid error msgs
-Adds support for links to modules (.ko pointing to .o) such as with VMWare extensions
- Adds i-want-my-lvm content in mindi log file
- Adds vmxnet3 driver support to mindi for some VMWare versions
- Fix a typo in the way device mapper files where excluded
- use option -h of getfattr to *not* follow symlinks, which breaks RHEL 5.4 as reported in #388. However, getfacl doesn't provide such an option.
- Adds some logs for filelist creation
- Remove option -P from getfattr which may also skip symlinks - Attempt to solve #388
- Exclude rpc_pipefs type of filesystems from find
- Suppress unused mode_of_file function

  • Property svn:executable set to
  • Property svn:keywords set to Id
Line 
1 #!/bin/sh
2 #
3 # $Id$
4 #
5 # init script launched during the restore process
6 #------------------------------------------------------------
7
8 export MINDI_CACHE=CCC
9
10 if [ -e "/proc/cmdline" ]; then
11         export CMDLINE="/proc/cmdline"
12 elif [ -e "/tmp/cmdline" ]; then
13         export CMDLINE="/tmp/cmdline"
14 else
15         export CMDLINE="/dev/null"
16 fi
17
18
19
20 CaughtSoftReset() {
21         trap SIGTERM
22         reboot
23 }
24
25
26 ConfigureLoggingDaemons() {
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."
33 }
34
35
36
37 CopyBootDevEntry() {
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
44                 echo "not needed."
45                 return 0
46         fi
47         mkdir -p $outfile
48         rmdir $outfile
49         cp -pRdf $devfile $outfile
50         if [ "$?" -ne "0" ] ; then
51                 echo "Failed."
52                 return 1
53         else
54                 echo "OK."
55                 return 0
56         fi
57 }
58
59
60
61 Die() {
62         LogIt "Fatal error! $1" 1
63         exit 1
64 }
65
66
67
68 ExtractDevTarballs() {
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"
76                         rm -f /$fname
77                 fi
78         done
79         echo -en "\r"
80         LogIt "Extracted additional /dev entries OK.     " 1
81 }
82
83
84
85 LaunchTerminals() {
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
93         # May avoid shell error messages
94         # chmod 666 /dev/tty* /dev/console
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
100         # Doing that is only valid when using a real serial line
101         if [ -f $serial ]; then
102                 LogIt "Redirecting serial $serial to /dev/tty" 1
103                 ln -s -f $serial /dev/tty
104         fi
105 }
106
107
108 LoadKeymap() {
109         local fname
110         fname=`cat $MINDI_CACHE/KEYMAP-LIVES-HERE 2> /dev/null`
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
117 }
118
119
120 UntarTapeStuff() {
121         local old_pwd res
122         old_pwd=`pwd`
123         cd $GROOVY
124         [ "$1" != "" ] && tapedev=$1
125         [ ! "$tapedev" ] && tapedev=`grep media-dev $MINDI_CACHE/mondorestore.cfg 2>/dev/null | tr -s ' ' ' ' | cut -d' ' -f2`
126         mt -f $tapedev rewind
127         mt -f $tapedev fsf 2
128         dd if=$tapedev bs=32k count=1024 | tar -zx
129         res=$?
130         if [ "$res" -eq "0" ] ; then
131                 # Store the dev name in case we changed it interactively
132                 if [ -f "$MINDI_CACHE/mondorestore.cfg" ]; then
133                         sed -i "s/^media-dev .*$/media-dev  $tapedev/" $MINDI_CACHE/mondorestore.cfg
134                 fi
135         fi
136         cd $old_pwd
137         return $res
138 }
139
140 HandleTape() {
141         local res tapedev
142         tapedev="" ; # will be set by UntarTapeStuff()
143
144         # Here we can add the USB storage module, it's working even with OBDR !
145         modprobe -q usb-storage
146         # Tape takes some time to appear
147         sleep 10
148         UntarTapeStuff $tapedev
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
153                 LogIt "or hit <Enter> to boot from another media." 1
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
163             break
164                 fi
165         done
166         # For post-init
167         export TAPEDEV=$tapedev
168
169         if [ "$res" -ne "0" ] ; then
170                 LogIt "Failed to use tape as extended datadisk. Reverting to another media." 1
171                 HandleCDROM
172                 res=$?
173         else
174                 LogIt "Using tape as extended datadisk. Good." 3
175                 echo "Using tape as extd ddisk." > /tmp/TAPEDEV-HAS-DATA-DISKS
176                 res=0
177                 CD_MOUNTED_OK=yes
178         fi
179         return $res
180 }
181
182
183
184 HandleCDROM() {
185         # Just in case we have an iLO ensure we will map it correctly
186         echo "$DENY_MODS" | grep -q "usb-storage "
187         if [ $? -eq 0 ]; then
188                 return
189         fi
190         echo "Activating a potential USB Storage device"
191         modprobe -q usb-storage
192         for i in 1 2 3 4 5 6 7 8 9 10 ; do
193                 sleep 1
194                 echo -en "."
195         done
196
197         find-and-mount-cdrom
198         res=$?
199         if [ "$res" -ne "0" ] ; then
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=$?
205         fi
206         if [ "$res" -eq "0" ] ; then
207                 LogIt "OK, I am running on a CD-ROM. Good." 3
208                 CD_MOUNTED_OK=yes
209         else
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
214                 CD_MOUNTED_OK=""
215         fi
216         return 0
217 }
218
219
220 # --- cater for arbitrary locations of devfsd.conf by using the
221 #     config file path compiled into devfsd
222 RunDevfsd() {
223         loc=`which devfsd 2> /dev/null`
224         if [ "$loc" != "" ] ; then
225         LogIt "Devfs found. Testing kernel support..."
226         if [ ! -e "/dev/.devfsd" ] ; then
227             mount -t devfs devfs /dev 2>> $LOGFILE
228                     if [ "$?" -ne "0" ] ; then
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"
238             conffile=`strings $loc | grep -E "devfsd.conf$"`
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
248         fi
249 }
250
251 # Taken from udev management in Mandriva 2008.0. Kudos guys
252 make_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 ;;
261                         M) mknod /dev/$name $arg1 && chmod 600 /dev/$name;;
262                         *) echo "udev-links.conf: unparseable line (%s %s %s)\n" "$type" "$name" "$arg1" ;;
263                 esac
264         done
265 }
266
267 create_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 }
274
275 RunUdevd() {
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
284         if [ -e /proc/sys/kernel/hotplug ]; then
285                 echo > /proc/sys/kernel/hotplug
286         fi
287         PKLVL=`cut -f1 /proc/sys/kernel/printk`
288         echo 0 > /proc/sys/kernel/printk
289         # Many possibilities depending on udev versions
290         if [ -x /sbin/startudev ]; then
291                 /sbin/startudev
292         elif [ -x /sbin/start_udev ]; then
293                 /sbin/start_udev
294         fi
295         # Depending on udevd version it gives back the hand or not :-(
296         ps | grep udevd 2> /dev/null 1> /dev/null
297         if [ $? -ne 0 ]; then
298                 /sbin/udevd --daemon &
299                 echo "Waiting for udev to start..."
300                 sleep 5
301         fi
302         mkdir -p /dev/.udev/queue/
303         if [ -x /sbin/udevtrigger ]; then
304                 /sbin/udevtrigger
305         fi
306         echo "Waiting for udev to discover..."
307         create_dev_makedev
308         # Newer version use udevadm for that
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
314         fi
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
323         rm -rf /dev.static
324         echo $PKLVL > /proc/sys/kernel/printk
325 }
326
327 RstHW() {
328
329         # Restore the HW configuration if available (NOT by default)
330         answer="NO"
331
332         grep -q nohw $CMDLINE
333         if [ "$?" -eq 0 ]; then
334                 return
335         fi
336         if [ -x $MINDI_CACHE/mindi-rsthw ]; then
337                 grep -q RESTORE $CMDLINE
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
349                 if [ "$answer" = "YES" ] ; then
350                         $MINDI_CACHE/mindi-rsthw
351                 fi
352         fi
353 }
354
355
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
367 StartUSBKbd() {
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
370 echo "$DENY_MODS" | grep -Eq 'uhcd_hci |usbhid |usbcore '
371 if [ $? -eq 0 ]; then
372         return
373 fi
374 modprobe -q uhcd_hci
375 modprobe -q usbhid
376 }
377
378
379
380 StartLvms() {
381         if [ "`grep -i nolvm /proc/cmdline`" ]; then
382                 return;
383         fi
384         if [ -e "/tmp/i-want-my-lvm" ] ; then
385                 LogIt "Scanning LVM's..." 1
386                 if which lvm ; then
387                 modprobe -q dm-mod
388                 modprobe -q dm_mod
389                 lvm vgscan --mknodes
390                 else
391                 vgscan
392                 fi
393
394                 # Exclude devices we may not want
395                 rm -f /tmp/restorevgs
396                 for d in $MINDI_EXCLUDE_DEVS ; do
397                         echo " == $d"
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
415                                         grep -Ev "/dev/$v/$l" /tmp/mountlist.txt > /tmp/mountlist.txt.new
416                                         grep -Ev "/dev/mapper/${v}-$l" /tmp/mountlist.txt.new > /tmp/mountlist.txt
417                                 done
418                         done
419                 done
420
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
426                 echo -en "."
427                 sleep 1
428                 done
429                 rm -f /tmp/start-lvm
430                 echo "Done."
431         fi
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.
434         LogIt "LVM's have been started."
435 }
436
437 StartPowerPath() {
438
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
478 StartMpath() {
479         if [ "`grep -i nompath $CMDLINE`" ]; then
480                 return;
481         fi
482         if [ "`grep mpath $MINDI_CACHE/mountlist.txt`" ]; then
483                 if [ -x /sbin/multipath ]; then
484                         echo "Starting Mpath..."
485                         mkdir -p /var/lib/multipath
486                         cat > /etc/multipath.conf << EOF
487 defaults {
488         user_friendly_names yes
489 }
490 EOF
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
495                 fi
496         fi
497 }
498
499 StartRaids() {
500         local raid_devices i
501
502         if [ "`grep -i noraid /proc/cmdline`" ]; then
503                 return;
504         fi
505
506         raid_devices=`grep /dev/md $MINDI_CACHE/mountlist.txt | cut -d' ' -f1`
507         if which raidstart > /dev/null 2> /dev/null ; then
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
512                         LogIt "Running 'raidstart $i'" 1
513                         raidstart $i
514                         fi
515                 done
516         elif which mdrun > /dev/null 2> /dev/null ; then
517                 if [ "`grep -i nomd /proc/cmdline`" ]; then
518                         return;
519                 fi
520                 LogIt "Running 'mdrun'" 1
521                 mdrun
522         elif which mdadm > /dev/null 2> /dev/null ; then
523                 if [ "`grep -i nomd /proc/cmdline`" ]; then
524                         return;
525                 fi
526                 LogIt "Running 'mdadm'" 1
527                 for i in $raid_devices ; do
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
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
541                         fi
542                 done
543         elif which dmraid > /dev/null 2> /dev/null ; then
544                 if [ "`grep -i nodmraid $CMDLINE`" ]; then
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
555         else
556                 LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
557         fi
558
559 }
560
561
562 TryAgainToFindCD() {
563         local res
564         mount | grep /mnt/cdrom && return 0
565         [ "`grep "backup_media_type" $MINDI_CACHE/mondorestore.cfg 2> /dev/null | grep "cdstream"`" ] && return
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
575 }
576
577
578
579 UseTmpfs()
580 {
581         local mount_cmd
582         echo -en "Mounting /tmp/tmpfs..."
583         mkdir -p /tmp/tmpfs
584 # For technical reasons, some sets are as large as 16MB.
585 # I am allowing 32MB because selective restore occupies a lot of space.
586         for size in 128m 64m 48m 40m 32m ; do
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
604                 mv /tmp/* /tmp.old/
605                 rm -f /tmp/*
606                 $mount_cmd /tmp
607                 mv /tmp.old/* /tmp/
608                 rm -rf /tmp.old
609                 mkdir -p /tmp/tmpfs
610                 echo "Done."
611                 LogIt "Successfully mounted dynamic /tmp ramdisk"
612         fi
613 }
614
615
616 WelcomeMessage()
617 {
618         echo "********************************************************************"
619         echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
620         echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
621 which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
622         echo "Executables and source code are covered by the GNU GPL. No warranty."
623         echo "running on $ARCH"
624         echo "********************************************************************"
625 }
626
627
628 EnableCcissIfAppropriate() {
629         local i fname
630         for i in 0 1 2 3 ; do
631                 fname="/proc/driver/cciss/cciss$i"
632                 if [ -e "$fname" ] ; then
633                 LogIt "Engaging $fname"
634                 echo "engage scsi" > $fname
635                 LogIt "...result=$?"
636                 fi
637         done
638 }
639
640 ModprobeAllModules() {
641
642         lismod=`find /lib/modules -name '*\.ko*' -o -name '*\.o*'`
643         # loading forced modules first
644         for m in $lismod; do
645                 k=`basename $m | sed 's/\.ko.*$//'`
646                 j=`basename $k | sed 's/\.o.*$//'`
647                 echo "$FORCE_MODS" | grep -q "$j "
648                 if [ $? -eq 0 ]; then
649                         echo "Forcing first $j..."
650                         modprobe -q $j
651                 fi
652         done
653         for m in $lismod; do
654                 k=`basename $m | sed 's/\.ko.*$//'`
655                 j=`basename $k | sed 's/\.o.*$//'`
656                 echo "$DENY_MODS" | grep -q "$j "
657                 if [ $? -eq 0 ]; then
658                         echo "Denying $j..."
659                         continue
660                 fi
661                 echo "$FORCE_MODS" | grep -q "$j "
662                 if [ $? -eq 0 ]; then
663                         continue
664                 fi
665                 echo "Probing $j..."
666                 modprobe -q $j
667         done
668 }
669
670 ExtractDataDisksAndLoadModules() {
671         echo "Installing additional tools ..."
672         install-additional-tools
673         # Keep the kernel silent again
674         PKLVL=`cut -f1 /proc/sys/kernel/printk`
675         echo 0 > /proc/sys/kernel/printk
676         ModprobeAllModules
677         echo $PKLVL > /proc/sys/kernel/printk
678
679         # Retry failed udev events now that local filesystems are mounted read-write
680         # (useful for rules creating network ifcfg files)
681         if [ -e "$MINDI_CACHE/USE-UDEV" ] ; then
682                 if [ -x /sbin/udevadm ]; then
683                         /sbin/udevadm trigger --retry-failed
684                 fi
685         fi
686 }
687
688 # ------------------------ main -----------------------
689
690 MINDI_VER=PBVER
691 MINDI_REV=PBREV
692 trap CaughtSoftReset SIGTERM
693 LOGFILE=/var/log/mondorestore.log
694 PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
695 GROOVY=$MINDI_CACHE/groovy-stuff
696 USER=root
697 ARCH=`uname -m`
698
699 export PATH GROOVY USER LOGFILE ARCH
700
701 echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV})"
702
703 mount -o remount rw /
704 [ ! "$GROOVY" ] && Die "I'm not groovy!"
705 for i in /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
706         mkdir -p $i
707 done
708 #/bin/update
709 mount /proc/ /proc -v -t proc
710 mkdir /sys 2> /dev/null
711 mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
712 # For ESX 3
713 [ -d /proc/vmware ] && ! grep -q /vmfs /proc/mounts && mount -t vmfs /vmfs /vmfs
714 rm -f /foozero
715
716 if [ "`grep -i denymods $CMDLINE`" ]; then
717         export DENY_MODS="`cat $CMDLINE | sed 's~.*denymods=\"\(.*\)\".*~\1~'` mondonone"
718 else
719         export DENY_MODS=" "
720 fi
721 if [ "`grep -i 'obdr ' $MINDI_CACHE/mondorestore.cfg 2> /dev/null`" ]; then
722         # Do not try to load usb storage when dealing with OBDR it makes the modprobe hang :-(
723         export DENY_MODS="usb-storage $DENY_MODS"
724 fi
725 if [ "`grep -i forcemods $CMDLINE`" ]; then
726         export FORCE_MODS="`cat $CMDLINE | sed 's~.*forcemods=\"\(.*\)\".*~\1~'` mondonone"
727 else
728         export FORCE_MODS=" "
729 fi
730 if [ "`grep -i excludedevs /proc/cmdline`" ]; then
731         export MINDI_EXCLUDE_DEVS="`cat /proc/cmdline | sed 's~.*excludedevs=\"\(.*\)\".*~\1~'` mondonone"
732 else
733         export MINDI_EXCLUDE_DEVS=" "
734 fi
735
736 echo "Activating a potential USB keyboard/mouse"
737 StartUSBKbd
738
739 if [ -f /proc/sys/kernel/exec-shield ]; then
740         echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
741 fi
742
743 if [ -f /proc/modules ]; then
744         echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
745 fi
746
747 if [ -e "$MINDI_CACHE/USE-UDEV" ] ; then
748         RunUdevd
749 fi
750 ExtractDevTarballs
751 LaunchTerminals
752
753 # Keeping kernel silent  for module insertion
754 PKLVL=`cut -f1 /proc/sys/kernel/printk`
755 echo 0 > /proc/sys/kernel/printk
756 ModprobeAllModules
757 echo $PKLVL > /proc/sys/kernel/printk
758
759 EnableCcissIfAppropriate
760 #-------------------------------
761 #WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
762 #-------------------------------
763 UseTmpfs
764 if [ ! -e "$MINDI_CACHE/mondorestore.cfg" ] ; then
765         LogIt "Warning - $MINDI_CACHE/mondorestore.cfg not found"
766 fi
767 if [ "`grep -i pxe $CMDLINE`" ] || [ "`grep -i net $CMDLINE`" ]; then
768         # We need to get here exported variables from start-netfs
769         . /sbin/start-netfs
770 fi
771
772 if [ "`grep -i 'obdr ' $MINDI_CACHE/mondorestore.cfg 2>/dev/null`" ] || [ "`grep -i ' udev' $MINDI_CACHE/mondorestore.cfg 2>/dev/null`" ]; then
773         HandleTape
774         ExtractDataDisksAndLoadModules
775 elif [ "`grep -i pxe $CMDLINE`" ]; then
776         # Simulate a local CD
777         echo "/mnt/cdrom" > $MINDI_CACHE/CDROM-LIVES-HERE
778         CD_MOUNTED_OK=yes
779         ExtractDataDisksAndLoadModules
780         # Fake the conf file to force it to NFS mode, even if we made originally a CD (mandatory for mondorestore to work correctly)
781         sed -i "s/backup-media-type.*/backup-media-type netfs/" $MINDI_CACHE/mondorestore.cfg
782 elif [ "`grep -i usb= $CMDLINE`" ] || [ "`grep -i usb $MINDI_CACHE/mondorestore.cfg 2>/dev/null | grep media-type`" ]; then
783         . /sbin/start-usb
784
785         # Simulate a local CD
786         echo "/mnt/cdrom" > $MINDI_CACHE/CDROM-LIVES-HERE
787         CD_MOUNTED_OK=yes
788         ExtractDataDisksAndLoadModules
789 else
790         HandleCDROM
791         ExtractDataDisksAndLoadModules
792         # We need to get here exported variables from start-netfs
793         . /sbin/start-netfs
794 fi
795 res=$?
796 ConfigureLoggingDaemons
797 if [ -e "$MINDI_CACHE/USE-DEVFS" ] ; then
798         umount /mnt/cdrom 2> /dev/null
799         mv /dev/cdrom /cdrom.lnk 2> /dev/null
800         CD_MOUNTED_OK=""
801         RunDevfsd
802 fi
803 LoadKeymap
804 WelcomeMessage
805 RstHW
806 StartRaids
807 StartMpath
808 StartLvms
809 CopyBootDevEntry
810 mkdir -p /tmp/tmpfs
811 sleep 2
812 if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ $MINDI_CACHE/mountlist.txt`" != "" ] ; then
813         LogIt "Creating /dev/md/* softlinks just in case." 1
814         mkdir -p /dev/md
815         cp -af /dev/md0 /dev/md/0 2> /dev/null
816         cp -af /dev/md1 /dev/md/1 2> /dev/null
817         cp -af /dev/md2 /dev/md/2 2> /dev/null
818 fi
819 [ -e "$MINDI_CACHE/mountlist.txt" ] && cp -f $MINDI_CACHE/mountlist.txt $MINDI_CACHE/mountlist.original
820
821 if ! [ "`grep -i "pxe" $CMDLINE`" ] ; then
822         res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
823         [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
824         [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
825         [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
826         #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
827 fi
828 hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
829
830 # Log some useful info
831 LogIt "init (from mindi v$MINDI_VER-r${MINDI_REV})"
832 LogIt "$CMDLINE is:"
833 LogIt "----------"
834 cat $CMDLINE  >> $LOGFILE
835 LogIt "----------"
836 LogIt "df result:"
837 LogIt "----------"
838 df >> $LOGFILE
839 LogIt "-------------"
840 LogIt "mount result:"
841 LogIt "-------------"
842 mount >> $LOGFILE
843 LogIt "-------------"
844 LogIt "lsmod result:"
845 LogIt "-------------"
846 lsmod >> $LOGFILE
847 LogIt "-------------"
848 LogIt "dmesg result:"
849 LogIt "-------------"
850 dmesg >> $LOGFILE
851 LogIt "-------------"
852 LogIt "/proc/swaps:" >> $LOGFILE
853 LogIt "-------------"
854 cat /proc/swaps  >> $LOGFILE
855 LogIt "-------------"
856 LogIt "/proc/filesystems:" >> $LOGFILE
857 LogIt "-------------"
858 cat /proc/filesystems  >> $LOGFILE
859 LogIt "-------------"
860 LogIt "/proc/partitions:" >> $LOGFILE
861 LogIt "-------------"
862 cat /proc/partitions  >> $LOGFILE
863 LogIt "-------------"
864 LogIt "fdisk result:" >> $LOGFILE
865 LogIt "-------------"
866 fdisk -l  >> $LOGFILE
867
868 ide-opt
869
870 # Not sure it's still needed, but shouldn't hurt
871 if [ -e "/tmp/USE-UDEV" ] ; then
872         if [ -x /sbin/udevadm ]; then
873                 /sbin/udevadm trigger --retry-failed
874         fi
875 fi
876 if grep "backup-media-type" $MINDI_CACHE/mondorestore.cfg > /dev/null 2> /dev/null ; then
877         LogIt "backup-media-type is specified in config file - great."
878         LogIt "Calling post-init"
879         # start-netfs moved it under /tmp as the NFS share is already unmounted
880         if [ "`echo $pre | grep -E '^/tmp/isodir'`" ]; then
881                 pre=`echo $pre | sed 's|^/tmp/isodir|/tmp|'`
882         fi
883         if [ -x $pre ]; then
884                 echo "Executing preliminary script $pre"
885                 LogIt "Executing preliminary script $pre"
886                 $pre
887         fi
888         post-init
889 else
890         LogIt "backup-media-type is not specified in config file."
891         LogIt "I think this media has no archives on it."
892 fi
893 if [ "`grep -i "post=" $CMDLINE`" ] ; then
894         for i in `cat $CMDLINE` ; do
895         echo $i | grep -qi post= && post=`echo $i | cut -d= -f2`
896         done
897         # start-netfs moved it under /tmp as the NFS share is already unmounted
898         if [ "`echo $post | grep -E '^/tmp/isodir'`" ]; then
899                 post=`echo $post | sed 's|^/tmp/isodir|/tmp|'`
900         fi
901         if [ -x $post ]; then
902                 echo "Executing final script $post"
903                 LogIt "Executing final script $post"
904                 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
905                         mount-me
906                 fi
907                 $post
908                 if [ "`echo $post | grep -E '^/mnt/RESTORING'`" ]; then
909                         unmount-me
910                 fi
911         fi
912 fi
913 if grep "RESTORE" $CMDLINE > /dev/null 2> /dev/null ; then
914         echo "Rebooting in 10 seconds automatically as per reboot order"
915         echo -en "Press ^C to interrupt if you have to ..."
916         for i in 1 2 3 4 5 6 7 8 9 10 ; do
917                 sleep 1
918                 echo -en "."
919         done
920         echo "Boom."
921         sleep 1
922 else
923         echo -en "Type 'exit' to reboot the PC\n"
924         umount /mnt/cdrom 2> /dev/null
925         mount / -o rw,remount > /dev/null 2> /dev/null
926         LogIt "Launching Shell"
927         sh
928 fi
929 CaughtSoftReset
930 # reboot
931
Note: See TracBrowser for help on using the browser.