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

hum*_*ace 7 udev

有没有办法找出谁创建了设备节点?如果已经udev或内核本身?

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

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

Run*_*ium 6

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

udevadm monitor --property
Run Code Online (Sandbox Code Playgroud)

通过这样做,您将获得操作列表。当你添加你的相机时,第一个条目可能是这样的:

KERNEL[110935.814197] add      /devices/.../video4linux/video1 (video4linux)
ACTION=add
DEVNAME=/dev/video1  <<<<---- devname
Run Code Online (Sandbox Code Playgroud)

正如@goldilocks指出的

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

也来自man udev于 systemd:

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

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


命名和调试

您最好的选择可能是使用以下内容:

udevadm test $(udevadm info -q path -n video1)
Run Code Online (Sandbox Code Playgroud)

它为您提供规则的“测试运行”并报告任何错误。

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

udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)

命名设备时,您可能会得到如下信息:

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

您可以改为使用 SYMLINK(如果足够),如下所示:

KERNEL=="video[0-9]", .... SYMLINK+="video-logitech"
Run Code Online (Sandbox Code Playgroud)

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

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

DEVLINKS=.... /dev/video-logitech
Run Code Online (Sandbox Code Playgroud)