1 | #!/bin/bash
|
---|
2 | #
|
---|
3 | # start_udev
|
---|
4 | #
|
---|
5 | # script to initialize /dev by using udev.
|
---|
6 | #
|
---|
7 | # Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
|
---|
8 | #
|
---|
9 | # Released under the GPL v2 only.
|
---|
10 | #
|
---|
11 | # This needs to be run at the earliest possible point in the boot
|
---|
12 | # process.
|
---|
13 | #
|
---|
14 | # Based on the udev init.d script
|
---|
15 | #
|
---|
16 | # Thanks go out to the Gentoo developers for proving
|
---|
17 | # that this is possible to do.
|
---|
18 | #
|
---|
19 | # Yes, it's very verbose, feel free to turn off all of the echo calls,
|
---|
20 | # they were there to make me feel better that everything was working
|
---|
21 | # properly during development...
|
---|
22 | #
|
---|
23 | # don't use udev if sysfs is not mounted.
|
---|
24 |
|
---|
25 | sysfs_dir=/sys
|
---|
26 |
|
---|
27 | export TZ=/etc/localtime
|
---|
28 |
|
---|
29 | [ -d $sysfs_dir/class ] || exit 1
|
---|
30 | [ -r /proc/mounts ] || exit 1
|
---|
31 | [ -x /sbin/udevd ] || exit 1
|
---|
32 | [ -f /etc/udev/udev.conf ] && . /etc/udev/udev.conf
|
---|
33 | udev_root=${udev_root-/dev}
|
---|
34 |
|
---|
35 | if [ -f /dev/.in_sysinit ]; then
|
---|
36 | exec >/dev/console 2>/dev/console </dev/console
|
---|
37 | fi
|
---|
38 |
|
---|
39 | . /etc/init.d/functions
|
---|
40 | . /etc/sysconfig/udev
|
---|
41 |
|
---|
42 | prog=udev
|
---|
43 | bin=/sbin/udev
|
---|
44 | udevd=/sbin/udevd
|
---|
45 | MAKEDEV="/sbin/MAKEDEV"
|
---|
46 |
|
---|
47 | # Check SELinux status
|
---|
48 | selinuxfs="$(fstab_decode_str `LC_ALL=C awk '/ selinuxfs / { print $2 }' /proc/mounts`)"
|
---|
49 | SELINUX_STATE=
|
---|
50 | if [ -n "$selinuxfs" ] && [ "`cat /proc/self/attr/current`" != "kernel" ]; then
|
---|
51 | if [ -r "$selinuxfs/enforce" ] ; then
|
---|
52 | SELINUX_STATE=`cat "$selinuxfs/enforce"`
|
---|
53 | else
|
---|
54 | # assume enforcing if you can't read it
|
---|
55 | SELINUX_STATE=1
|
---|
56 | fi
|
---|
57 | fi
|
---|
58 |
|
---|
59 |
|
---|
60 |
|
---|
61 | xargs_simple () {
|
---|
62 | if [ "$1" = "-n" ]; then
|
---|
63 | shift
|
---|
64 | MAXNR="$1"
|
---|
65 | shift
|
---|
66 | else
|
---|
67 | MAXNR=100
|
---|
68 | fi
|
---|
69 | NR=$MAXNR
|
---|
70 | ARGS=""
|
---|
71 | [ -z "$1" ] && set echo
|
---|
72 |
|
---|
73 | while read line; do
|
---|
74 | if [ $NR -gt 0 ]; then
|
---|
75 | ARGS="$ARGS $line"
|
---|
76 | NR=$[$NR - 1]
|
---|
77 | else
|
---|
78 | "$@" $ARGS
|
---|
79 | NR=$MAXNR
|
---|
80 | ARGS="$line"
|
---|
81 | fi
|
---|
82 | done
|
---|
83 | if [ -n "$ARGS" ]; then
|
---|
84 | "$@" $ARGS
|
---|
85 | fi
|
---|
86 | }
|
---|
87 |
|
---|
88 | make_extra_nodes () {
|
---|
89 | ln -snf /proc/self/fd $udev_root/fd
|
---|
90 | ln -snf /proc/self/fd/0 $udev_root/stdin
|
---|
91 | ln -snf /proc/self/fd/1 $udev_root/stdout
|
---|
92 | ln -snf /proc/self/fd/2 $udev_root/stderr
|
---|
93 | ln -snf /proc/kcore $udev_root/core
|
---|
94 |
|
---|
95 | [ -d $udev_root/pts ] || mkdir -m 0755 $udev_root/pts
|
---|
96 | [ -d $udev_root/shm ] || mkdir -m 0755 $udev_root/shm
|
---|
97 | [ -d $udev_root/hugepages ] || mkdir -m 0755 $udev_root/hugepages
|
---|
98 | [ -a /dev/MAKEDEV ] || ln -s $MAKEDEV /dev/MAKEDEV;
|
---|
99 |
|
---|
100 | USE_MD5="false"
|
---|
101 | [ -x /usr/bin/md5sum -a "$UDEV_USE_MAKEDEV_CACHE" == "yes" ] && USE_MD5="true"
|
---|
102 |
|
---|
103 | for i in 0 1 2 3 4 5 6 7; do
|
---|
104 | [ -b /dev/loop$i ] || /bin/mknod -m 0640 /dev/loop$i b 7 $i
|
---|
105 | /bin/chown root:disk /dev/loop$i
|
---|
106 | done
|
---|
107 |
|
---|
108 | for i in 0 1 2 3; do
|
---|
109 | [ -c /dev/lp$i ] || /bin/mknod -m 0660 /dev/lp$i c 6 $i
|
---|
110 | /bin/chown root:lp /dev/lp$i
|
---|
111 | done
|
---|
112 |
|
---|
113 | [ -d /dev/net ] || mkdir -p /dev/net
|
---|
114 | [ -c /dev/net/tun ] || /bin/mknod -m 0666 /dev/net/tun c 10 200
|
---|
115 | #/bin/chown root:root /dev/net/tun
|
---|
116 |
|
---|
117 | [ -c /dev/ppp ] || /bin/mknod -m 0600 /dev/ppp c 108 0
|
---|
118 | #/bin/chown root:root /dev/ppp
|
---|
119 |
|
---|
120 | [ -c /dev/fuse ] || /bin/mknod -m 0666 /dev/fuse c 10 229
|
---|
121 | #/bin/chown root:root /dev/fuse
|
---|
122 |
|
---|
123 | if [ -x /sbin/restorecon ]; then
|
---|
124 | /sbin/restorecon -R /dev
|
---|
125 | fi
|
---|
126 |
|
---|
127 | if [ -x "$MAKEDEV" ]; then
|
---|
128 | for i in /etc/udev/makedev.d/*.nodes; do
|
---|
129 | if [ -f "$i" ]; then
|
---|
130 | # use a little caching to speedup things
|
---|
131 | if [ "$USE_MD5" == "true" ]; then
|
---|
132 | # fix for MAKEDEV shell scripts
|
---|
133 | [ -d /dev/.udev/makedev.d ] || mkdir -p /dev/.udev/makedev.d
|
---|
134 | md5=$(/usr/bin/md5sum "$i"|(read a b; echo $a))-se$SELINUX_STATE
|
---|
135 | if [ -f "/var/lib/udev/makedev.d/${md5}.sh" ];then
|
---|
136 | md5file="/var/lib/udev/makedev.d/${md5}.sh"
|
---|
137 | else
|
---|
138 | md5file="/dev/.udev/makedev.d/${md5}.sh"
|
---|
139 | fi
|
---|
140 | if [ ! -f "$md5file" ]; then
|
---|
141 | ( sed -e 's,#.*,,g' "$i" | \
|
---|
142 | xargs_simple -n 100 $MAKEDEV -x -a -S ) \
|
---|
143 | > "$md5file"
|
---|
144 | fi
|
---|
145 | . "$md5file" >$udev_root/null 2>&1
|
---|
146 | else
|
---|
147 | ( sed -e 's,#.*,,g' "$i" | \
|
---|
148 | xargs_simple -n 100 $MAKEDEV -x )
|
---|
149 | fi
|
---|
150 | fi
|
---|
151 | done
|
---|
152 | fi
|
---|
153 |
|
---|
154 | for devdir in /etc/udev/devices /lib/udev/devices; do
|
---|
155 | [ -d "$devdir" ] || continue
|
---|
156 | pushd $devdir &> "$udev_root/null"
|
---|
157 | set *
|
---|
158 | if [ "$1" != "*" ]; then
|
---|
159 | #echo "Warning: $devdir is deprecated. Please use /etc/udev/makedev.d/."
|
---|
160 | cp -ar "$@" $udev_root/
|
---|
161 | pushd "$udev_root" &> "$udev_root/null"
|
---|
162 | [ -x /sbin/restorecon ] && /sbin/restorecon "$@"
|
---|
163 | popd &> "$udev_root/null"
|
---|
164 | fi
|
---|
165 | popd &> "$udev_root/null"
|
---|
166 | done
|
---|
167 | }
|
---|
168 |
|
---|
169 | kill_udevd() {
|
---|
170 | if [ -x /sbin/pidof ]; then
|
---|
171 | pid=`/sbin/pidof -x udevd`
|
---|
172 | [ -n "$pid" ] && kill $pid
|
---|
173 | fi
|
---|
174 | }
|
---|
175 |
|
---|
176 | findalias () {
|
---|
177 | local n
|
---|
178 | for n in "$1"/* ; do
|
---|
179 | [ -h "$n" ] && continue
|
---|
180 | [ -d "$n" ] && { findalias "$n" ; continue; }
|
---|
181 | [ "${n##*/}" == "modalias" ] && echo $(cat $n)
|
---|
182 | done
|
---|
183 | }
|
---|
184 |
|
---|
185 | # returns OK if $1 contains $2
|
---|
186 | strstr() {
|
---|
187 | [ "${1#*$2*}" = "$1" ] && return 1
|
---|
188 | return 0
|
---|
189 | }
|
---|
190 |
|
---|
191 | getval() {
|
---|
192 | what=$1
|
---|
193 | shift
|
---|
194 | for arg; do
|
---|
195 | if strstr "$arg" "$what="; then
|
---|
196 | val=${arg#${what}=*}
|
---|
197 | echo $val
|
---|
198 | return 0
|
---|
199 | fi
|
---|
200 | done
|
---|
201 | return 1
|
---|
202 | }
|
---|
203 |
|
---|
204 | wait_for_queue() {
|
---|
205 | local timeout=${1:-0}
|
---|
206 | local ret=0
|
---|
207 | if [ $timeout -gt 0 ]; then
|
---|
208 | /sbin/udevadm settle --timeout=$timeout
|
---|
209 | else
|
---|
210 | /sbin/udevadm settle
|
---|
211 | fi
|
---|
212 | ret=$?
|
---|
213 | if [ $ret -ne 0 ]; then
|
---|
214 | echo -n "Wait timeout. Will continue in the background."
|
---|
215 | fi
|
---|
216 | return $ret;
|
---|
217 | }
|
---|
218 |
|
---|
219 | export ACTION=add
|
---|
220 | prog=udev
|
---|
221 | ret=0
|
---|
222 | STRING=$"Starting $prog: "
|
---|
223 | # propagate $udev_root from /sys
|
---|
224 | echo -n "$STRING"
|
---|
225 |
|
---|
226 | # mount the tmpfs on ${udev_root%/}, if not already done
|
---|
227 | LANG=C awk "\$2 == \"${udev_root%/}\" && ( \$3 == \"devtmpfs\" || \$3 == \"tmpfs\" ) { exit 1 }" /proc/mounts && {
|
---|
228 | if LANG=C fgrep -q "none ${udev_root%/}/pts " /proc/mounts; then
|
---|
229 | PTSDIR=$(mktemp -d)
|
---|
230 | mount --move $udev_root/pts "$PTSDIR"
|
---|
231 | fi
|
---|
232 | if LANG=C fgrep -q "none ${udev_root%/}/shm " /proc/mounts; then
|
---|
233 | SHMDIR=$(mktemp -d)
|
---|
234 | mount --move $udev_root/shm "$SHMDIR"
|
---|
235 | fi
|
---|
236 | # First try to mount a devtmpfs on $udev_root
|
---|
237 | mount -n -o mode=0755 -t devtmpfs none "$udev_root" 2>/dev/null \
|
---|
238 | || mount -n -o mode=0755 -t tmpfs none "$udev_root"
|
---|
239 | mkdir -m 0755 $udev_root/pts
|
---|
240 | mkdir -m 0755 $udev_root/shm
|
---|
241 | if [ -n "$PTSDIR" ]; then
|
---|
242 | mount --move "$PTSDIR" $udev_root/pts
|
---|
243 | rmdir "$PTSDIR"
|
---|
244 | fi
|
---|
245 | if [ -n "$SHMDIR" ]; then
|
---|
246 | mount --move "$SHMDIR" $udev_root/shm
|
---|
247 | rmdir "$SHMDIR"
|
---|
248 | fi
|
---|
249 |
|
---|
250 | ret=$[$ret + $?]
|
---|
251 | }
|
---|
252 |
|
---|
253 | make_extra_nodes
|
---|
254 | cmdline=$(cat /proc/cmdline)
|
---|
255 | kill_udevd > "$udev_root/null" 2>&1
|
---|
256 | [ -d $udev_root/.udev ] || mkdir -p $udev_root/.udev > "$udev_root/null" 2>&1
|
---|
257 | UDEV_OPTS=""
|
---|
258 | if [ -f "/sys/class/tty/console/uevent" ]; then
|
---|
259 | # trigger the sorted events
|
---|
260 | echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug
|
---|
261 |
|
---|
262 | if strstr "$cmdline" udevtrace; then
|
---|
263 | UDEV_OPTS="$UDEV_OPTS --debug-trace"
|
---|
264 | fi
|
---|
265 |
|
---|
266 | if strstr "$cmdline" udevlog; then
|
---|
267 | UDEV_OPTS="$UDEV_OPTS --debug"
|
---|
268 | /sbin/udevd -d $UDEV_OPTS 2>$udev_root/.udev/udev.log
|
---|
269 | else
|
---|
270 | /sbin/udevd -d $UDEV_OPTS
|
---|
271 | fi
|
---|
272 |
|
---|
273 | wait
|
---|
274 | ret=$[$ret + $?]
|
---|
275 |
|
---|
276 | udevtimeout=$(getval udevtimeout $cmdline)
|
---|
277 |
|
---|
278 | if strstr "$cmdline" udevdebug; then
|
---|
279 | /sbin/udevadm control --log-priority=debug
|
---|
280 | fi
|
---|
281 | if strstr "$cmdline" udevinfo; then
|
---|
282 | /sbin/udevadm control --log-priority=info
|
---|
283 | fi
|
---|
284 | if strstr "$cmdline" udevchilds; then
|
---|
285 | /sbin/udevadm control --max-childs=$(getval udevchilds $cmdline)
|
---|
286 | fi
|
---|
287 | if strstr "$cmdline" noiswmd; then
|
---|
288 | /sbin/udevadm control --env=rd_NO_MDIMSM=1
|
---|
289 | fi
|
---|
290 |
|
---|
291 | . /etc/sysconfig/network
|
---|
292 | if [ "$BIOSDEVNAME" = "yes" ]; then
|
---|
293 | /sbin/udevadm control --property=UDEV_BIOSDEVNAME=1
|
---|
294 | fi
|
---|
295 | if [ "$BIOSDEVNAME" = "no" ]; then
|
---|
296 | /sbin/udevadm control --property=UDEV_BIOSDEVNAME=0
|
---|
297 | fi
|
---|
298 |
|
---|
299 | /sbin/udevadm control --env=STARTUP=1
|
---|
300 |
|
---|
301 | if strstr "$cmdline" modprobedebug; then
|
---|
302 | /sbin/udevadm control --env=MODPROBE_OPTIONS="-s -v -q"
|
---|
303 | echo
|
---|
304 | findalias /sys | while read modules ; do
|
---|
305 | if [ -n "$modules" ]; then
|
---|
306 | echo "Loading modules for $modules in 5 seconds"
|
---|
307 | sleep 5
|
---|
308 | /sbin/modprobe -a -v -q $modules
|
---|
309 | wait_for_queue $udevtimeout
|
---|
310 | fi
|
---|
311 | done
|
---|
312 | echo "Triggering Rest"
|
---|
313 | fi
|
---|
314 |
|
---|
315 | /sbin/udevadm trigger --type=subsystems --action=add
|
---|
316 | /sbin/udevadm trigger --type=devices --action=add
|
---|
317 |
|
---|
318 | ret=$[$ret + $?]
|
---|
319 | wait_for_queue $udevtimeout
|
---|
320 | ret=$[$ret + $?]
|
---|
321 | wait
|
---|
322 | /sbin/udevadm control --env=STARTUP=
|
---|
323 | else
|
---|
324 | echo -n " kernel too old for this udev version "
|
---|
325 | /sbin/udevd -d $UDEV_OPTS
|
---|
326 | ret=10
|
---|
327 |
|
---|
328 | fi
|
---|
329 |
|
---|
330 | ret=$[$ret + $?]
|
---|
331 | [ $ret -eq 0 ] && success $"$STRING" || failure $"$STRING"
|
---|
332 | echo
|
---|
333 | exit 0
|
---|