source: chapter07/udev.xml@ 8eeb6bc

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

Updated page breaks

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

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