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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
#!/bin/sh -e
### BEGIN INIT INFO
# Provides: udev
# Required-Start: mountvirtfs
# Required-Stop:
# Default-Start: S
# Default-Stop:
# Short-Description: Start udevd, populate /dev and load drivers.
### END INIT INFO
# we need to unmount /dev/pts/ and remount it later over the tmpfs
unmount_devpts() {
if mountpoint -q /dev/pts/; then
umount -l /dev/pts/
fi
if mountpoint -q /dev/shm/; then
umount -l /dev/shm/
fi
}
# mount a tmpfs over /dev, if somebody did not already do it
mount_tmpfs() {
if grep -E -q "^[^[:space:]]+ /dev tmpfs" /proc/mounts; then
return
fi
# /dev/.static/dev/ is used by MAKEDEV to access the real /dev/ directory.
# /etc/udev/ is recycled as a temporary mount point because it's the only
# directory which is guaranteed to be available.
mount -n -o bind /dev /etc/udev
if ! mount -n -o size=$tmpfs_size,mode=0755 -t tmpfs tmpfs /dev; then
umount /etc/udev
echo "udev requires tmpfs support, not started."
exit 1
fi
mkdir -p /dev/.static/dev
chmod 700 /dev/.static/
# The mount options in busybox are non-standard...
if test -x /bin/mount.util-linux
then
/bin/mount.util-linux --move /etc/udev /dev/.static/dev
elif test -x /bin/busybox
then
busybox mount -n -o move /etc/udev /dev/.static/dev
else
echo "udev requires an identifiable mount command, not started."
umount /etc/udev
umount /dev
exit 1
fi
}
create_dev_makedev() {
if [ -e /sbin/MAKEDEV ]; then
[ ! -e /dev/MAKEDEV ] || ln -s /sbin/MAKEDEV /dev/MAKEDEV
else
ln -s /bin/true /dev/MAKEDEV
fi
}
# I hate this hack. -- Md
make_extra_nodes() {
if [ "$(echo /lib/udev/devices/*)" != "/lib/udev/devices/*" ]; then
cp -a /lib/udev/devices/* /dev/
fi
[ -e /etc/udev/links.conf ] || return 0
grep '^[^#]' /etc/udev/links.conf | \
while read type name arg1; do
[ "$type" -a "$name" -a ! -e "/dev/$name" -a ! -L "/dev/$name" ] ||continue
case "$type" in
L) ln -s $arg1 /dev/$name ;;
D) mkdir -p /dev/$name ;;
M) mknod -m 600 /dev/$name $arg1 ;;
*) echo "links.conf: unparseable line ($type $name $arg1)" ;;
esac
done
}
supported_kernel() {
case "$(uname -r)" in
2.[012345].*|2.6.[0-9]|2.6.[0-9][!0-9]*) return 1 ;;
2.6.1[0-4]|2.6.1[0-4][!0-9]*) return 1 ;;
esac
return 0
}
load_input_modules() {
case "$(uname -r)" in
2.6.1[0-5]|2.6.1[0-5][!0-9]*) ;; # <= 2.6.15
*) return 0
esac
for module in mousedev evdev joydev; do
modprobe -q $module || true
done
}
# shell version of /usr/bin/tty
my_tty() {
[ -x /bin/readlink ] || return 0
[ -e /proc/self/fd/0 ] || return 0
readlink --silent /proc/self/fd/0 || true
}
warn_if_interactive() {
if [ "$RUNLEVEL" = "S" -a "$PREVLEVEL" = "N" ]; then
return
fi
TTY=$(my_tty)
if [ -z "$TTY" -o "$TTY" = "/dev/console" ]; then
return
fi
printf "\n\n\nIt has been detected that the command\n\n\t$0 $*\n\n"
printf "has been run from an interactive shell.\n"
printf "It will probably not do what you expect, so this script will wait\n"
printf "60 seconds before continuing. Press ^C to stop it.\n"
printf "RUNNING THIS COMMAND IS HIGHLY DISCOURAGED!\n\n\n\n"
sleep 60
}
##############################################################################
[ -x /sbin/udevd ] || exit 0
PATH="/sbin:/bin:/usr/bin"
# defaults
tmpfs_size="2M"
udev_root="/dev"
if [ -e /etc/udev/udev.conf ]; then
. /etc/udev/udev.conf
fi
if ! supported_kernel; then
echo "udev requires a kernel >= 2.6.15, not started."
exit 1
fi
if [ ! -e /proc/filesystems ]; then
echo "udev requires a mounted procfs, not started."
exit 1
fi
if ! grep -q '[[:space:]]tmpfs$' /proc/filesystems; then
echo "udev requires tmpfs support, not started."
exit 1
fi
if [ ! -d /sys/class/ ]; then
echo "udev requires a mounted sysfs, not started."
exit 1
fi
if [ ! -e /proc/sys/kernel/hotplug ]; then
echo "udev requires hotplug support, not started."
exit 1
fi
##############################################################################
# When modifying this script, do not forget that between the time that
# the new /dev has been mounted and udevsynthesize has been run there will be
# no /dev/null. This also means that you cannot use the "&" shell command.
udev_root=${udev_root%/}
case "$1" in
start)
if [ -e "$udev_root/.udev/" ]; then
if mountpoint -q $udev_root/; then
TMPFS_MOUNTED=1
else
echo ".udev/ already exists on the static $udev_root!"
fi
else
warn_if_interactive
fi
echo > /proc/sys/kernel/hotplug
if [ -z "$TMPFS_MOUNTED" ]; then
unmount_devpts
mount_tmpfs
[ -d /proc/1 ] || mount -n /proc
fi
# /dev/null must be created before udevd is started
make_extra_nodes
echo "Starting the hotplug events dispatcher" "udevd"
udevd --daemon
# if this directory is not present /dev will not be updated by udev
mkdir -p /dev/.udev/db/ /dev/.udev/queue/
echo "Synthesizing the initial hotplug events"
udevtrigger
load_input_modules
create_dev_makedev
# wait for the udevd childs to finish
echo "Waiting for /dev to be fully populated"
if ! udevsettle; then
echo 'timeout'
fi
;;
stop)
echo "Stopping the hotplug events dispatcher" "udevd"
start-stop-daemon --stop --name udevd --quiet
;;
restart)
echo "Stopping the hotplug events dispatcher" "udevd"
if start-stop-daemon --stop --name udevd --quiet ; then
exit 1
fi
echo "Starting the hotplug events dispatcher" "udevd"
udevd --daemon
;;
reload)
udevcontrol reload_rules
;;
*)
echo "Usage: /etc/init.d/udev {start|stop|restart|reload}"
exit 1
;;
esac
exit 0
|