source: chapter07/udev.xml@ 50d538e

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

Fixed XML in chapter07/udev.xml

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

  • Property mode set to 100644
File size: 10.3 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 does its
16job, a 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 simply contains a number of
25calls to the 'mknod' 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. As 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 of 2000, a new filesystem called <systemitem
39class="filesystem">devfs</systemitem> was merged into the 2.3.46
40kernel and was made generally 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 that 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 you are to allow device names to be configurable then
50the device naming policy should be up to a system administrator, not
51imposed upon them by any particular developer(s). <systemitem
52class="filesystem">devfs</systemitem> 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, came a new virtual
59filesystem called <systemitem class="filesystem">sysfs</systemitem>.
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</sect2>
67
68<sect2>
69<title>Udev Implementation</title>
70
71<para>The <systemitem class="filesystem">sysfs</systemitem> filesystem
72was mentioned briefly above. One may wonder how <systemitem
73class="filesystem">sysfs</systemitem> knows about the devices present
74on a system, and what device numbers should be used. Drivers that
75have been compiled into the kernel directly register their objects
76with <systemitem class="filesystem">sysfs</systemitem> as they are
77detected by the kernel. For drivers compiled as modules, this will
78happen when the module is loaded. Once the <systemitem
79class="filesystem">sysfs</systemitem> filesystem is mounted (on
80<filename class="directory">/sys</filename>), the data which the
81built-in drivers registered with <systemitem
82class="filesystem">sysfs</systemitem> is available to userspace
83processes and to <command>udev</command> for device node creation.</para>
84
85<para>The <command>S10udev</command> initscript takes care of creating
86these device nodes when Linux is booted. This script starts with
87registering <command>/sbin/udev</command> as a hotplug event handler.
88Hotplug events (discussed below) should not be generated during this
89stage, but <command>udev</command> is registered just in case they do
90occur. The <command>udevstart</command> program then walks through
91the <systemitem class="filesystem">/sys</systemitem> filesystem and
92creates devices under <filename class="directory">/dev</filename> that
93match the descriptions. For example,
94<filename>/sys/class/tty/vcs/dev</filename> contains the string
95<quote>7:0</quote>. <command>udevstart</command> uses this to create
96<filename>/dev/vcs</filename> with major number <emphasis>7</emphasis>
97and minor <emphasis>0</emphasis>. The permissions of each and every
98device that <command>udevstart</command> creates are set using files
99from the <filename
100class="directory">/etc/udev.d/permissions.d/</filename> directory.
101These are numbered in a similar fashion to the LFS bootscripts. If
102<command>udev</command> cannot find a permissions file for the device
103it is creating, it will default permissions to
104<emphasis>600</emphasis> and ownership to
105<emphasis>root:root</emphasis>. The names of the nodes created under
106the <filename class="directory">/dev</filename> directory are
107configured according to the rules specified in the files within the
108<filename class="directory">/etc/udev/rules.d/</filename>
109directory.</para>
110
111<para>Once the above stage is complete, all devices that were already
112present and have compiled-in drivers will be available for use. How
113about those devices that have modular drivers?</para>
114
115<para>We mentioned earlier the concept of a <quote>hotplug event
116handler</quote>. When a new device connection is detected by the
117kernel, the kernel will generate a hotplug event and look at the file
118<filename>/proc/sys/kernel/hotplug</filename> to find out the
119userspace program to handle that device's connection. The
120<command>udev</command> initscript registered <command>udev</command>
121as this handler. When these hotplug events are generated, the kernel
122will tell <command>udev</command> to check the <filename
123class="directory">/sys</filename> filesystem for the information
124pertaining to this new device, and create the <filename
125class="directory">/dev</filename> entry for it.</para>
126
127<para>This brings us to one problem that exists with
128<command>udev</command>, and likewise with <systemitem
129class="filesystem">devfs</systemitem> before it. It is commonly
130referred to as the <quote>chicken and egg</quote> problem. Most Linux
131distrubtions handle loading modules via entries in
132<filename>/etc/modules.conf</filename>. Access to a device node causes
133the appropriate kernel module to load. With <command>udev</command>,
134this method will not work because the device node does not exist until
135the module is loaded. To solve this, the
136<command>S05modules</command> bootscript was added to the
137lfs-bootscripts package along with the
138<filename>/etc/sysconfig/modules</filename> file. By adding module
139names to the <filename>modules</filename> file, these modules will be
140loaded when the computer is starting up. This allows
141<command>udev</command> to detect the devices and create the
142appropriate device nodes.</para>
143
144<para>Note that on slower machines, or for drivers that create a lot
145of device nodes, the process of creating devices may take a few
146seconds to complete. This means that some device nodes may not be
147immediately accessible.</para>
148</sect2>
149
150<sect2>
151<title>Handling hotpluggable/dynamic devices</title>
152
153<para>When you plug in a device, e.g. a USB MP3 player, the kernel
154recognizes that the device is now connected and generates a hotplug
155event. The driver will already have been loaded (either because it was
156compiled into the kernel, or it was loaded via the
157<command>S05modules</command> bootscript) so <command>udev</command>
158will simply be called upon to create the relevant device node
159according to the <systemitem class="filesystem">sysfs</systemitem>
160data available in <filename class="directory">/sys</filename>.</para>
161</sect2>
162
163<sect2>
164<title>Problems with creating devices</title>
165
166<para>There are a few problems when it comes to automatically creating
167devices nodes:</para>
168
169<para>1) A kernel driver may not export its data to sysfs</para>
170
171<para>This is most common with 3rd party drivers from outside the
172kernel tree. These drivers will not end up having their device nodes
173created. You can use the
174<filename>/etc/sysconfig/createfiles</filename> configuration file to
175manually create the devices. Consult the
176<filename>devices.txt</filename> file inside your kernel documentation
177or the documentation for that driver to find the proper major/minor
178numbers.</para>
179
180<para>2) A non-hardware device is required. This is most common with the
181ALSA project's OSS compatibility module. These types of devices can
182be handled in one of two ways:</para>
183
184<itemizedlist>
185
186<listitem><para>Adding the module names to
187<filename>/etc/sysconfig/modules</filename></para></listitem>
188<listitem><para>Use of an
189<quote>install</quote> line in
190<filename>/etc/modprobe.conf</filename>. Basically, this tells the
191modprobe command <quote>when loading this module, also load this other
192module, at the same time.</quote> For example:</para>
193
194<screen><userinput>install snd-pcm modprobe -i snd-pcm ; modprobe snd-pcm-oss ; true</userinput></screen>
195
196<para>This will cause the system to load both the
197<emphasis>snd-pcm</emphasis> and <emphasis>snd-pcm-oss</emphasis>
198modules when any request is made to load the driver
199<emphasis>snd-pcm</emphasis>.</para></listitem>
200</itemizedlist>
201</sect2>
202
203<sect2>
204<title>Useful reading</title>
205
206<para>Some additional documentation that will be useful to
207read:</para>
208
209<itemizedlist>
210<listitem><para>A Userspace Implementation of devfs -- <ulink
211url="http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf"/></para></listitem>
212<listitem><para>udev FAQ -- <ulink
213url="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ"/></para></listitem>
214<listitem><para>The Linux Kernel Driver Model -- <ulink
215url="http://public.planetmirror.com/pub/lca/2003/proceedings/papers/Patrick_Mochel/Patrick_Mochel.pdf"/></para></listitem>
216</itemizedlist>
217</sect2>
218
219</sect1>
220
Note: See TracBrowser for help on using the repository browser.