source: chapter07/udev.xml@ e869351b

Last change on this file since e869351b was 46a2e9c, checked in by Jeremy Huntwork <jhuntwork@…>, 19 years ago

Merged recent changes from trunk to lfs-alpha. Fixed typo.

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

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