summaryrefslogtreecommitdiffstats
path: root/init
blob: 234a6ff8dabb241a11427fbc1bc08d424d046942 (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
#!/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 "/sbin/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
fi

msg ":: Initramfs Completed - control passing to kinit"
if [ -f "/message" ]; then
    msg "$(cat /message)"
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


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