Annotation of /trunk/udev/udev.rc
Parent Directory | Revision Log
Revision 1813 -
(hide annotations)
(download)
Tue Jun 26 17:11:31 2012 UTC (12 years, 3 months ago) by niro
File size: 5291 byte(s)
Tue Jun 26 17:11:31 2012 UTC (12 years, 3 months ago) by niro
File size: 5291 byte(s)
-support newer udev/systemd-udev installations (>=udev-182, >=systemd-udev-185)
1 | niro | 1058 | #!/bin/bash |
2 | niro | 1813 | # $Id$ |
3 | niro | 1058 | |
4 | udev_version() | ||
5 | { | ||
6 | local version=0 | ||
7 | |||
8 | if [[ -x /sbin/udev ]] | ||
9 | then | ||
10 | version=$(/sbin/udev -V) | ||
11 | elif [[ -x /sbin/udevd ]] | ||
12 | then | ||
13 | version=$(/sbin/udevd --version) | ||
14 | niro | 1813 | elif [[ -x /lib/udev/udevd ]] |
15 | then | ||
16 | version=$(/lib/udev/udevd --version) | ||
17 | elif [[ -x /usr/lib/systemd/systemd-udevd ]] | ||
18 | then | ||
19 | version=$(/usr/lib/systemd/systemd-udev --version) | ||
20 | niro | 1058 | fi |
21 | |||
22 | niro | 1813 | # We need it without a leading '0', else bash do the wrong thing |
23 | version=${version##0} | ||
24 | # Older udev's will print nothing | ||
25 | [[ -z ${version} ]] && version=0 | ||
26 | |||
27 | niro | 1058 | echo "${version}" |
28 | } | ||
29 | |||
30 | populate_udev() | ||
31 | { | ||
32 | local opts | ||
33 | |||
34 | # tell modprobe.sh to be verbose to $CONSOLE | ||
35 | echo CONSOLE=${CONSOLE} > /dev/.udev_populate | ||
36 | |||
37 | # populate /dev with devices already found by the kernel | ||
38 | niro | 1289 | rc_print " Populating /dev with existing devices through uevents ..." |
39 | niro | 1058 | if [[ ${RC_COLDPLUG} = yes ]] |
40 | then | ||
41 | niro | 1813 | udevadm trigger |
42 | niro | 1058 | else |
43 | # do not run any init-scripts | ||
44 | niro | 1813 | udevadm control --env do_not_run_plug_service=1 |
45 | niro | 1058 | |
46 | # only create device nodes | ||
47 | niro | 1813 | udevadm trigger --attr-match=dev |
48 | niro | 1058 | |
49 | # run persistent-net stuff | ||
50 | niro | 1813 | udevadm trigger --subsystem-match=net |
51 | niro | 1058 | fi |
52 | evaluate_retval | ||
53 | |||
54 | # loop until everything is finished | ||
55 | niro | 1289 | rc_print " Letting udev process events ..." |
56 | niro | 1813 | udevadm settle --timeout=60 |
57 | niro | 1058 | evaluate_retval |
58 | |||
59 | # unset this variable | ||
60 | niro | 1813 | udevadm control --env do_not_run_plug_service= |
61 | niro | 1058 | |
62 | rm -f /dev/.udev_populate | ||
63 | return 0 | ||
64 | } | ||
65 | |||
66 | seed_dev() | ||
67 | { | ||
68 | # seed /dev with some things that we know we need | ||
69 | niro | 1289 | rc_print " Seeding /dev with needed nodes ..." |
70 | niro | 1058 | ( |
71 | [ ! -c /dev/console ] && mknod /dev/console c 5 1 | ||
72 | [ ! -c /dev/tty1 ] && mknod /dev/tty1 c 4 1 | ||
73 | [ ! -c /dev/null ] && mknod /dev/null c 1 3 | ||
74 | |||
75 | # create kmsg too, so udev can add its start-message to dmesg | ||
76 | [ -c /dev/kmsg ] || mknod -m 660 /dev/kmsg c 1 11 | ||
77 | |||
78 | # copy over any persistant things | ||
79 | if [[ -d /lib/udev/devices ]] | ||
80 | then | ||
81 | cp -RPp /lib/udev/devices/* /dev 2>/dev/null | ||
82 | fi | ||
83 | |||
84 | # not provided by sysfs but needed | ||
85 | ln -snf /proc/self/fd /dev/fd | ||
86 | ln -snf fd/0 /dev/stdin | ||
87 | ln -snf fd/1 /dev/stdout | ||
88 | ln -snf fd/2 /dev/stderr | ||
89 | [[ -e /proc/kcore ]] && ln -snf /proc/kcore /dev/core | ||
90 | |||
91 | # create problematic directories | ||
92 | mkdir -p /dev/pts /dev/shm | ||
93 | ) | ||
94 | evaluate_retval | ||
95 | } | ||
96 | |||
97 | # main function | ||
98 | start_devicemanager() | ||
99 | { | ||
100 | niro | 1813 | local udev_prefix="" |
101 | local udev_daemon="" | ||
102 | |||
103 | # get the right daemon and prefix for newer udev/systemd-udev installations | ||
104 | if [ -x /sbin/udevd ] | ||
105 | then | ||
106 | udev_daemon="/sbin/udevd" | ||
107 | udev_prefix="" | ||
108 | elif [ -x /lib/udev/udevd ] | ||
109 | then | ||
110 | udev_daemon="/lib/udev/udevd" | ||
111 | udev_prefix="" | ||
112 | elif [ -x /usr/lib/systemd/systemd-udevd ] | ||
113 | then | ||
114 | udev_daemon="/usr/lib/systemd/systemd-udevd" | ||
115 | udev_prefix="/usr" | ||
116 | fi | ||
117 | |||
118 | niro | 1058 | # check if /dev/console exists outside tmpfs |
119 | [ -c /dev/console ] ; need_redirect=$? | ||
120 | |||
121 | # create a ramdisk for populating udev | ||
122 | niro | 1725 | if [[ -z $(grep '[[:space:]]/dev[[:space:]]' /proc/mounts | cut -d ' ' -f2) ]] |
123 | then | ||
124 | rc_print "Mounting udev at /dev ..." | ||
125 | # many video drivers needed exec access | ||
126 | fstype=ramfs | ||
127 | # tmpfs was suggested by Greg Kroah-Hartman | ||
128 | kernel_supports_fs tmpfs && fstype=tmpfs | ||
129 | # mount devtmpfs if supported | ||
130 | kernel_supports_fs devtmpfs && fstype=devtmpfs | ||
131 | mount -n -t ${fstype} dev /dev -o exec,nosuid,mode=0755,size=10M | ||
132 | evaluate_retval | ||
133 | fi | ||
134 | niro | 1058 | |
135 | niro | 1813 | # if a device tarball exists load it but only if it is activated in the config |
136 | niro | 1289 | rc_print "Configurating system to use udev ..." |
137 | niro | 1058 | if [[ ${RC_DEVICE_TARBALL} = yes ]] |
138 | then | ||
139 | niro | 1813 | if [[ -f ${udev_prefix}/lib/udev/state/devices.tar.bz2 ]] |
140 | then | ||
141 | rc_print " Populating /dev with saved device nodes ..." | ||
142 | tar -jxpf ${udev_prefix}/lib/udev/state/devices.tar.bz2 -C /dev | ||
143 | evaluate_retval | ||
144 | fi | ||
145 | niro | 1058 | fi |
146 | |||
147 | niro | 1724 | # other needed device nodes with udev |
148 | niro | 1058 | seed_dev |
149 | |||
150 | if [ -e /proc/sys/kernel/hotplug ] | ||
151 | then | ||
152 | niro | 1289 | rc_print " Using netlink for hotplug events ..." |
153 | niro | 1058 | echo "" > /proc/sys/kernel/hotplug |
154 | evaluate_retval | ||
155 | else | ||
156 | niro | 1289 | rc_print ${COLYELLOW}" Kernel was not compiled with hotplug support !" |
157 | niro | 1058 | print_status failure |
158 | fi | ||
159 | |||
160 | # load unix domain sockets if built as module | ||
161 | if [ -e /proc/modules ] | ||
162 | then | ||
163 | modprobe -q unix 2>/dev/null | ||
164 | fi | ||
165 | |||
166 | niro | 1289 | rc_print " Starting udevd daemon ..." |
167 | niro | 1058 | if [ ${need_redirect} -eq 1 ] |
168 | then | ||
169 | # we need to open fds 0 1 2 | ||
170 | niro | 1813 | start-stop-daemon --start --exec "${udev_daemon}" -- --daemon </dev/console >/dev/console 2>/dev/console |
171 | niro | 1058 | else |
172 | niro | 1813 | start-stop-daemon --start --exec "${udev_daemon}" -- --daemon |
173 | niro | 1058 | fi |
174 | evaluate_retval | ||
175 | |||
176 | # write root_link rule | ||
177 | niro | 1813 | if [ -x ${udev_prefix}/lib/udev/write_root_link_rule ] |
178 | then | ||
179 | ${udev_prefix}/lib/udev/write_root_link_rule | ||
180 | fi | ||
181 | |||
182 | niro | 1058 | # populate udev device nodes |
183 | populate_udev | ||
184 | |||
185 | # create nodes that udev can't | ||
186 | niro | 1289 | rc_print " Finializing udev configuration ..." |
187 | niro | 1058 | [[ -x /sbin/dmsetup ]] && /sbin/dmsetup mknodes &>/dev/null |
188 | [[ -x /sbin/lvm ]] && /sbin/lvm vgscan -P --mknodes --ignorelockingfailure &>/dev/null | ||
189 | [[ -x /sbin/evms_activate ]] && /sbin/evms_activate -q &>/dev/null | ||
190 | print_status success | ||
191 | |||
192 | # same thing as /dev/.devfsd | ||
193 | touch /dev/.udev | ||
194 | } | ||
195 | |||
196 | stop_devicemanager() | ||
197 | { | ||
198 | niro | 1813 | local udev_daemon="" |
199 | |||
200 | # get the right daemon and prefix for newer udev/systemd-udev installations | ||
201 | if [ -x /sbin/udevd ] | ||
202 | then | ||
203 | udev_daemon="/sbin/udevd" | ||
204 | elif [ -x /lib/udev/udevd ] | ||
205 | then | ||
206 | udev_daemon="/lib/udev/udevd" | ||
207 | elif [ -x /usr/lib/systemd/systemd-udevd ] | ||
208 | then | ||
209 | udev_daemon="/usr/lib/systemd/systemd-udevd" | ||
210 | fi | ||
211 | |||
212 | niro | 1289 | rc_print "Stopping udevd daemon ..." |
213 | niro | 1813 | start-stop-daemon --stop --exec "${udev_daemon}" |
214 | niro | 1058 | evaluate_retval |
215 | } |