source: branches/2.2.2/mindi/rootfs/sbin/init @ 1315

Last change on this file since 1315 was 1315, checked in by bruno, 12 years ago

Log files are now consistent: mondoarchive.log for mondoarchive (containing also mindi.log) and mondorestore.log for mondorestore (copied from /tmp (ram) to /var/log (disk) at the end of the restore)
One include has been created for each bianry containing only that declaration ofr the moment, but which will be extended to include all local definitions (ps_* e.g.)
Doc updated accordingly
LOGFILE in restore process is now passed in the environment and not duplicated anymore
LogIt? is not redifined either
LOGFILE should be put in environment by mondoarchive for mindi's usage but that's a step left for later.

  • Property svn:keywords set to Id
File size: 15.5 KB
Line 
1#!/bin/sh
2#
3# $Id: init 1315 2007-04-16 14:13:59Z 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 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
254
255
256
257
258
259#RunDevfsd() {
260#    loc=`which devfsd 2> /dev/null`
261#    if [ "$loc" != "" ] ; then
262#        LogIt "Starting devfsd"
263#        devfsd /dev &
264#        sleep 5
265#    fi
266#}
267
268
269
270SpaceTests() {
271    [ -e "/tmp/filelist.full" ] && cp /tmp/filelist.full /tmp/FLF
272    if [ "`HowMuchFreeSpaceOnRamdisk`" -le "3" ] ; then
273        LogIt "Ramdisk is a bit smaller than I would like." 1
274        LogIt "Please re-run Mondo/Mindi but edit /usr/local/mindi first" 1
275        LogIt "and set EXTRA_SPACE to something high, e.g. 8000" 1
276        Die "Aborting. Please reboot."
277    fi
278    rm -f /tmp/FLF
279}
280
281
282
283StartLvms() {
284    if [ -e "/tmp/i-want-my-lvm" ] ; then
285        LogIt "Scanning LVM's..." 1
286        if which lvm ; then
287            MyInsmod dm-mod
288            MyInsmod dm_mod
289            lvm vgscan --mknodes
290        else
291            vgscan
292        fi
293        grep -E "^#.*vgchange" /tmp/i-want-my-lvm | sed "s/^#[ ]*//" > /tmp/start-lvm
294        chmod +x /tmp/start-lvm
295        echo -en "Starting LVM's..."
296        /tmp/start-lvm &
297        for i in 1 2 3 4 5 ; do
298        echo -en "."
299        sleep 1
300        done
301        echo "Done."
302    fi
303# If necessary, cannibalize 'analyze-my-lvm'; copy some of its code here,
304# pipe vgscan's output, strip it, run 'vgchange' on its output, etc.etc.
305    LogIt "LVM's have been started."
306}
307
308
309StartRaids() {
310    local raid_devices i
311
312    raid_devices=`grep /dev/md /tmp/mountlist.txt | cut -d' ' -f1`
313    if which raidstart > /dev/null 2> /dev/null ; then
314        for i in $raid_devices ; do
315            if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
316                LogIt "$i is started already; no need to run 'raidstart $i'" 1
317            else
318                LogIt "Running 'raidstart $i'" 1
319                raidstart $i
320            fi
321        done
322    elif which mdrun > /dev/null 2> /dev/null ; then
323        LogIt "Running 'mdrun'" 1
324        mdrun
325    elif which mdadm > /dev/null 2> /dev/null ; then
326        LogIt "Running 'mdadm'" 1
327        for i in $raid_devices ; do
328            if grep `basename $i` /proc/mdstat > /dev/null 2> /dev/null ; then
329                LogIt "$i is started already; no need to run 'mdadm $i'" 1
330            else
331                LogIt "Running 'mdadm $i'" 1
332                mdadm -Ac partitions -m dev $i
333            fi
334        done
335    else
336        LogIt "Warning: Neither 'raidstart' nor 'mdrun''found. RAID devices may not have started." 1
337    fi
338
339}
340
341
342TryAgainToFindCD() {
343    local res
344    mount | grep /mnt/cdrom && return 0
345    [ "`grep "backup_media_type" /tmp/mondo-restore.cfg | grep "cdstream"`" ] && return
346    LogIt "Trying to mount CD-ROM a 2nd time..."
347    find-and-mount-cdrom --second-try
348    res=$?
349    if [ "$res" -eq "0" ] ; then
350        CD_MOUNTED_OK=yes
351        LogIt "CD-ROM drive mounted successfully." 1
352    else
353        LogIt "I still cannot find or mount the CD-ROM drive, by the way."
354    fi
355}
356
357
358
359UseTmpfs()
360{
361    local mount_cmd
362    echo -en "Mounting /tmp/tmpfs..."
363    mkdir -p /tmp/tmpfs
364# For technical reasons, some sets are as large as 16MB.
365# I am allowing 32MB because selective restore occupies a lot of space.
366    for size in 64m 48m 40m 32m ; do
367        mount_cmd="mount /dev/shm -t tmpfs -o size=$size" ; # was 34m until 04/2003
368        LogIt "Trying '$mount_cmd'"
369    $mount_cmd /tmp/tmpfs 2>> $LOGFILE
370    res=$?
371    [ "$res" -eq "0" ] && break
372    done
373    if [ "$res" -ne "0" ] ; then
374        LogIt "Failed. I could not run '$mount_cmd /tmp/tmpfs'. Your kernel is BROKEN or you do not have enough RAM." 1
375        umount /tmp/tmpfs > /dev/null 2> /dev/null
376    rmdir /tmp/tmpfs
377        ln -sf /mnt/RESTORING/tmp /tmp/tmpfs; # used by mondo-restore
378    LogIt "Failed to mount /tmp/tmpfs; using ugly softlink instead"
379    else
380        LogIt "Great. Pivot succeeded w/ size=$size" 1
381        echo -en "Pivoting /tmp..."
382        umount /tmp/tmpfs
383        mkdir -p /tmp.old
384        mv -f /tmp/* /tmp.old/
385        $mount_cmd /tmp
386        mv /tmp.old/* /tmp/
387        rmdir /tmp.old
388        mkdir -p /tmp/tmpfs
389        mkdir -p $GROOVY
390    echo "Done."
391    LogIt "Successfully mounted dynamic /tmp ramdisk"
392#   mkdir -p /tmp/tmpfs/var
393#        mv -f /var/log /tmp/tmpfs/var/log
394#        ln -sf /tmp/tmpfs/var/log /var/log
395    fi
396}
397
398
399WelcomeMessage()
400{
401    echo "********************************************************************"
402    echo "MINDI-LINUX by Mondo Dev Team - web site: http://www.mondorescue.org"
403    echo "Boot disk based on AlfaLinux & Trinux. BusyBox by Erik Andersen."
404which petris > /dev/null 2> /dev/null && echo "Petris was written by Peter Seidler <p.seidler@mail1.stofanet.dk>."
405    echo "Executables and source code are covered by the GNU GPL. No warranty."
406    echo "running on $ARCH"
407    echo "********************************************************************"
408}
409
410
411EnableCcissIfAppropriate() {
412    local i fname
413    for i in 0 1 2 3 ; do
414    fname="/proc/driver/cciss/cciss$i"
415    if [ -e "$fname" ] ; then
416        LogIt "Engaging $fname"
417        echo "engage scsi" > $fname
418        LogIt "...result=$?"
419    fi
420    done
421}
422
423
424ExtractDataDisksAndLoadModules() {
425    echo "Installing additional tools ..."
426    install-additional-tools
427    echo "Inserting modules ..."
428    insert-all-my-modules > $LOGFILE 2> $LOGFILE
429}
430
431# ------------------------ main -----------------------
432
433MINDI_VER=VVV
434MINDI_REV=RRR
435trap CaughtSoftReset SIGTERM
436LOGFILE=/tmp/mondorestore.log
437PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/mondo:/usr/games
438GROOVY=/tmp/groovy-stuff
439USER=root
440export PATH GROOVY USER LOGFILE
441
442echo "Welcome to init (from mindi ${MINDI_VER}-r${MINDI_REV}"
443
444mount -o remount rw /
445[ ! "$GROOVY" ] && Die "I'm not groovy!"
446for i in $GROOVY /mnt/floppy /mnt/cdrom /mnt/isodir /var/local/petris /tmp/isodir; do
447    mkdir -p $i
448done
449#/bin/update
450mount /proc/ /proc -v -t proc
451mkdir /sys 2> /dev/null
452mount /sys/ /sys -v -t sysfs 2>> $LOGFILE
453rm -f /foozero
454
455echo 0 > /proc/sys/kernel/exec-shield 2>> /dev/null
456
457ExtractDevTarballs
458LaunchTerminals
459InsertEssentialModules
460EnableCcissIfAppropriate
461#-------------------------------
462#WHOLIVESINAPINEAPPLEUNDERTHESEA#;# --- don't touch this :)
463#-------------------------------
464UseTmpfs
465if [ ! -e "/tmp/mondo-restore.cfg" ] ; then
466    LogIt "Warning - /tmp/mondo-restore.cfg not found"
467fi
468
469if [ "`grep -i 'tape ' /tmp/mondo-restore.cfg`" ] || [ "`grep -i udev /tmp/mondo-restore.cfg`" ] ; then
470    HandleTape
471    ExtractDataDisksAndLoadModules
472elif [ "`grep -i pxe /proc/cmdline`" ]; then
473    # We need to get here exported variables from start-nfs
474    . /sbin/start-nfs
475
476    # Simulate a local CD
477    echo "/mnt/cdrom" > /tmp/CDROM-LIVES-HERE
478    CD_MOUNTED_OK=yes
479    ExtractDataDisksAndLoadModules
480else
481    HandleCDROMorFloppies
482    ExtractDataDisksAndLoadModules
483    # We need to get here exported variables from start-nfs
484    . /sbin/start-nfs
485fi
486res=$?
487ConfigureLoggingDaemons
488if [ -e "/tmp/USE-DEVFS" ] ; then
489    umount /mnt/cdrom 2> /dev/null
490    mv /dev/cdrom /cdrom.lnk 2> /dev/null
491    CD_MOUNTED_OK=""
492    RunDevfsd
493fi
494echo "Starting potential Raid/LVMs ..."
495PauseForRaids
496StartRaids
497StartLvms
498CopyBootDevEntry
499LoadKeymap
500mkdir -p /tmp/tmpfs
501sleep 2
502#clear
503if [ -e "/dev/md0" ] && [ ! -e "/dev/md/0" ] && [ "`grep /dev/md/ /tmp/mountlist.txt`" != "" ] ; then
504    LogIt "Creating /dev/md/* softlinks just in case." 1
505    mkdir -p /dev/md
506    cp -af /dev/md0 /dev/md/0 2> /dev/null
507    cp -af /dev/md1 /dev/md/1 2> /dev/null
508    cp -af /dev/md2 /dev/md/2 2> /dev/null
509fi
510export ARCH=`uname -m`
511WelcomeMessage
512# SpaceTests; # Mandrake Linux 8.1 doesn't like this
513[ -e "/tmp/mountlist.txt" ] && cp -f /tmp/mountlist.txt /tmp/mountlist.original
514
515if ! [ "`grep -i "pxe" /proc/cmdline`" ] ; then
516    res="`cat /mnt/cdrom/archives/THIS-CD-NUMBER 2> /dev/null`"
517    [ "$res" != "1" ] && [ "$res" != "" ] && Die "This is CD #$res in the series. Please insert CD #1."
518    [ -e "/cdrom.lnk" ] && mv -f /cdrom.lnk /dev/cdrom && mount /dev/cdrom /mnt/cdrom && CD_MOUNTED_OK=yes
519    [ "$CD_MOUNTED_OK" != "yes" ] && TryAgainToFindCD
520    #mount | grep cdrom > /dev/null 2> /dev/null || mount /dev/cdrom /mnt/cdrom >> $LOGFILE 2>> $LOGFILE
521fi
522hack-cfg-if-necessary || LogIt "Cannot find hack-cfg-if-necessary"
523openvt 8 /usr/bin/tail -f $LOGFILE
524
525#-------------------------------
526#ABSORBENTANDYELLOWANDPOROUSISHE#;# --- don't touch this either :)
527#-------------------------------
528
529lsmod > /tmp/ramdisk-lsmod.txt 2> /dev/null
530cut -d' ' -f1 /tmp/original-lsmod.txt /tmp/original-lsmod.txt /tmp/ramdisk-lsmod.txt | sort | uniq -d > /tmp/missing-modules.txt
531echo "Warning - these modules did not make it onto the ramdisk" >> $LOGFILE
532cat /tmp/missing-modules.txt >> $LOGFILE
533
534#ctrlaltdel soft
535for path in /usr.bin /usr/bin ; do
536    fname=$path/nano
537    [ -e "$fname" ] && ln -sf $fname /usr/bin/pico
538done
539res=`which nano 2> /dev/null`
540[ "$res" ] && ln -sf /usr/bin/
541for i in null stdout stdin stderr ; do
542    cp -af /dev/$i /tmp
543done
544if grep "backup-media-type" /tmp/mondo-restore.cfg > /dev/null 2> /dev/null ; then
545    LogIt "backup-media-type is specified in config file - great."
546    LogIt "Calling post-init $mountlist"
547    post-init
548else
549    LogIt "backup-media-type is not specified in config file."
550    LogIt "I think this CD/floppy has no archives on it."
551fi
552echo -en "Type 'exit' to reboot the PC\n"
553umount /mnt/cdrom 2> /dev/null
554mount / -o rw,remount > /dev/null 2> /dev/null
555sh
556CaughtSoftReset
557# reboot
Note: See TracBrowser for help on using the repository browser.