如何查明内核或 udev 是否​​创建了设备节点?

如何查明内核或 udev 是否​​创建了设备节点?

有什么办法可以查出谁创建了设备节点吗?如果是的话udev还是内核本身?

就我的具体情况而言,我有两个网络摄像头。为它们创建的节点是 /dev/video0/dev/video1。不幸的是,这不是一个恒定的分配。现在我认为使用时会出现这种情况udev,但是当我创建udev规则时,在我看来,video0节点video1已经在udev能够分配更恒定的节点(如 )之前创建/dev/videoLogitech

我需要一些关于哪个日志文件或哪个命令可以帮助我了解这里发生的情况的建议。

答案1

如果您想检查操作顺序,请使用:

udevadm monitor --property

通过执行此操作,您将获得操作列表。添加相机时,第一个条目可能类似于:

KERNEL[110935.814197] add      /devices/.../video4linux/video1 (video4linux)
ACTION=add
DEVNAME=/dev/video1  <<<<---- devname

作为@goldilocks 指出:

不幸的是,如果您使用 systemd,它的 udev 版本有一个复杂的“持久命名方案”,即硬编码到 udevd 中,所以你是对的,仅仅解析这些rules.d东西可能会留下很多谜团。

同样来自man udevsystemd:

以下键可以获得分配的值:

NAME 用于网络接口的名称。有关设置接口名称的更高级别机制,请参阅 systemd.link(5)。udev 无法更改设备节点的名称,只能创建附加符号链接。


命名和调试

你最好的选择可能是使用类似的东西:

udevadm test $(udevadm info -q path -n video1)

它可以让您对规则进行“测试运行”并报告任何错误。

添加/更改规则后,请记住重新加载:

udevadm control --reload-rules

到那个时刻命名您可能会得到类似的设备:

NAME="smile2thecamera" ignored, kernel device nodes can not be renamed; 
      please fix it in /etc/udev/rules.d/83-webcam.rules:6

您可以使用符号链接(如果足够的话),如下所示:

KERNEL=="video[0-9]", .... SYMLINK+="video-logitech"

测试时应该给你这样的东西:

creating link '/dev/video-logitech' to '/dev/video1'
creating symlink '/dev/video-logitech' to 'video1'

DEVLINKS=.... /dev/video-logitech

相关内容