当前位置:操作系统 > Unix/Linux >>

设备文件系统教程

原文更新: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 将会被使用(所
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,