summaryrefslogtreecommitdiffstats
path: root/init
blob: 11b9aa79a02534c77f5e891667bcdfc8dd96a047 (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
131
132
133
134
135
136
137
#!/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'
        #Allow "init=X" to pass-through
        init=*) kinit_params="${kinit_params} ${cmd}" ;;
        # only export stuff that does work with dash :)
        *=*) cmd="$(replace -s= "${cmd}" '.' '_')"
             cmd="$(replace -s= "${cmd}" '-' '_')"
             export "${cmd}"
             ;;
        *)   cmd="$(replace "${cmd}" '.' '_')"
             cmd="$(replace "${cmd}" '-' '_')"
             export "${cmd}=y" 
           ;;
    esac
done

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

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

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

. /config

for m in $MODULES; do
    TST=""
    eval "TST=\$mod_${m}"
    if [ "${TST}" != "disabled" ]; then
        /sbin/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 [ ! -b "${root}" ]; then
    # This duplicates code from the filesystem hook
    # without this, mkinitcpio would fail for users who use
    # neither the udev hook, nor the filesystem hook
    msg "\nRoot device '${root}' doesn't exist, attempting to create it"

    eval $(/bin/parseblock "${root}")
    if [ "${BLOCKNAME}" = "unknown" ]; then
        echo "ERROR: Failed to parse block device name for '${root}'"
    elif [ -z "${BLOCKDEVICE}" ]; then
        echo "ERROR: Failed to parse block device ids for '${root}'"
    else
        export root="${BLOCKNAME}"
        echo "/bin/mknod \"${BLOCKNAME}\" b ${BLOCKDEVICE}"
        /bin/mknod "${BLOCKNAME}" b ${BLOCKDEVICE} >/dev/null
    fi
    if [ ! -b "${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
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 [ -n "${udevpid}" ]; then
    /bin/kill -9 $udevpid
    /bin/sleep 0.01
fi


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