source: chapter07/udev.xml@ ffd471a

10.0 10.0-rc1 10.1 10.1-rc1 11.0 11.0-rc1 11.0-rc2 11.0-rc3 11.1 11.1-rc1 11.2 11.2-rc1 11.3 11.3-rc1 12.0 12.0-rc1 12.1 12.1-rc1 6.3 6.4 6.5 6.6 6.7 6.8 7.0 7.1 7.2 7.3 7.4 7.5 7.5-systemd 7.6 7.6-systemd 7.7 7.7-systemd 7.8 7.8-systemd 7.9 7.9-systemd 8.0 8.1 8.2 8.3 8.4 9.0 9.1 arm bdubbs/gcc13 ml-11.0 multilib renodr/libudev-from-systemd s6-init trunk xry111/arm64 xry111/arm64-12.0 xry111/clfs-ng xry111/lfs-next xry111/loongarch xry111/loongarch-12.0 xry111/loongarch-12.1 xry111/mips64el xry111/pip3 xry111/rust-wip-20221008 xry111/update-glibc
Last change on this file since ffd471a was ffd471a, checked in by Archaic <archaic@…>, 19 years ago

Reprise of r6318.

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

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