source: chapter07/udev.xml@ 0ffc1a4

6.0
Last change on this file since 0ffc1a4 was 0ffc1a4, checked in by Gerard Beekmans <gerard@…>, 20 years ago

fixed validation issues

git-svn-id: http://svn.linuxfromscratch.org/LFS/branches/testing/BOOK@4257 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

  • Property mode set to 100644
File size: 11.7 KB
Line 
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
3 <!ENTITY % general-entities SYSTEM "../general.ent">
4 %general-entities;
5]>
6<sect1 id="ch-scripts-udev">
7<title>Device and Module Handling on an LFS System</title>
8<?dbhtml filename="udev.html"?>
9
10<indexterm zone="ch-scripts-udev">
11<primary sortas="a-Udev">Udev</primary>
12<secondary>usage</secondary></indexterm>
13
14<para>In <xref linkend="chapter-building-system"/>, we installed the Udev
15package. Before we go into the details regarding how this works,
16a brief history of previous methods of handling devices is in
17order.</para>
18
19<para>Linux systems in general traditionally use a static device
20creation method, whereby a great many device nodes are created under
21<filename class="directory">/dev</filename> (sometimes literally
22thousands of nodes), regardless of whether the corresponding hardware
23devices actually exist. This is typically done via a
24<command>MAKEDEV</command> script, which contains a number of
25calls to the <command>mknod</command> program with the relevant major and minor device
26numbers for every possible device that might exist in the world. Using
27the udev method, only those devices which are detected by the kernel
28get device nodes created for them. Because these device nodes will be
29created each time the system boots, they will be stored on a
30<systemitem class="filesystem">ramfs</systemitem> (a file system that
31resides entirely in memory and does not take up any disk space).
32Device nodes do not require much disk space, so the memory that is
33used in negligable.</para>
34
35<sect2>
36<title>History</title>
37
38<para>In Febraury 2000, a new filesystem called <systemitem
39class="filesystem">devfs</systemitem> was merged into the 2.3.46
40kernel and was made available during the 2.4 series of
41stable kernels. Although it was present in the kernel source itself,
42this method of creating devices dynamically never received
43overwhelming support from the core kernel developers.</para>
44
45<para>The main problem with the approach adopted by <systemitem
46class="filesystem">devfs</systemitem> was the way it handled
47device detection, creation, and naming. The latter issue, that of
48device node naming, was perhaps the most critical. It is generally
49accepted that if device names are allowed to be configurable, then
50the device naming policy should be up to a system administrator, not
51imposed on them by any particular developer(s). The <systemitem
52class="filesystem">devfs</systemitem> file system also suffers from race
53conditions that are inherent in its design and cannot be fixed
54without a substantial revision to the kernel. It has also been marked
55as deprecated due to a lack of recent maintenance.</para>
56
57<para>With the development of the unstable 2.5 kernel tree, later
58released as the 2.6 series of stable kernels, a new virtual filesystem
59called <systemitem class="filesystem">sysfs</systemitem> came to be.
60The job of <systemitem class="filesystem">sysfs</systemitem> is to
61export a view of the system's structure to userspace processes. With
62this userspace visible representation, the possibility of seeing a
63userspace replacement for <systemitem
64class="filesystem">devfs</systemitem> became much more
65realistic.</para>
66<beginpage/>
67</sect2>
68
69<sect2>
70<title>Udev Implementation</title>
71
72<para>The <systemitem class="filesystem">sysfs</systemitem> filesystem
73was mentioned briefly above. One may wonder how <systemitem
74class="filesystem">sysfs</systemitem> knows about the devices present
75on a system and what device numbers should be used. Drivers that
76have been compiled into the kernel directly register their objects
77with <systemitem class="filesystem">sysfs</systemitem> as they are
78detected by the kernel. For drivers compiled as modules, this will
79happen when the module is loaded. Once the <systemitem
80class="filesystem">sysfs</systemitem> filesystem is mounted (on
81<filename class="directory">/sys</filename>), the data which the
82built-in drivers registered with <systemitem
83class="filesystem">sysfs</systemitem> are available to userspace
84processes and to <command>udev</command> for device node creation.</para>
85
86<para>The <command>S10udev</command> initscript takes care of creating
87these device nodes when Linux is booted. This script starts with
88registering <command>/sbin/udev</command> as a hotplug event handler.
89Hotplug events (discussed below) should not be generated during this
90stage, but <command>udev</command> is registered just in case they do
91occur. The <command>udevstart</command> program then walks through
92the <systemitem class="filesystem">/sys</systemitem> filesystem and
93creates devices under <filename class="directory">/dev</filename> that
94match the descriptions. For example,
95<filename>/sys/class/tty/vcs/dev</filename> contains the string
96<quote>7:0</quote> This string is used by <command>udevstart</command>
97to create <filename>/dev/vcs</filename> with major number
98<emphasis>7</emphasis> and minor <emphasis>0</emphasis>. The
99permissions of each and every device that <command>udevstart</command>
100creates are set using files from the <filename
101class="directory">/etc/udev.d/permissions.d/</filename> directory.
102These are numbered in a similar fashion to the LFS bootscripts. If
103<command>udev</command> cannot find a permissions file for the device
104it is creating, it will default permissions to
105<emphasis>600</emphasis> and ownership to
106<emphasis>root:root</emphasis>. The names of the nodes created under
107the <filename class="directory">/dev</filename> directory are
108configured according to the rules specified in the files within the
109<filename class="directory">/etc/udev/rules.d/</filename>
110directory.</para>
111
112<para>Once the above stage is complete, all devices that were already
113present and have compiled-in drivers will be available for use. What
114about those devices that have modular drivers?</para>
115
116<para>Earlier, we mentioned the concept of a <quote>hotplug event
117handler.</quote> When a new device connection is detected by the
118kernel, the kernel will generate a hotplug event and look at the file
119<filename>/proc/sys/kernel/hotplug</filename> to find out the
120userspace program that handles the device's connection. The
121<command>udev</command> initscript registered <command>udev</command>
122as this handler. When these hotplug events are generated, the kernel
123will tell <command>udev</command> to check the <filename
124class="directory">/sys</filename> filesystem for the information
125pertaining to this new device and create the <filename
126class="directory">/dev</filename> entry for it.</para>
127
128<para>This brings us to one problem that exists with
129<command>udev</command>, and likewise with <systemitem
130class="filesystem">devfs</systemitem> before it. It is commonly
131referred to as the <quote>chicken and egg</quote> problem. Most Linux
132distrubtions handle loading modules via entries in
133<filename>/etc/modules.conf</filename>. Access to a device node causes
134the appropriate kernel module to load. With <command>udev</command>,
135this method will not work because the device node does not exist until
136the module is loaded. To solve this, the
137<command>S05modules</command> bootscript was added to the
138lfs-bootscripts package, along with the
139<filename>/etc/sysconfig/modules</filename> file. By adding module
140names to the <filename>modules</filename> file, these modules will be
141loaded when the computer is starting up. This allows
142<command>udev</command> to detect the devices and create the
143appropriate device nodes.</para>
144
145<para>Note that on slower machines or for drivers that create a lot
146of device nodes, the process of creating devices may take a few
147seconds to complete. This means that some device nodes may not be
148immediately accessible.</para>
149</sect2>
150
151<sect2>
152<title>Handling Hotpluggable/Dynamic Devices</title>
153
154<para>When you plug in a device, such a Universal Serial Bus (USB) MP3 player, the kernel
155recognizes that the device is now connected and generates a hotplug
156event. If the driver is already loaded (either because it was compiled
157into the kernel or because it was loaded via the
158<command>S05modules</command> bootscript), <command>udev</command> will
159be called upon to create the relevant device node(s) according to the
160<systemitem class="filesystem">sysfs</systemitem> data available in
161<filename class="directory">/sys</filename>. If the driver for the
162just plugged in device is available as a module but currently unloaded,
163then attaching the device to the system will only cause the kernel's
164bus driver to generate a hotplug event that notifies userspace of the
165new device connection and it not being attached to a driver. In
166effect, nothing happens and the device itself is not usable
167yet.</para>
168
169<para>If building a system that has a lot of drivers compiled as
170modules rather than directly built into the kernel, using the
171<command>S05modules</command> may not be practical. The Hotplug
172package (see <ulink url="http://linux-hotplug.sourceforge.net/"/>) can
173be beneficial in these cases. When the Hotplug package is installed,
174it will respond to the aforementioned kernel's bus driver hotplug
175events. The Hotplug package will load the appropriate module and make
176this device available by creating the device node(s) for it.</para>
177</sect2>
178
179<sect2>
180<title>Problems with Creating Devices</title>
181
182<para>There are a few known problems when it comes to automatically creating
183devices nodes:</para>
184
185<para>1) A kernel driver may not export its data to <systemitem
186class="filesystem">sysfs</systemitem>.</para>
187
188<para>This is most common with third party drivers from outside the
189kernel tree. These drivers will not end up having their device nodes
190created. Use the
191<filename>/etc/sysconfig/createfiles</filename> configuration file to
192manually create the devices. Consult the
193<filename>devices.txt</filename> file inside the kernel documentation
194or the documentation for that driver to find the proper major/minor
195numbers.</para>
196
197<para>2) A non-hardware device is required. This is most common with
198the Advanced Linux Sound Architecture (ALSA) project's Open Sound
199System (OSS) compatibility module. These types of devices can be
200handled in one of two ways:</para>
201
202<itemizedlist>
203
204<listitem><para>Adding the module names to
205<filename>/etc/sysconfig/modules</filename></para></listitem>
206<listitem><para>Using an
207<quote>install</quote> line in
208<filename>/etc/modprobe.conf</filename>. This tells the
209<command>modprobe</command> command <quote>when loading this module,
210also load this other module, at the same time.</quote> For example:</para>
211
212<screen><userinput>install snd-pcm modprobe -i snd-pcm ; modprobe \
213 snd-pcm-oss ; true</userinput></screen>
214
215<para>This will cause the system to load both the
216<emphasis>snd-pcm</emphasis> and <emphasis>snd-pcm-oss</emphasis>
217modules when any request is made to load the driver
218<emphasis>snd-pcm</emphasis>.</para></listitem>
219</itemizedlist>
220</sect2>
221
222<sect2>
223<title>Useful Reading</title>
224
225<para>Additional helpful documentation is available at the following
226sites:</para>
227
228<itemizedlist>
229<listitem><para remap="verbatim">A Userspace Implementation of devfs &ndash;
230<ulink url="http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf"><phrase
231condition="pdf">http://www.kroah.com/linux/talks/ols_2003_udev_paper/
232Reprint-Kroah-Hartman-OLS2003.pdf</phrase></ulink></para></listitem>
233
234<listitem><para remap="verbatim">udev FAQ &ndash;
235<ulink url="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ"/></para></listitem>
236
237<listitem><para remap="verbatim">The Linux Kernel Driver Model &ndash;
238<ulink url="http://public.planetmirror.com/pub/lca/2003/proceedings/papers/Patrick_Mochel/Patrick_Mochel.pdf"><phrase
239condition="pdf">http://public.planetmirror.com/pub/lca/2003/proceedings/papers/
240Patrick_Mochel/Patrick_Mochel.pdf</phrase></ulink></para></listitem>
241</itemizedlist>
242</sect2>
243
244</sect1>
245
Note: See TracBrowser for help on using the repository browser.