summaryrefslogtreecommitdiffstats
path: root/init
blob: 3f594c1d48d167a3455c15cb68fa4522e81a82d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/bin/sh

msg () { [ "${quiet}" != "y" ] && echo $@; }
err () { echo "ERROR: $@"; }

msg ":: Loading Initramfs"

/bin/mount -t sysfs none /sys
/bin/mount -t proc  none /proc

read CMDLINE </proc/cmdline
export CMDLINE

# Used so hooks can override params to kinit
export kinit_params=""
export root=""
echo "/bin/modprobe" > /proc/sys/kernel/modprobe

for cmd in $CMDLINE; do
    case "$cmd" in
        \#*) break ;; # ignore everything after a # in the commandline
        [0123456Ss]) export runlevel="$cmd" ;;
        single) export runlevel="S" ;; #some people use 'single'
        # replace can cause problems for the following entries
        # These should only be applied to the lefthand side of the expression
        # until we find a fix hardcode the stuff here.
        root=*) export "${cmd}";;
        md=*) export "${cmd}" ;;
        crypto=*) export "${cmd}" ;;
        resume2=*) export "${cmd}" ;;
        ip=*) export "${cmd}" ;;
        nfsaddrs=*) export "${cmd}" ;;
        nfsroot=*) export "${cmd}" ;;
        # only export stuff that does work with dash :)
        *=*) cmd="$(replace "${cmd}" '.' '_')"
             cmd="$(replace "${cmd}" '-' '_')"
             export "${cmd}"
             ;;
        *)   cmd="$(replace "${cmd}" '.' '_')"
             cmd="$(replace "${cmd}" '-' '_')"
             export "${cmd}=y" 
           ;;
    esac
done

if [ "x${disablehooks}" != "x" ]; then
    for d in $(replace "${disablehooks}" ','); do
        export "hook_${d}=disabled"
    done
fi

if [ "x${disablemodules}" != "x" ]; then
    for d in $(replace "${disablemodules}" ','); do
        export "mod_${d}=disabled"
    done
fi

if [ "x${earlymodules}" != "x" ]; then
    for m in $(replace "${earlymodules}" ','); do
        /bin/modprobe -q $m > /dev/null 2>&1
    done
fi

. /config

for m in $MODULES; do
    TST=""
    eval "TST=\$mod_${m}"
    if [ "${TST}" != "disabled" ]; then
        /bin/modprobe -q $m > /dev/null 2>&1
    fi
done

if [ -e "/hooks" ]; then
    for h in $HOOKS; do
        TST=""
        eval "TST=\$hook_${h}"
        if [ "${TST}" != "disabled" ]; then
            run_hook () { msg "$h: no run function defined"; }
            if [ -e "/hooks/$h" ]; then
               . /hooks/$h
               msg ":: Running Hook [${h}]"
               run_hook
            fi
        fi
    done
fi

if [ "${rootdelay}" != "0" ]; then
    msg -n "Waiting for devices to settle..."
    /bin/sleep "${rootdelay}"
    export rootdelay=0
    export kinit_params="$kinit_params rootdelay=0"
    msg "done."
fi

if [ "${break}" = "y" ]; then
    echo ":: Break requested, type 'exit' to resume operation"
    echo "   NOTE: klibc contains no 'ls' binary, use 'echo *' instead"
    PS1="ramfs$ " /bin/sh -i
fi

if [ ! -e "${root}" ]; then
    err "Unable to create/detect root device '${root}'"
    echo "Dropping to a recovery shell... type 'exit' to reboot"
    echo "NOTE: klibc contains no 'ls' binary, use 'echo *' instead"
    echo ""
    echo "If the device '${root}' gets created while you are here,"
    echo "try adding 'rootdelay=8' or higher to the kernel command-line"
    PS1="ramfs$ " /bin/sh -i
    msg "Rebooting..."
    /bin/reboot
else
    msg ":: Initramfs Completed - control passing to kinit"
    if [ -f "/message" ]; then
        msg "$(cat /message)"
    fi
fi

#Special handling if udev is running
udevpid=$(/bin/minips -C udevd -o pid=)
if [ "x${udevpid}" != "x" ]; then
    /bin/kill -9 $udevpid
    /bin/sleep 0.01
fi


echo "/sbin/modprobe" > /proc/sys/kernel/modprobe

exec /bin/kinit -- "root=${root}" ${kinit_params} "${runlevel}" > /dev/null 2>&1