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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
#!/bin/busybox ash
# Install busybox's applets as symlinks
/bin/busybox --install -s
. /init_functions
/bin/mount -t proc proc /proc -o nosuid,noexec,nodev
/bin/mount -t sysfs sys /sys -o nosuid,noexec,nodev
if grep -q devtmpfs /proc/filesystems 2>/dev/null; then
/bin/mount -n -t devtmpfs udev /dev -o mode=0755,size=10M,nosuid
else
/bin/mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid
# We don't have devtmpfs, so add the most important standard devices
/bin/mknod /dev/null c 1 3
/bin/mknod /dev/zero c 1 5
/bin/mknod /dev/console c 5 1
# /dev/mem is needed if we want to load uvesafb before triggering uevents
/bin/mknod /dev/mem c 1 1
fi
/bin/mount -t tmpfs run /run -o nosuid,noexec,nodev,mode=1777,size=10M
read CMDLINE </proc/cmdline
root=""
init=""
echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
# set default mount handler
mount_handler="default_mount_handler"
for cmd in ${CMDLINE}; do
case "${cmd}" in
\#*) break ;; # ignore everything after a # in the commandline
# The kernel passes those to the kernel on its own
[0123456Ss]) ;;
[0-9]*) ;;
single) ;;
rw) readwrite="yes" ;;
ro) readwrite="no" ;;
# only export stuff that does work with ash :)
*=*) rhs="$(echo "${cmd}" | cut -d= -f2-)"
cmd="$(echo "${cmd}" | cut -d= -f1 | sed 's|\.|_|g')"
cmd="$(echo "${cmd}" | sed 's|-|_|g')=\"${rhs}\""
(echo "${cmd}" | grep -qe '^[0-9]') || eval "${cmd}"
;;
*) cmd="$(echo "${cmd}" | sed 's|\.|_|g')"
cmd="$(echo "${cmd}" | sed 's|-|_|g')"
(echo "${cmd}" | grep -qe '^[0-9]') || eval "${cmd}=y"
;;
esac
done
# if available, start udevd at this stage
if [ -x /sbin/udevd ]; then
msg ":: Starting udevd..."
echo > /proc/sys/kernel/hotplug
/sbin/udevd --daemon --resolve-names=never
udevd_running=1
msg "done."
else
udevd_running=0
fi
if [ -n "${disablehooks}" ]; then
for d in $(echo "${disablehooks}" | sed 's|,| |g'); do
eval "hook_${d}=disabled"
done
fi
if [ -n "${disablemodules}" ]; then
for d in $(echo "${disablemodules}" | sed 's|,| |g'); do
eval "mod_${d}=disabled"
done
fi
if [ -n "${earlymodules}" ]; then
for m in $(echo "${earlymodules}" | sed 's|,| |g'); 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 rootdelay is empty or not a non-negative integer, set it to 10
if [ -z "${rootdelay}" ] || ! [ "${rootdelay}" -ge 0 ]; then
rootdelay=10
fi
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 [ "${break}" = "y" ]; then
echo ":: Break requested, type 'exit' to resume operation"
launch_interactive_shell
fi
if [ -f "/message" ]; then
msg "$(cat /message)"
fi
# Mount root at /new_root
mkdir -p /new_root
${mount_handler} /new_root
[ -z "${init}" ] && init="/sbin/init"
if [ "$(stat -c %D /)" = "$(stat -c %D /new_root)" ]; then
# Nothing got mounted on /new_root. This is the end, we don't know what to do anymore
# We fall back into a shell, but the shell has now PID 1
# This way, manual recovery is still possible.
err "Failed to mount the real root device."
echo "Bailing out, you are on your own. Good luck."
echo
launch_interactive_shell --exec
elif [ ! -x "/new_root${init}" ]; then
# Successfully mounted /new_root, but ${init} is missing
# The same logic as above applies
err "Root device mounted successfully, but ${init} does not exist."
echo "Bailing out, you are on your own. Good luck."
echo
launch_interactive_shell --exec
fi
#Special handling if udev is running
udevpid=$(/bin/pidof udevd)
if [ -n "${udevpid}" ]; then
# Settle pending uevents, then kill udev
/sbin/udevadm settle
/bin/kill ${udevpid} > /dev/null 2>&1
while /bin/pidof udevd >/dev/null; do
sleep 0.1
done
fi
for d in proc sys dev run; do
if [ -d /new_root/${d} ]; then
/bin/mount --move /${d} /new_root/${d}
else
/bin/umount /${d}
fi
done
exec /sbin/switch_root -c /dev/console /new_root ${init} "$@"
|