/dev 和 /sys/class 之间的区别?

The*_*eer 39 linux udev devices sysfs

设备表示 in/dev和 one in 有/sys/class什么区别?

一个比另一个更受欢迎吗?是否有一个提供而另一个不提供的东西?

slm*_*slm 35

中的文件/dev是 UDEV 在运行时创建的实际设备文件。该目录/sys/class在运行时由内核导出,通过sysfs.

来自libudev 和 Sysfs 教程

摘抄

在 Unix 和类 Unix 系统上,硬件设备是通过位于 /dev 目录中的特殊文件(也称为设备文件或节点)访问的。这些文件的读取和写入就像普通文件一样,但不是在磁盘上写入和读取数据,而是直接与内核驱动程序通信,然后内核驱动程序与硬件进行通信。有许多在线资源更详细地描述了 /dev 文件。传统上,这些特殊文件是在安装时由发行版使用 mknod 命令创建的。近年来,Linux 系统开始使用 udev 在运行时管理这些 /dev 文件。例如,udev 会在检测到设备时创建节点,并在移除设备(包括运行时的热插拔设备)时删除它们。这边走,

另一个摘录

Sysfs 中的目录包含设备的层次结构,因为它们连接到计算机。例如,在我的电脑上,hidraw0 设备位于:

/sys/devices/pci0000:00/0000:00:12.2/usb1/1-5/1-5.4/1-5.4:1.0/0003:04D8:003F.0001/hidraw/hidraw0
Run Code Online (Sandbox Code Playgroud)

根据路径,设备连接到(大致,从末尾开始)设备的配置 1 (:1.0) 连接到设备 1-5 的端口号 4,连接到 USB 控制器 1 (usb1),连接到PCI总线。虽然有趣,但这个目录路径对我们没有多大好处,因为它取决于硬件与计算机的物理连接方式。

幸运的是,Sysfs 还提供了大量符号链接,可以轻松访问设备,而无需知道它们连接到哪些 PCI 和 USB 端口。在 /sys/class 中,每个不同类别的设备都有一个目录。

用法?

通常,您可以使用规则/etc/udev/rules.d来扩充您的系统。当存在各种硬件时,可以构建规则来运行脚本。

系统启动后,您可以编写脚本来针对/dev或工作/sys,这实际上归结为个人偏好,但我通常会尝试针对/sys并使用工具,例如udevadm查询 UDEV 以获取各种系统资源的位置。

$ udevadm info -a -p  $(udevadm info -q path -n /dev/sda) | head -15

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="976773168"
    ATTR{stat}==" 6951659  2950164 183733008 41904530 16928577 18806302 597365181 580435555        0 138442293 622621324"
    ATTR{range}=="16"
...
Run Code Online (Sandbox Code Playgroud)

  • 不确定我是否正确理解了你的意思。所以要求一些澄清以确定。您是否决定通过在 /dev 或 /sys 中创建条目来与外部设备连接(例如通过 i2c 或 mipi)纯粹是基于个人喜好?如果不是,在什么情况/为什么人们宁愿选择前者而不是后者(反之亦然)? (2认同)