⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udev.html

📁 Linux From Scratch的中文指导,学习LINUX很有用
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=gb2312" />
    <title>
      7.4.&nbsp;Device and Module Handling on an LFS System
    </title>
    <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css" />
    <meta name="generator" content="DocBook XSL Stylesheets V1.68.1" />
    <link rel="stylesheet" href="../stylesheets/lfs-print.css" type="text/css" media="print" />
  </head>
  <body id="lfs" class="6.1">
    <div class="navheader">
      <div class="headertitles">
        <h4>
          Linux From Scratch - Version 6.1
        </h4>
        <h3>
          Chapter&nbsp;7.&nbsp;配置系统启动脚本(Bootscripts)
        </h3>
      </div>
      <ul class="headerlinks">
        <li class="prev">
          <a accesskey="p" href="usage.html" title="How Do These Bootscripts Work?">后退</a>
          <p>
            How Do These Bootscripts Work?
          </p>
        </li>
        <li class="next">
          <a accesskey="n" href="setclock.html" title="Configuring the setclock Script">前进</a>
          <p>
            Configuring the setclock Script
          </p>
        </li>
        <li class="up">
          <a accesskey="u" href="chapter07.html" title="Chapter&nbsp;7.&nbsp;配置系统启动脚本(Bootscripts)">上一级</a>.
        </li>
        <li class="home">
          <a accesskey="h" href="../index.html" title="Linux From Scratch - Version 6.1">回首页</a>
        </li>
      </ul>
    </div>
    <div class="sect1" lang="zh_cn" xml:lang="zh_cn">
      <div class="titlepage">
        <h1 class="sect1">
          7.4. LFS 系统的设备和模块处理        </h1>
      </div>
      <p>
        在 <a href="../chapter06/chapter06.html">Chapter 6</a>里,我们安装了 Udev 软件包,在开始深入讨论它如何工作之前,我们先简要回顾一下以前处理设备的方法。</p>
      <p>
        传统上一般 Linux 系统使用创建静态设备的方法,因此在
        <tt class="filename">/dev</tt> 目录下创建了大量的设备节点(有时会有数千个节点),而不管对应的硬件设备实际上是否存在。这通常是由 <span><strong class="command">MAKEDEV</strong></span> 脚本完成的,这个脚本包含许多调用 <span><strong class="command">mknod</strong></span>
        程序的命令,为可能存在的每个设备创建相应的主设备号和次设备号。而使用 udev 方式的时候,只有被内核检测到的设备才为其创建设备节点。因为每次系统启动的时候都要重新创建这些设备节点,所以它们被存储在 <tt class="systemitem">tmpfs</tt> (一种完全存在于内存里,不占用任何磁盘空间的文件系统)上,设备节点不需要很多磁盘空间,所占用的内存可以忽略不计。</p>
      <div class="sect2" lang="zh_cn" xml:lang="zh_cn">
        <div class="titlepage">
          <h2 class="sect2">
            7.4.1. 历史          </h2>
        </div>
        <p>
          2000 年 2 月的时候,2.3.46 版本的内核引入了一种称为 <tt class="systemitem">devfs</tt> 的文件系统,在 2.4 系列稳定版本的内核都是可用的。尽管它已经出现在内核源代码中,但这种动态创建设备的方法从未得到核心内核开发者们的全力支持。</p>
        <p><tt class="systemitem">devfs</tt> 存在的主要的问题是它处理设备检测、创建和命名的方式,其中设备节点的命名可能是最严重的问题。一般可接受的方式是,如果设备名是可配置的,那么设备命名策略应该由系统管理员决定,而不是由某些开发者强制规定。 <tt class="systemitem">devfs</tt> 文件系统还存在竞争条件(race conditions)的问题,这是它天生的设计缺陷,不对内核做彻底的修改就无法修正这个问题。因为近来缺乏维护,它已经被标记为 deprecated(反对的)。</p>
        <p>
          随着非稳定的 2.5 内核树的开发,即后来发布的 2.6 系列稳定版本内核,一种称为 <tt class="systemitem">sysfs</tt> 新的虚拟文件系统诞生了。 <tt class="systemitem">sysfs</tt> 的工作是把系统结构视图导出给用户空间的进程。有了这个用户空间可见的表示,出现 <tt class="systemitem">devfs</tt> 的用户空间替代者的可能性大大增加了。</p>
      </div>
      <div class="sect2" lang="zh_cn" xml:lang="zh_cn">
        <div class="titlepage">
          <h2 class="sect2">
            7.4.2. Udev 实现          </h2>
        </div>
        <p>
          上面简单的提到了 <tt class="systemitem">sysfs</tt> 文件系统,您可能想知道 <tt class="systemitem">sysfs</tt>
          是怎么认出系统中存在的设备的,应该使用什么设备号。对于已经编入内核的驱动程序,当被内核检测到的时候,会直接在 <tt class="systemitem">sysfs</tt> 注册其对象;对于编译成模块的驱动程序,当模块载入的时候才会这样做。一旦挂载了 <tt class="systemitem">sysfs</tt>
          文件系统(挂载到 <tt class="filename">/sys</tt>),内建的驱动程序在 <tt class="systemitem">sysfs</tt> 注册的数据就可以被用户空间的进程使用,并提供给
          <span><strong class="command">udev</strong></span> 以创建设备节点。</p>
        <p><span><strong class="command">S10udev</strong></span>
          初始化脚本负责在 Linux 启动的时候创建设备节点,该脚本首先将 <span><strong class="command">/sbin/udevsend</strong></span> 注册为热插拔事件处理程序。热插拔事件(随后将讨论)本不应该在这个阶段发生,注册 <span><strong class="command">udev</strong></span> 只是为了以防万一。然后 <span><strong class="command">udevstart</strong></span>
          遍历 <tt class="systemitem">/sys</tt>
          文件系统,并在 <tt class="filename">/dev</tt>
          目录下创建符合描述的设备。例如:<tt class="filename">/sys/class/tty/vcs/dev</tt> 里包含“7:0”字符串,
          <span><strong class="command">udevstart</strong></span> 根据这个字符串创建主设备号为 7 、次设备号为 0 的
          <tt class="filename">/dev/vcs</tt> 设备。<strong class="command">udevstart</strong> 创建的每个设备的名字和权限由 <tt class="filename">/etc/udev/rules.d/</tt> 目录下的文件指定的规则来设置,这些文件以类似于 LFS 启动脚本的风格编号。如果 <span><strong class="command">udev</strong></span> 找不到所创建设备的权限文件,就将其权限设置为缺省的 600,所有者为
          <span class="emphasis"><em>root:root</em></span>        。</p>
        <p>上面的步骤完成后,那些已存在并已内建驱动的设备就可用了,而以模块驱动的设备呢?</p>
        <p>
          前面我们提到了“热插拔事件处理程序”的概念,当内核检测到一个新设备连接时,内核会产生一个热插拔事件,并在 <tt class="filename">/proc/sys/kernel/hotplug</tt> 文件里查找处理设备连接的用户空间程序。
          <span><strong class="command">udev</strong></span> 初始化脚本将 <span><strong class="command">udevsend</strong></span>
          注册为该处理程序。当产生热插拔事件的时候,内核让 <span><strong class="command">udev</strong></span>
          在 <tt class="filename">/sys</tt> 文件系统里检测与新设备的有关信息,并为新设备在 <tt class="filename">/dev</tt> 里创建项目。</p>
        <p>
          这样带来了 <span><strong class="command">udev</strong></span> 存在的一个问题,之前 <tt class="systemitem">devfs</tt> 也存在同样的问题。这通常是个“先有鸡还是先有蛋”问题。大多数 Linux 发行版通过 <tt class="filename">/etc/modules.conf</tt> 配置文件来处理模块加载,对某个设备节点的访问导致相应的内核模块被加载。对
          <span><strong class="command">udev</strong></span> 这个方法就行不通了,因为在模块加载前,设备节点根本不存在。为了解决这个问题,在 LFS-Bootscripts
          软件包里加入了 <span><strong class="command">S05modules</strong></span> 启动脚本,以及 <tt class="filename">/etc/sysconfig/modules</tt> 文件。通过在 <tt class="filename">modules</tt> 文件里添加模块名,就可以在系统启动的时候加载这些模块,这样
          <span><strong class="command">udev</strong></span> 就可以检测到设备,并创建相应的设备节点了。</p>
        <p>注意,在慢速的机器上,或者对于需要创建大量设备节点的驱动程序,创建设备的过程可能需要好几秒钟,这意味着某些设备节点不能立即访问到。</p>
      </div>
      <div class="sect2" lang="zh_cn" xml:lang="zh_cn">
        <div class="titlepage">
          <h2 class="sect2">
            7.4.3. 处理可热插拔/动态设备</h2>
        </div>
        <p>
          当您插入一个设备,例如一个 USB接口的 MP3 播放器,内核会检测到设备连接,并产生一个热插拔事件,如果驱动程序已经加载(要么是因为驱动已经编入内核,要么是已经通过 <span><strong class="command">S05modules</strong></span>
          启动脚本加载了), <span><strong class="command">udev</strong></span>
          将被调用,根据
          <tt class="filename">/sys</tt> 目录下的 <tt class="systemitem">sysfs</tt> 数据来创建相应的设备节点。如果该设备的驱动是一个未加载的模块,将设备连接到系统上只会让内核的总线驱动产生一个热插拔事件,通知用户空间有新设备连接,但并不加载驱动。事实上,什么都没有做,设备仍然不能使用。</p>
        <p>
          如果刚才插入的设备有一个驱动程序模块但是尚未加载,Hotplug 软件包就有用了,它就会响应上述的内核总线驱动热插拔事件并加载相应的模块,为其创建设备节点,这样设备就可以使用了。</p>
      </div>
      <div class="sect2" lang="zh_cn" xml:lang="zh_cn">
        <div class="titlepage">
          <h2 class="sect2">
            7.4.4. 创建设备的问题</h2>
        </div>
        <p>自动创建设备节点的时候,存在一些已知的问题:</p>
        <p>
          1) 某个内核驱动可能没有将其数据导出到 <tt class="systemitem">sysfs</tt>        </p>
        <p>
          这个问题在内核源代码树之外的第三方驱动程序上尤其常见,结果是这些驱动无法创建其设备节点。用 <tt class="filename">/etc/sysconfig/createfiles</tt> 配置文件手动创建这些设备,参考内核文档里的 <tt class="filename">devices.txt</tt>文件或者该驱动的文档以获得正确的主/次设备号。</p>
        <p>
          2) 需要一个非硬件设备,这个问题通常出现在 ALSA(高级 Linux 声音架构)项目里的 OSS(开放声音系统)兼容模块上,这类设备可以用下面两种方法之一来处理:</p>
        <div class="itemizedlist">
          <ul>
            <li>
              <p>
                将模块名添加到 <tt class="filename">/etc/sysconfig/modules</tt>              </p>
            </li>
            <li>
              <p>
                在 <tt class="filename">/etc/modprobe.conf</tt> 文件里使用“install”命令行,让 <span><strong class="command">modprobe</strong></span> 命令“在加载这个模块的同时加载另一模块”。例如:</p>
              <pre class="userinput"><kbd class="command">install snd-pcm modprobe -i snd-pcm ; modprobe \
    snd-pcm-oss ; true</kbd></pre>
              <p>
                这个命令使系统在收到任何加载 <span class="emphasis"><em>snd-pcm</em></span>  驱动请求的时候,都同时加载 <span class="emphasis"><em>snd-pcm</em></span> 和 <span class="emphasis"><em>snd-pcm-oss</em></span> 模块。</p>
            </li>
          </ul>
        </div>
      </div>
      <div class="sect2" lang="zh_cn" xml:lang="zh_cn">
        <div class="titlepage">
          <h2 class="sect2">
            7.4.5. 有用的读物</h2>
        </div>
        <p>一些有用的补充文档可以在下列网站得到:</p>
        <div class="itemizedlist">
          <ul>
            <li>
              <p><tt class="systemitem">devfs的用户空间实现</tt> <a href="http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf">
                <i>http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf</i></a>              </p>
            </li>
            <li>
              <p>
                udev 常见问题解答 <a href="http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ">
                <i>http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev-FAQ</i></a>              </p>
            </li>
            <li>
              <p>
                Linux 内核驱动模型 <a href="http://public.planetmirror.com/pub/lca/2003/proceedings/papers/Patrick_Mochel/Patrick_Mochel.pdf">
                <i>http://public.planetmirror.com/pub/lca/2003/proceedings/papers/Patrick_Mochel/Patrick_Mochel.pdf</i></a>              </p>
            </li>
          </ul>
        </div>
      </div>
    </div>
    <div class="navfooter">
      <ul>
        <li class="prev">
          <a accesskey="p" href="usage.html" title="How Do These Bootscripts Work?">后退</a>
          <p>
            How Do These Bootscripts Work?
          </p>
        </li>
        <li class="next">
          <a accesskey="n" href="setclock.html" title="Configuring the setclock Script">前进</a>
          <p>
            Configuring the setclock Script
          </p>
        </li>
        <li class="up">
          <a accesskey="u" href="chapter07.html" title="Chapter&nbsp;7.&nbsp;配置系统启动脚本(Bootscripts)">上一级</a>.
        </li>
        <li class="home">
          <a accesskey="h" href="../index.html" title="Linux From Scratch - Version 6.1">回首页</a>.
        </li>
      </ul>
    </div>
  </body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -