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
|
#!/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
devtmpfs_mounted=1
else
/bin/mount -n -t tmpfs udev /dev -o mode=0755,size=10M,nosuid
devtmpfs_mounted=0
# 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=755,size=10M
root=""
init=""
echo "/sbin/modprobe" > /proc/sys/kernel/modprobe
# set default mount handler
mount_handler="default_mount_handler"
# parse the kernel command line
parse_cmdline
# if available, start udevd at this stage
if [ -x /sbin/udevd ]; then
msg ":: Starting udevd..."
/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 "${earlymodules}" ]; then
/sbin/modprobe -qab ${earlymodules//,/ }
fi
. /config
[ -n "$MODULES" ] && /sbin/modprobe -qab $MODULES
# 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
# Stop udevd if is running
if [ "${udevd_running}" -eq 1 ]; then
/sbin/udevadm control --exit
/sbin/udevadm info --cleanup-db
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 env -i TERM=$TERM /sbin/switch_root -c /dev/console /new_root ${init} "$@"
# vim: set ft=sh ts=4 sw=4 et:
|