Ticket #600: start_udev-RHEL-6.1

File start_udev-RHEL-6.1, 8.2 KB (added by victor gattegno, 12 years ago)

RHEL 6 start_udev (just for info), working well with mindi 2.1.1

Line 
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
25sysfs_dir=/sys
26
27export 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
33udev_root=${udev_root-/dev}
34
35if [ -f /dev/.in_sysinit ]; then
36 exec >/dev/console 2>/dev/console </dev/console
37fi
38
39. /etc/init.d/functions
40. /etc/sysconfig/udev
41
42prog=udev
43bin=/sbin/udev
44udevd=/sbin/udevd
45MAKEDEV="/sbin/MAKEDEV"
46
47# Check SELinux status
48selinuxfs="$(fstab_decode_str `LC_ALL=C awk '/ selinuxfs / { print $2 }' /proc/mounts`)"
49SELINUX_STATE=
50if [ -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
57fi
58
59
60
61xargs_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
88make_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
169kill_udevd() {
170 if [ -x /sbin/pidof ]; then
171 pid=`/sbin/pidof -x udevd`
172 [ -n "$pid" ] && kill $pid
173 fi
174}
175
176findalias () {
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
186strstr() {
187 [ "${1#*$2*}" = "$1" ] && return 1
188 return 0
189}
190
191getval() {
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
204wait_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
219export ACTION=add
220prog=udev
221ret=0
222STRING=$"Starting $prog: "
223# propagate $udev_root from /sys
224echo -n "$STRING"
225
226# mount the tmpfs on ${udev_root%/}, if not already done
227LANG=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
253make_extra_nodes
254cmdline=$(cat /proc/cmdline)
255kill_udevd > "$udev_root/null" 2>&1
256[ -d $udev_root/.udev ] || mkdir -p $udev_root/.udev > "$udev_root/null" 2>&1
257UDEV_OPTS=""
258if [ -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=
323else
324 echo -n " kernel too old for this udev version "
325 /sbin/udevd -d $UDEV_OPTS
326 ret=10
327
328fi
329
330ret=$[$ret + $?]
331[ $ret -eq 0 ] && success $"$STRING" || failure $"$STRING"
332echo
333exit 0