设备文件系统教程
原文更新:2003年9月11日内容简介:在本文档中,你将能了解到 devfs 的性质以及它的工作原理。
1. 什么是 devfs?
在过去。。。。。。
在过去的 Linux 系统中提供了一个抽象化的设备目录,叫做 /dev。在该目录中用户可以找到设备节点,这些特殊的文件直接指向了系统中的硬件设备。例如,/dev/hda 指向了系统中的第一个 IDE 设备。利用这些提供给用户的设备文件,他们可以编写应用程序像访问普通文件一样来访问硬件,而不需要通过特殊的 API。
设备文件分为两类,称作字符设备与块设备,第一类包含了那些进行读写操作时不需要通过缓冲区的设备。第二组自然包含了那些做读写操作时需要缓冲区的设备。两种设备都可以在同一时间内读取一个字符,或者一个块。因此这意味着声音的冲突是不可避免的。
如果你查看一个设备文件,你将会看到类似下面的内容:
代码 1.1: 查看设备文件信息# ls -l /dev/hdabrw-rw----
1 root
disk
3,
0 Jul
5
2000 /dev/hda
在上一个范例中我们看到 /dev/hda 是一个块设备。但是,更重要的是,它链接了两个特殊的号码 3,0。这对号码称为主-次对。它用于核心将该设备文件映射到真实设备上。主编号指向了该设备,而次编号指向了子设备,这看起来冲突吗?不会的。
这里有两个范例为 /dev/hda4 和 /dev/tty5。第一个设备文件指向了第一个 IDE 设备的第四个分区。它的主次对为3,4,在这里,次编号指向了分区而主编号指向了设备。第二个范例中,主次对为 3,4,在这里,主编号指向到终端设备,次编号指向终端编号(在这里时第五个终端)。
相关问题
如果你快速扫描一次 /dev 中的文件,你将会发现其中不光不仅仅有你机器上的所有设备,或者说在你机器上所有你可以看到的设备,换句话说,你还有许多你并没有指向该设备的设备文件。至于如何管理这大量的设备组将会在后面提到。你可以先想像一下改变你机器上所有设备所对应的设备文件的权限,然后将它们恢复过来。
当你添加一个新设备到你的系统中时,但是这个设备之前并没有对应的设备文件, 你应该自己创建一个,高级用户可以很熟练地通过 /dev 中的 ./MAKEDEV 来做这件事情,但是你知道哪种设备文件需要你创建吗?
当你有了一个通过设备文件来访问硬件的程序时,你不能将根目录以只读属性加载,没有其它办法必须以可读写模式加载。并且你不能将 /dev 加载于任何一个单独的分区上,因为 mount 命令需要 /dev 来加载分区。
实际问题
你可以想像,内核开发者们当然找到了前面所提到的种种问题。不管怎样,其中大多数问题能在这里得到更详细的描述 http://www.atnf.csiro.au/people/rgooch/linux/docs/devfs.html#faq-why。 我们现在并没有在讨论这些,但是请注意这些问题将直接关系到稳定版内核:devfs。
devfs 就是解决方案
devfs 处理了所有的问题。它只是提供给用户管理这些已有设备的功能,当新硬件添加时的自动添加新的节点,使将根目录以只读属性加载成为可能。以及解决了其它我们之前还没有发现的问题。
举个例子,通过 devfs,你将可以逃离主次对管理的痛苦。它始终支持着(为了向后兼容),但是不必要。它使 Linux 自动支持更多的设备成为可能,知道没有任何资源可以分配(数字总是有限的 :-))
2. 设备树浏览
目录
首先你要注意的事情是 devs 通过设备组目录树来组织设备文件。这种方式提高了可读性,同事所有相关设备都将放在其标准的目录里。
举个例子,所有的 IDE 相关设备都在 /dev/ide/ 设备目录里,而 SCSI 相关设备在 /dev/scsi/。SCSI 和 IDE 磁盘在某种程度上有些相同点,这意味着他们可能在同一个子目录结构里。
IDE 和 SCSI 磁盘通过其控制卡进行控制(可以是内置与主板上的,也可以是单独的控制卡),叫做控制器,每个控制卡可以有很多通道。一个通道总线。在每一个总线里,还能有许多编号。假设某个编号控制着一个磁盘,该编号成为目标。许多 SCSI 设备还可以有多个逻辑单元号(Logical Unit Numbers), 举个例子某个设备链接到多个媒体(如高端的磁带设备)。你通常只有一个逻辑单元号, lun0/。
所以,当 /dev/hda4 如果已经被使用过了,我们会拥有一个 /dev/ide/host0/bus0/target0/lun0/part4。这将使管理容易很多。:)
注释: 你同样能使用类似 Unix 的磁盘命名方式来管理磁盘,如c0b0t0u0p2。他们能在/dev/ide/hd或者/dev/scsi/hd类似的路径中找到。
这里是一个目录范例,这是我的笔记本的目录列表:
代码 2.1: /dev 目录列表cdroms/
cpu/
discs/
floppy/ide/
input/
loop/
misc/netlink/
printers/
pts/
pty/scsi/
sg/
shm/
sound/sr/
usb/
vc/
vcc/
通过 devfsd 实现向后兼容
使用新的声音主题自然能够增加情趣,但是许多工具和程序使用的是旧的主题。请确认你的系统运行正常,devfsd 正常运行。并且该守护进程创建了旧方式的名称来指向设备文件。
代码 2.2: 创建链接$ ls -l /dev/hda4lr-xr-xr-x
1 root
root
33 Aug 25 12:08 /dev/hda4 -> ide/host0/bus0/target0/lun0/part4
通过devfsd,你可以设置权限,创建新的设备文件,定义行为动作(Actions)等。相关内容将在下一节中介绍
3. 管理设备树
重启 devfsd
当你修改 /dev/devfsd.conf 配置文件后,而你就想使修改在当前系统中生效,你不需要重新启动。关于你的想法,你可以通过两种“信号”(Signal)中的任意一种来实现它。
SIGHUP 将能够使 devfsd 重新读取配置文件,重新读取共享目标并为设备树中的子节点重新生成注册信息。
SIGUSR1 也可以实现此目的,但不生成注册信息。
要发送信号,可以简单地通过 kill 或者 killall命令:
代码 3.1: 发送 SIGHUP 信号给devfsd# kill -s SIGHUP `pidof devfsd`或者# killall -s SIGHUP devfsd
删除兼容链接
警告: 目前,Gentoo 还无法脱离兼容链接而正常运行。
如果你想将 /dev 中凌乱的兼容链接从你的 Gentoo 系统中删除(Gentoo 是默认启用它的),编辑你的 /etc/devfsd.conf 并删除下面两行:
代码 3.2: 通过 /etc/devfsd.conf 实现向后兼容# 注释下面两行以删除符号链接REGISTER
。*
MKOLDCOMPATUNREGISTER
。*
RMOLDCOMPAT
你需要重新启动以便使修改生效。
删除自动加载函数
当你加载一个内核模块时,devfs 将为它自动创建一个设备文件。如果你喜欢这样,可以删除 /etc/devfsd.conf 中的下列内容:
代码 3.3: /etc/devfsd.conf,自动加载函数LOOKUP
。*
MODLOAD
4. 关于权限
通过 PAM 设置、修改权限
虽然你可以在 /etc/devfsd.conf 设置权限,但依然建议你通过可插拔验证模块(Pluggable Authentication Module,PAM)来实现这一点。这是因为 PAM 才是最终的身份验证方式,它可以使你在不改动 /etc/devfsd.conf 来改变设备文件权限。
PAM 使用 /etc/security/console.perms 文件来配置权限。该文件包含两部分:第一部分是组的详细信息,第二部分是权限设置。
让我们首先来看一下组的设置。我们以声音组来作为范例:
代码 4.1: /etc/security/console.perms 的声音组权限设置<sound>=/dev/dsp* /dev/audio* /dev/midi*
/dev/mixer* /dev/sequencer*
/dev/sound/* /dev/snd/* /dev/beep
/dev/admm*
/dev/adsp* /dev/aload* /dev/amidi* /dev/dmfm*
/dev/dmmidi* /dev/sndstat
这里的语法非常简单:以一个组名开始,以该组中包含的设备文件结束。
目前,组部分并不是非常通用在你还对其无法进行修改之前。所以在下一章中将介绍如何设置权限。
代码 4.2: /etc/security/console.perms 里声音组的权限配置<console>
0600 <sound>
0600 root.audio
第一部分是终端类型的检查。在大多数系统中,这里称为“控制台组”(console-group)。 PAM 将在每次启动时检查这一段。如果你在控制台组设备中登陆,PAM 将检查并修改其中一些设备文件的权限。
第二部分包含了可登陆设备文件的权限配置。当某人登陆进系统中时,该设备文件原默认的所有者/所有组,将会被 PAM 改为登陆用户的用户名和组。同时,权限也在第二部分设置,在这里,0600 将会被使用(所