source: MondoRescue/branches/2.2.5/mindi/rootfs/sbin/init @ 1716

Last change on this file since 1716 was 1716, checked in by Bruno Cornec, 13 years ago

Adds udev support (mandatory for newest distributions to avoid remapping of devices in a different way as on the original system)

  • Property svn:keywords set to Id
File size: 17.2 KB
Line 
1#!/bin/sh
2#
3# $Id: init 1716 2007-10-28 01:03:30Z bruno $
4#
5# init script launched during the restore process
6#------------------------------------------------------------
7
8
9CaughtSoftReset() {
10    trap SIGTERM
11    reboot
12}
13
14
15ConfigureLoggingDaemons() {
16    echo -en "Running klogd..."
17    klogd -c 2 > /dev/null 2> /dev/null
18    echo -en "Done.\nRunning syslogd..."
19    syslogd > /dev/null 2> /dev/null
20    echo "Done."
21    LogIt "klogd and syslogd have been started."
22}
23
24
25
26CopyBootDevEntry() {
27    local outfile devfile
28    devfile=/dev/boot_device
29    outfile=`cat /BOOTLOADER.DEVICE 2> /dev/null`
30    [ ! "$outfile" ] && return 0
31    echo -en "Copying boot device to $outfile..."
32    if [ -e "$outfile" ] ; then
33        echo "OK."
34        return 0
35    fi
36    mkdir -p $outfile
37    rmdir $outfile
38    cp -pRdf $devfile $outfile
39    if [ "$?" -ne "0" ] ; then
40        echo "Failed."
41        return 1
42    else
43        echo "OK."
44        return 0
45    fi
46}
47
48
49
50Die() {
51    LogIt "Fatal error! $1" 1
52    exit 1
53}
54
55
56
57ExtractDevTarballs() {
58    cd /
59    for fname in ataraid.tgz ida.tgz i2o.tgz rd.tgz raw.tgz cciss.tgz nst.tgz dm.tgz vc.tgz ; do
60        if [ ! -e "/$fname" ] ; then
61            LogIt "/$fname not found; cannot extract to /." 1
62        else
63            echo -en "\rExtracting /$fname...     "
64            tar -zxf /$fname || LogIt "Error occurred while extracting /$fname"
65        fi
66    done
67    echo -en "\r"
68    LogIt "Extracted additional /dev entries OK.     " 1
69}
70
71
72
73LaunchTerminals() {
74    openvt 2 /bin/sh
75    openvt 3 /bin/sh
76    openvt 4 /bin/sh
77    openvt 5 /bin/sh
78    openvt 6 /bin/sh
79    openvt 7 /bin/sh /sbin/wait-for-petris
80}
81
82
83LoadKeymap() {
84    local fname
85    fname=`cat /tmp/KEYMAP-LIVES-HERE 2> /dev/null`
86    [ "$fname" = "" ] && return
87    if which loadkeys > /dev/null 2> /dev/null ; then
88        loadkeys $fname
89# loadkmap != loadkeys
90#    elif which loadkmap > /dev/null 2> /dev/null ; then
91#        loadkmap < $fname
92    else
93        LogIt "Using default keyboard map." 1
94    fi
95}
96
97
98UntarTapeStuff() {
99    local old_pwd res
100    old_pwd=`pwd`
101    cd $GROOVY
102    [ "$1" != "" ] && tapedev=$1
103    [ ! "$tapedev" ] && tapedev=`grep media-dev /tmp/mondo-restore.cfg | tr -s ' ' ' ' | cut -d' ' -f2`
104#    tar -zxf $tapedev
105    dd if=$tapedev bs=32k count=1024 | tar -zx
106    res=$?
107    if [ "$res" -eq "0" ] ; then
108        grep -v media-dev /tmp/mondo-restore.cfg > /tmp/mr.cfg
109        echo "media-dev $tapedev" >> /tmp/mr.cfg
110        cp -f /tmp/mr.cfg /tmp/mondo-restore.cfg
111    fi
112    cd $old_pwd
113    return $res
114}
115
116HandleTape() {
117    local res tapedev
118    tapedev="" ; # will be set by UntarTapeStuff()
119    cd $GROOVY
120    UntarTapeStuff $tapedev || UntarTapeStuff /dev/st0 || UntarTapeStuff /dev/osst0 || UntarTapeStuff /dev/ht0
121    res=$?
122    while [ "$res" -ne "0" ] ; do
123        LogIt "$tapedev failed to act as extended data disk for booting." 1
124        LogIt "Please specify an alternate tape device," 1
125        LogIt "or hit <Enter> to boot from CD/floppies." 1
126        echo -en "---> "
127        read tapedev
128        if [ "$tapedev" ] ; then
129            LogIt "User specified $tapedev instead"
130            UntarTapeStuff $tapedev
131            res=$?
132        else
133            LogIt "User opted not to specify an alternate tapedev"
134            res=1
135        break
136        fi
137    done
138
139    if [ "$res" -ne "0" ] ; then
140        cd /
141        LogIt "Failed to use tape as extended datadisk. Reverting to floppies." 1
142        HandleCDROMorFloppies
143        res=$?
144    else
145#       clear
146        LogIt "Using tape as extended datadisk. Good." 3
147        echo "Using tape as extd ddisk." > /tmp/TAPEDEV-HAS-DATA-DISKS
148        res=0
149        CD_MOUNTED_OK=yes
150    fi
151    return $res
152}
153
154
155
156HandleCDROMorFloppies() {
157    find-and-mount-cdrom
158    res=$?
159    if [ "$res" -ne "0" ] ; then
160        LogIt "First call to find-and-mount-cdrom failed." 1
161        LogIt "Sleeping for 3 seconds and trying again." 1
162        sleep 3
163        find-and-mount-cdrom
164        res=$?
165    fi
166    if [ "$res" -eq "0" ] ; then
167        LogIt "OK, I am running on a CD-ROM. Good." 3
168        CD_MOUNTED_OK=yes
169    elif [ "$res" -eq "1" ] ; then
170        LogIt "OK, I am running on floppies. Good." 3
171        CD_MOUNTED_OK=""
172    else
173        LogIt "OK, I am falling back to floppy mode." 3
174        LogIt "That means you'll have to copy the data disk images from" 3
175        LogIt "the CD/hard disk/whatever to physical 1.44MB disks and" 3
176        LogIt "insert them, one after the other. Please see the manual." 3
177        LogIt "The images are in /images on the CD, or /root/images/mindi" 3
178        LogIt "on your hard disk. Your archives are probably fine but" 3
179        LogIt "your tape streamer and/or CD-ROM drive are eccentric. :-)" 3
180        CD_MOUNTED_OK=""
181    fi
182    return 0
183}
184
185
186HowMuchFreeSpaceOnRamdisk() {
187   df -m -P | grep /dev/ram | head -n1 | tr -s '\t' ' ' | cut -d' ' -f4
188}
189
190
191
192InsertEssentialModules() {
193#   Load the VIA IDE module first thing if it exists (requires ide-core).
194#   This is to ensure that DMA is working for VIA chipsets with 2.6 kernels.
195    for module in /ide-core.ko /via82cxxx.ko; do
196        [ -f "$module" ] && MyInsmod $module > /dev/null 2> /dev/null
197    done
198#   Then load the remaining modules in normal (i.e. arbitrary) order.
199    for j in 1 2 3 4 5 ; do
200        for i in `ls /*.*o* 2> /dev/null` ; do
201            [ -f "$i" ] && MyInsmod $i > /dev/null 2> /dev/null
202        done
203    done
204}
205
206
207
208PauseForRaids() {
209    if [ "`dmesg | grep -i "RAID Controller"`" != "" ] || [ "`dmesg | grep -i "Vendor: 3ware"`" != "" ] ; then
210        LogIt "RAID controller(s) detected. Pausing 10 seconds to let them warm up." 1
211        echo -en "Pausing..."
212        for i in 1 2 3 4 5 6 7 8 9 10 ; do
213            sleep 1
214            echo -en "$(($i*10))%..."
215        done
216        echo "Done."
217    fi
218}
219
220
221# 06/13/2002 --- DuckX's & Hugo's new routine
222# 10/11/2003 --- added a simple devfsd.conf file
223# 01/24/2005 --- cater for arbitrary locations of devfsd.conf by using the
224#                config file path compiled into devfsd
225RunDevfsd() {
226    loc=`which devfsd 2> /dev/null`
227    if [ "$loc" != "" ] ; then
228    LogIt "Devfs found. Testing kernel support..."
229    if [ ! -e "/dev/.devfsd" ] ; then
230        mount -t devfs devfs /dev 2>> $LOGFILE
231            if [ "$?" -ne "0" ] ; then
232        LogIt "Error while trying to mount devfs"
233        else
234        LogIt "Devfs mounted OK"
235        fi
236    fi
237    #check if the kernel supports devfs
238    if [ -e "/dev/.devfsd" ] ; then
239        [ -d "/proc/1" ] || mount -n /proc
240        LogIt "Kernel support found. Creating config file and starting devfsd"
241        conffile=`strings $loc | grep -E "devfsd.conf$"`
242        [ "$conffile" ] || conffile="/etc/devfsd.conf"
243        confpath=`echo $conffile | sed "s/\/devfsd\.conf$//"`
244        [ -d "$confpath" ] || mkdir -p $confpath
245        echo -en "REGISTER .* MKOLDCOMPAT\nUNREGISTER .* RMOLDCOMPAT\n" > $conffile
246        devfsd /dev &
247        sleep 5
248    else
249        LogIt "No devfs kernel support."
250    fi
251    fi
252}
253
254RunUdevd() {
255    # Inspiration from LFS docs
256    mkdir -p /lib/udev/devices &&
257    mknod -m0666 /lib/udev/devices/null c 1 3
258    ln -sf /proc/self/fd /lib/udev/devices/fd &&
259    ln -sf /proc/self/fd/0 /lib/udev/devices/stdin &&
260    ln -sf /proc/self/fd/1 /lib/udev/devices/stdout &&
261    ln -sf /proc/self/fd/2 /lib/udev/devices/stderr &&
262    ln -sf /proc/kcore /lib/udev/devices/core &&
263    mkdir -p /lib/udev/devices/{pts,shm}
264    cp -R /lib/udev/devices/* /dev
265    udevd --daemon
266}
267
268
269
270
271
272
273#RunDevfsd() {
274#    loc=`which devfsd 2> /dev/null`
275#    if [ "$loc" != "" ] ; then
276#        LogIt "Starting devfsd"
277#        devfsd /dev &
278#        sleep 5
279#    fi
280#}
281
282
283
284SpaceTests() {
285    [ -e "/tmp/filelist.full" ] && cp /tmp/filelist.full /tmp/FLF
286    if [ "`HowMuchFreeSpaceOnRamdisk`" -le "3" ] ; then
287        LogIt "Ramdisk is a bit smaller than I would like." 1
288        LogIt "Please re-run Mondo/Mindi but edit /usr/local/mindi first" 1
289        LogIt "and set EXTRA_SPACE to something high, e.g. 8000" 1
290        Die "Aborting. Please reboot."
291    fi
292    rm -f /tmp/FLF
293}
294
295
296
297StartLvms() {
298    if [ -e "/tmp/i-want-my-lvm" ] ; then
299        LogIt "Scanning LVM's..." 1
300        if which lvm ; then
301            MyInsmod dm-mod
302            MyInsmod dm_mod
303            lvm vgscan --mknodes
304        else
305            vgscan
306        fi
307        grep -E "^#.*vgchange" /tmp/i-want-my-lvm | sed "s/^#[ ]*//" > /tmp/start-lvm
308        chmod +x /tmp/start-lvm
309        echo -en "Starting LVM's..."
310        /tmp/start-lvm &
311        for i in 1 2 3 4 5 ; do
312            echo -en "."
313            sleep 1
314        done
315        echo "Done."
316    fi
317# If necessary, cannibalize 'analyze-my-lvm'; copy some of its code here,
318# pipe vgscan's output, strip it, run 'vgchange' on its output, etc.etc.
319    LogIt "LVM's have been started."
320}
321
322
323StartRaids() {
324    local raid_devices i
325
326    raid_devices=`grep /dev/md /tmp/mountlist.txt | cut -d' ' -f1`
327    if which raidstart > /dev/null 2> /dev/null ; then
328        for i in $raid_devices ; do
329            if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
330                LogIt "$i is started already; no need to run 'raidstart $i'" 1
331            else
332                LogIt "Running 'raidstart $i'" 1
333                raidstart $i
334            fi
335        done
336    elif which mdrun > /dev/null 2> /dev/null ; then
337        LogIt "Running 'mdrun'" 1
338        mdrun
339    elif which mdadm > /dev/null 2> /dev/null ; then
340        LogIt "Running 'mdadm'" 1
341        for i in $raid_devices ; do
342            if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
343                LogIt "$i is started already; no need to run 'mdadm $i'" 1
344            else
345                if [ -f /etc/mdadm.conf ] ; then
346                    LogIt "Running 'mdadm $i' with user supplied /etc/mdadm.conf" 1
347                    mdadm -A $i -c /etc/mdadm.conf
348                elif [ -f /etc/mdadm/mdadm.conf ] ; then
349                    LogIt "Running 'mdadm $i' with user supplied /etc/mdadm/mdadm.conf" 1
350                    mdadm -A $i -c /etc/mdadm/mdadm.conf
351                else
352                    LogIt "Running 'mdadm $i'" 1
353                    mdadm -Ac partitions -m dev $i
354                fi
355            fi
356        done
357    else
358        LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
359    fi
360
361}
362
363
364TryAgainToFindCD() {
365    local res
366    mount | grep /mnt/cdrom && return 0
367    [ "`grep "backup_media_type" /tmp/mondo-restore.cfg | grep "cdstream"`" ] && return
368    LogIt "Trying to mount CD-ROM a 2nd time..."
369    find-and-mount-cdrom --second-try
370    res=$?
371    if [ "$res" -eq "0" ] ; then
372        CD_MOUNTED_OK=yes
373        LogIt "CD-ROM drive mounted successfully." 1
374    else
375        LogIt "I still cannot find or mount the CD-ROM drive, by the way."
376    fi
377}
378
379
380
381UseTmpfs()
382{
383    local mount_cmd
384    echo -en "Mounting /tmp/tmpfs..."
385    mkdir -p /tmp/tmpfs
386# For technical reasons, some sets are as large as 16MB.
387# I am allowing 32MB because selective restore occupies a lot of space.
388    for size in 64m 48m 40m 32m ; do
389        mount_cmd="mount /dev/shm -t tmpfs -o size=$size" ; # was 34m until 04/2003
390        LogIt "Trying '$mount_cmd'"
391    $mount_cmd /tmp/tmpfs 2>> $LOGFILE
392    res=$?
393    [ "$res" -eq "0" ] && break
394    done
395    if [ "$res" -ne "0" ] ; then
396        LogIt "Failed. I could not run '$mount_cmd /tmp/tmpfs'. Your kernel is BROKEN or you do not have enough RAM." 1
397        umount /tmp/tmpfs > /dev/null 2> /dev/null
398    rmdir /tmp/tmpfs
399        ln -sf /mnt/RESTORING/tmp /tmp/tmpfs; # used by mondo-restore
400    LogIt "Failed to mount /tmp/tmpfs; using ugly softlink instead"
401    else
402        LogIt "Great. Pivot succeeded w/ size=$size" 1
403        echo -en "Pivoting /tmp..."
404        umount /tmp/tmpfs
405        mkdir -p /tmp.old
406        mv -f /tmp/* /tmp.old/
407        $mount_cmd /tmp
408        mv /tmp.old/* /tmp/
409        rmdir /tmp.old
410        mkdir -p /tmp/tmpfs
411        mkdir -p $GROOVY
412    echo "Done."
413    LogIt "Successfully mounted dynamic /tmp ramdisk"
414#   mkdir -p /tmp/tmpfs/var
415#        mv -f /var/log /tmp/tmpfs/var/log
416#        ln -sf /tmp/tmpfs/var/log /var/log
417    fi
418}
419
420
421WelcomeMessage()
422{
423    echo "********************************************************************"
424    echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
425    echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
426which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
427    echo "Executables and source code are covered by the GNU GPL. No warranty."
428    echo "running on $ARCH"
429    echo "********************************************************************"
430}
431
432
433EnableCcissIfAppropriate() {
434    local i fname
435    for i in 0 1 2 3 ; do
436        fname="/proc/driver/cciss/cciss$i"
437        if [ -e "$fname" ] ; then
438            LogIt "Engaging $fname"
439            echo "engage scsi" > $fname
440            LogIt "...result=$?"
441        fi
442    done
443}
444
445
446ExtractDataDisksAndLoadModules() {
447    echo "Installing additional tools ..."
448    install-additional-tools
449    echo "Inserting modules ..."
450    insert-all-my-modules >> $LOGFILE 2>> $LOGFILE
451}
452
453# ------------------------ main -----------------------
454
455MINDI_VER=PBVER
456MINDI_REV=PBREV
457trap CaughtSoftReset SIGTERM
458LOGFILE=/var/log/mondorestore.log
459PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
460GROOVY=/tmp/groovy-stuff
461USER=root
462export PATH GROOVY USER LOGFILE
463
464echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV})"
465
466mount -o remount rw /
467[ ! "$GROOVY" ] && Die "I'm not groovy!"
468for i in $GROOVY /mnt/floppy /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
469    mkdir -p $i
470done
471#/bin/update
472mount /proc/ /proc -v -t proc
473mkdir /sys 2> /dev/null
474mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
475rm -f /foozero
476
477echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
478
479if [ -e "/tmp/USE-UDEV" ] ; then
480    RunUdevfsd
481fi
482echo "Starting potential Raid/LVMs ..."
483ExtractDevTarballs
484LaunchTerminals
485InsertEssentialModules
486EnableCcissIfAppropriate
487#-------------------------------
488#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
489#-------------------------------
490UseTmpfs
491if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
492    LogIt "Warning - /tmp/mondo-restore.cfg not found"
493fi
494
495if [ "`grep -i 'tape ' /tmp/mondo-restore.cfg`" ] || [ "`grep -i udev /tmp/mondo-restore.cfg`" ]; then
496    HandleTape
497    ExtractDataDisksAndLoadModules
498elif [ "`grep -i pxe /proc/cmdline`" ]; then
499    # We need to get here exported variables from start-nfs
500    . /sbin/start-nfs
501
502    # Simulate a local CD
503    echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
504    CD_MOUNTED_OK=yes
505    ExtractDataDisksAndLoadModules
506elif [ "`grep -i usb= /proc/cmdline`" ] || [ "`grep -i usb /tmp/mondo-restore.cfg | grep media-type`" ]; then
507    # We need to get here exported variables from start-nfs
508    . /sbin/start-usb
509
510    # Simulate a local CD
511    echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
512    CD_MOUNTED_OK=yes
513    ExtractDataDisksAndLoadModules
514else
515    HandleCDROMorFloppies
516    ExtractDataDisksAndLoadModules
517    # We need to get here exported variables from start-nfs
518    . /sbin/start-nfs
519fi
520res=$?
521ConfigureLoggingDaemons
522if [ -e "/tmp/USE-DEVFS" ] ; then
523    umount /mnt/cdrom 2> /dev/null
524    mv /dev/cdrom /cdrom.lnk 2> /dev/null
525    CD_MOUNTED_OK=""
526    RunDevfsd
527fi
528echo "Starting potential Raid/LVMs ..."
529PauseForRaids
530StartRaids
531StartLvms
532CopyBootDevEntry
533LoadKeymap
534mkdir -p /tmp/tmpfs
535sleep 2
536#clear
537if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
538    LogIt "Creating /dev/md/* softlinks just in case." 1
539    mkdir -p /dev/md
540    cp -af /dev/md0 /dev/md/0 2> /dev/null
541    cp -af /dev/md1 /dev/md/1 2> /dev/null
542    cp -af /dev/md2 /dev/md/2 2> /dev/null
543fi
544export ARCH=`uname -m`
545WelcomeMessage
546# SpaceTests; # Mandrake Linux 8.1 doesn't like this
547[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
548
549if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
550    res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
551    [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
552    [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
553    [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
554    #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
555fi
556hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
557openvt 8 /usr/bin/tail -f $LOGFILE
558
559# Log some useful info
560LogIt "init (from mindi v$MINDI_VER-r${MINDI_REV}"
561LogIt "/proc/cmdline is:"
562cat /proc/cmdline  >> $LOGFILE
563LogIt "df result:"
564LogIt "----------"
565df >> $LOGFILE
566LogIt "-------------"
567LogIt "mount result:"
568LogIt "-------------"
569mount >> $LOGFILE
570LogIt "-------------"
571LogIt "lsmod result:"
572LogIt "-------------"
573lsmod >> $LOGFILE
574LogIt "-------------"
575LogIt "dmesg result:"
576LogIt "-------------"
577dmesg >> $LOGFILE
578
579#-------------------------------
580#ABSORBENTANDYELLOWANDPOROUSISHE#;# --- don't touch this either :)
581#-------------------------------
582
583#ctrlaltdel soft
584for path in /usr.bin /usr/bin ; do
585    fname=$path/nano
586    [ -e "$fname" ] && ln -sf $fname /usr/bin/pico
587done
588res=`which nano 2> /dev/null`
589[ "$res" ] && ln -sf /usr/bin/
590for i in null stdout stdin stderr ; do
591    cp -af /dev/$i /tmp
592done
593if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
594    LogIt "backup-media-type is specified in config file - great."
595    LogIt "Calling post-init $mountlist"
596    post-init
597else
598    LogIt "backup-media-type is not specified in config file."
599    LogIt "I think this CD/floppy has no archives on it."
600fi
601if grep "RESTORE" /proc/cmdline > /dev/null 2> /dev/null ; then
602    echo "Rebooting in 10 seconds automatically as per reboot order"
603    echo -en "Press ^C to interrupt if you have to ..."
604    for i in 1 2 3 4 5 6 7 8 9 10 ; do
605        sleep 1
606        echo -en "."
607    done
608    echo "Boom."
609    sleep 1
610else
611    echo -en "Type 'exit' to reboot the PC\n"
612    umount /mnt/cdrom 2> /dev/null
613    mount / -o rw,remount > /dev/null 2> /dev/null
614    LogIt "Launching Shell"
615    sh
616fi
617CaughtSoftReset
618# reboot
Note: See TracBrowser for help on using the repository browser.