本文共 5262 字,大约阅读时间需要 17 分钟。
内容:
1. 什么是 udev?
2. 在 Gentoo 使用 udev
3. 已知问题
4. 资源 & 感谢
1. 什么是 udev?
/dev 目录
当 Linux 使用者谈到他们系统上的硬件时,对周围那些认为 Linux 是一种病毒或是一种咖啡的牌子的人,'斜线 dev 斜线 某个东西'的用法他们一定会投给您一个奇怪的眼光。但是对于那些幸运的使用者(包括您),使用 /dev/hda1 就是一种快速的表达方法,而不用说第一个 IDE 插槽上主硬盘的第一个分割区,不是吗?
我们都知道什么是装置文件。一些人更了解为什么我们在 /dev 中输入 ls -l 仔细查看时那些装置文件会有特别的数字。但是我们一直认为 /dev/hda 代表第一个 IDE 插槽上主硬盘是理所当然的。您或许并不知道,但这只是设计上一个瑕疵。
考虑一下可热插拔的装置,例如说 USB,IEEE1394,可抽换的 PCI,...什么是第一个装置?他会维持多久?当第一个装置消失后其它的装置要如何命名?这会不会影响进行中的传输工作?如果说因为您妈妈决定插上激光打印机使它变成第一台打印机,而让您的打印工作从爆新的激光打印机变成快坏的矩阵打印机在打印,这会很有趣吗?
进入 udev。udev 计划的目标有趣而且迫切需要:
在 userspace 中执行
动态建立/移除装置文件
提供固定的名称
提供 user-space API
为了提供这些功能,udev 以三个分割的子计划发展: namedev,libsysfs,还有不用说就是udev。
namedev
Namedev 允许您从 udev 之外自行定义装置的名称。这让您输入多个段落来设定有弹性的命名规则以及方案。这个装置命名子系统提供 udev 可以使用的标准接口。
目前 namedev 只有提供一个命名方案,由 LANANA 提供。目前这被大部分的 Linux 系统使用,因此适合大多数的 Linux 使用者。
Namedev 使用下面五个步骤来决定指定装置的名称。如果债这些步骤的其中一个找到了这个装置的名称,就会使用它。这五个步骤是: are:
标签或序号
总线装置编号
总线拓朴
静态指定名称
核心提供的名称
卷标或序号 这一步检查装置是否有唯一的识别记号。例如说 USB 装置有唯一的 USB 序号。SCSI 有唯一的 UUID。如果 namedev 找到与这种唯一编号相对应的设定档,他将或使用设定档提供的名称。
总线装置编号 这一步会检查总线装置编号,对于不可热抽换的环境,这一步足以辨识装置。例如说 PCI 总线编号在系统的使用期限内很少变更。同样的,如果 namedev 找到相对应的设定档,设定档中的名称就会被使用。
类似的,总线拓朴 相对来说也是够稳定而可以辨识设备,只要使用者不抽换设备。当装置的位置满足使用者提供的设定,就会使用指定的名称。
第四个步骤,静态指定名称,是一个简单的字符串取代。当核心提供的名称(预设名称)符合指定的取代字符串,就会使用取代后的名称。
最后一步(核心提供的名称)一定会找到符合的:由核心提供的预设名称。在大部份的情况下这足以在目前的 Linux 系统中找到对应的名称。
libsysfs
udev 使用虚拟的 sysfs 档案系统和核心沟通。libsysfs 计划提供通用的 API 以一般方式取得 sysfs 提供的信息。这让查询任何硬件时不用先知道他们是哪种硬件。
udev
每当核心注意到硬件结构有更新时,他会呼叫 /sbin/hotplug 这个程序。 Hotplug 会执行连结到 /etc/hotplug.d/default 目录下的程序。在哪里面您也会找到 udev 程序的连结。Hotplug 送出核心提供的信息给 udev 程序,以便执行必要的动作修改 /dev 结构(建立或删除装置文件)。
2. 在 Gentoo 使用 udev
需求
udev 需要与 2.6 核心共同使用(例如 vanilla-sources 或 2005.0 profile 预设的 gentoo-sources)。如果您已经用这类核心,您只要确定您的 sys-apps/baselayout 是最新的。这就是所有您需要的。
原始码 2.1: 安装 udev
# emerge udev
udev 会安装 hotplug-base,因为这是他的相依套件其中之一。如果你想要在装置插入时自动加载模块,你才要安装 hotplug。hotplug 也会处理网络装置自动启动及轫体下载。
原始码 2.2: 自由选择:安装 hotplug
# emerge hotplug
如果你想要在开机完成之前就加载已插入的硬件装置,使用 coldplug 套件。
原始码 2.3: 安装 coldplug 套件
# emerge coldplug
不要忘了把 coldplug 加到开机 runlevel:
原始码 2.4: 把 coldplug 加到开机 runlevel
# rc-update add coldplug boot
核心方面,确定你有选了下列选项:
原始码 2.5: 需要的核心设定
General setup --->
[*] Support for hot-pluggable devices
File systems --->
Pseudo filesystems --->
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
如果你使用 genkernel,不要忘记执行时加上 --udev 参数来启动所有需要的核心选项。genkernel 预设使用的选项就足够了。
如果您想的话,也可以启动 /dev file system support (OBSOLETE)。但是你要确定关闭 "Automatically mount at boot":
原始码 2.6: 不要自动挂载 devfsd
File systems --->
Pseudo Filesystems --->
[*] /dev file system support (OBSOLETE)
[ ] Automatically mount at boot
设定
如果您像要在 Gentoo 使用调整过的 udev 让您的生活更加快乐,那您读到这就可以了。 Gentoo 会使用 udev 但保持静态的 /dev 让你不会遗失任何装置结点。 Gentoo init scripts 不会执行 devfsd 服务,而且当您开机时会关闭 devfs。
但如果您是顽固的家伙,想要执行只使用 udev,未经调整过的系统,就如同 udev 发展过程中所做的事(包括一些困难,像是因为 udev 不支持而遗失的装置),那就读下去吧 :)
我们会停止装置文件节点的储存规则:编辑 /etc/conf.d/rc 中的 RC_DEVICE_TARBALL 变数,把他设成 no: no:
原始码 2.7: /etc/conf.d/rc
RC_DEVICE_TARBALL="no"
如果您的核心包含 devfs 支持,您可以在开机管理员选单设定中停止他:在核心参数中加入 devfs=nodevfs。如果您想要用 devfs 并且停止 udev,在核心参数中加入 gentoo=noudev。
3. 已知问题
开机时遗失装置节点文件
如果您因为一个找不到 /dev/null 的错误而不能开机,或者是遗失 initial console,这是因为您缺少一些需要在 udev 挂载及处理 /dev 之前就要存在的档案。在使用旧的媒体安装的 Gentoo 机器上很常见。
如果您是用 sys-apps/baselayout-1.8.12 或之后的版本,因为开机程序会继续完成开机,所以这讯息不那么严重了。然而,如果想要移除这个恼人的警告讯息,您应该依以下的方法来建立遗失的装置节点。
要查看哪些装置在 /dev 挂载前就存在了,执行底下的指令:
原始码 3.1: 列出开机时存在的装置节点
# mkdir test
# mount --bind / test
# cd test/dev
# ls
要成功开机所需要的装置是 /dev/null 和 /dev/console,如果他们没有在前面的测试中显示,您需要手动建立他们,在 test/dev/ 目录中输入下列指令:
原始码 3.2: 建立必要的装置节点
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
完成后,不要忘了卸载 test/ 目录。
原始码 3.3: 卸载 test/ 目录
# cd ../..
# umount test
# rmdir test
udev 和 nvidia
如果您使用 nVidia 提供的驱动程序,但是 X server 没办法在只使用 udev 的系统启动,确定您有:
nvidia 模块有列在 /etc/modules.autoload.d/kernel-2.6
nvidia-kernel 的版本大于或等于 media-video/nvidia-kernel-1.0.5336-r2
baselayout 的版本大于或等于 sys-apps/baselayout-1.8.12
LVM2 名称消失
当你同时使用 udev 和 LVM2,你可能会发现你建立的容量群组和逻辑分割区消失了。不过呢,他们并没有消失,但是他们不幸的被命名为 /dev/dm-#,# 代表 0,1, ...
要修正他,编辑 /etc/udev/rules.d/50-udev.rules 然后取消这几行的注解:
原始码 3.4: 取消 /etc/udev/rules.d/50-udev.rules 中这几行的注解
KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c"
DevFS 和 udev 之间没有固定的命名
虽然我们想要对这两种动态装置管理解决方案都用相同的命名规则,有时候还是会发生名称不同的情况。
一个回报的冲突是使用 HP Smart Array 5i RAID 控制器(精确的说, cciss 核心模块)。使用 udev 时,装置被命名成 /dev/cciss/cXdYpZ,X,Y 和 Z 是固定的号码。而使用 devfs 时,装置是 /dev/hostX/targetY/partZ 或是 /dev/cciss/cXdY 的符号连结。
如果这样的话,不要忘记正确的更新 /etc/fstab 和开机管理员设定档。
这也发生在 /dev 中通用的符号连结,像是 /dev/mouse, udev 并不会去建立他。记得确认 X 设定档有没有将你的鼠标设定指向实际的装置文件。
其它问题
如果当 /etc/modules.autoload.d/kernel-2.6 里面的模块加载时,装置节点并没有建立,但是当您用 modprobe 手动加载时他又有出现,您应该是是升级到 sys-apps/baselayout-1.8.12 或之后的版本。
framebuffer 装置(/dev/fb/*)的支持包含在核心 2.6.6-rc2 之后的版本。
2.6.4 之前的核心您需要加入 /dev/pts 档案系统的支持。
原始码 3.5: 启动 /dev/pts 档案系统
File systems --->
Pseudo filesystems --->
[*] /dev/pts file system for Unix98 PTYs
4. 资源 & 感谢
在 Linux Symposium (Ottawa, Ontario Canada - 2003) 中由 Greg Kroah-Hartman (IBM Corporation) 发表的 udev 演讲提供了关于 udev 程序完整的了解。
Decibel's UDEV Primer 是一份关于 udev 和 Gentoo 的深度文件。
由 Gentoo 开发员 Daniel Drake 写的 撰写 udev 规则是一个学习如何自订 udev 的杰出文章。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/312079/viewspace-245511/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/312079/viewspace-245511/