sysfs 和 devtmpfs

Dan*_*iel 4 linux udev devices sysfs

Ulrich Dangel 很好地解释了 devtmpfs 和 udev 之间的区别。

sysfs 呢?

我知道内核使用 sysfs 将设备节点导出到用户空间以供 udev 使用。那么devtmpfs和sysfs是一样的吗?如果是,为什么他们使用不同的名称?如果不是,sysfs 和 devtmpfs 之间的真正区别是什么?

Gil*_*il' 8

内核使用 sysfs 将设备节点导出到用户空间以供 udev 使用

否。Sysfs 不包含设备节点。sysfs 主要包含提供设备信息的文件,以及一些允许进程控制设备运行方式的文件。但是对于大多数设备不能通过 sysfs 提供的来使用。

让我们以硬盘为例。在 下某处有一个目录,其/sys/devices路径取决于它如何连接到计算机(例如,/sys/devices/pci0000:00/…对于连接到连接到计算机主 PCI 总线的控制器的磁盘)。在该目录中,您可以找到各种信息,例如其大小、是否可移动、其电源状态等。还有用于分区的子目录。但是那里没有任何东西可以提供对磁盘内容的访问。在 in 的其他地方/sys,有指向与该磁盘对应的目录的符号链接: in /sys/block、 in/sys/class/block等。但仍然没有访问磁盘内容的内容。

在 中/dev,磁盘条目是一个特殊文件——块设备。该文件允许进程读取和写入磁盘的内容。(虽然对于通常不会发生的磁盘;相反,磁盘的内容 - 或分区的内容 - 已挂载,因此内核正在访问设备,而进程则不会。)

设备文件允许通过ioctl进行除读取和写入内容之外的一些操作。可以通过设备文件上的 ioctl 提供 sysfs 提供的所有信息和控制接口。但是,由于以下几个原因,这会不太方便:

  • 使用 中的单独文件/sys,可以在细粒度的基础上设置权限。中的每个设备只有一个文件/dev,要么全有,要么全无。
  • 应用程序可以轻松读取和写入单独的文件。您可以只使用cat或echo。使用 ioctl,要困难得多:没有 shell 接口,通常没有其他高级语言的接口。
  • 使用 ioctl,命令必须以数字而不是名称编码,并且参数的格式必须在二进制级别定义。使用名称和简单的文本格式可以更容易地编写软件。

另一方面,可以通过 sysfs 中的文件提供对设备内容的访问。但这需要内核中的额外工作:sysfs 主要设计用于提供小文件和符号链接,并且没有ioctl现有应用程序所期望的支持。我认为扩展 sysfs 以支持现有设备类型不会有显着的好处,因此设备文件的继续存在。

Sysfs 由内核自动填充,实时反映实际可用的设备。sysfs 中文件的含义来自其路径,由提供该文件的驱动程序选择。/dev工作方式不同:文件的含义来自设备文件的类型(块或字符)及其主要和次要编号(这是ls -l列表而不是设备的文件大小)。传统上,/dev是静态的,在系统安装期间创建设备文件;但是当设备可以热插拔时,这种方法就不太适用了,因此希望能够/dev实时反映连接的设备的动态。

Linux 经历了多次迭代的动态/dev. Linux 2.4 有devfs,内核自动创建条目以反映连接的设备。但这并不是那么好,因为它将设备命名和权限策略硬编码到内核中,所以它被用户空间程序udev替换来管理策略,并/dev在一个简单的 tmpfs 文件系统(一个没有特殊意义的内存文件系统)上到内核​​)。然后 devfs 部分卷土重来,devtmpfs是 tmpfs 的一个实例,其中可用设备的条目由内核自动创建,但 udev 在此之上完成它想要的所有管理。