/dev 内的设备 - 它们的命名默认是持久的吗?

/dev 内的设备 - 它们的命名默认是持久的吗?

我可以检查 /dev/ 中 sda、sdb 等设备的命名是否默认是持久的吗

或者

是否存在一些 udev 规则来为它们创建持久命名?

udev 本身是否在 /dev 中动态创建设备命名,但使用规则来确保持久命名?

答案1

设备命名是在内核初始化设备时执行的 - 因此命名不是持久的。通常使用 UUID 来识别磁盘,因为 /dev/sdX 可能会发生变化。可以使用 udev 通过序列号(或其他属性)识别磁盘并在 /dev 中创建符号链接,例如 /dev/mydisk1。

有多种方式可以填充 /dev;最常见的(现在)是内核使用 devtmpfs 在启动时动态填充 /dev。然后由 Udev 接管并处理设备添加、删除、脚本编写等。

来自Gentoo Wiki 上的 uDev 页面

内核异步检测设备,udev 镜像内核的 sysfs 文件系统,因此设备按检测顺序命名和编号。因此默认情况下,udev 不提供持久的设备名称。但是,有些设备类有机制可以提供这些

这是最近的回复针对类似的问题,描述了设置永久名称的过程,并提供了进一步相关答案的链接......

编辑:对于 fstab,建议使用 UUID 设置设备,而不是设置 udev 符号链接;运行以下命令

blkid /dev/sda1 -s UUID -o value

输出将是分区的 UUID,您可以在 fstab 中使用它。不要使用 /dev/sda1,而要使用 UUID=thelonguuidabove123456

编辑2:启动期间事件的顺序将是这样的,取决于你的内核/用户空间的设置方式:

  1. 内核初始化一个包含空 /dev 文件夹的裸根文件系统。内核使用 devtmpfs(包含每个硬件设备条目的动态伪文件系统)填充此文件夹。这是一个动态过程,设备可能会发生变化。此时我们处于 ramdisk 和内核空间中,没有 udev / 根文件系统
  2. 在此之上安装了 initrd / initramfs 文件系统,它提供了更多的“东西”来启动和运行“其他东西” - 例如,它可能包含 fsck 工具、内核模块等东西。/dev 仍然由 devtmpfs 管理。
  3. 在此之上,然后正确安装根文件系统,init 已经运行,现在正在用户空间中启动服务,其中之一是 udev。然后 udev 接管 /dev 目录并将 devtmpfs 重新安装到其中,从此 udev 管理 /dev 的内容,使用来自内核的事件来“了解”何时添加或删除设备并根据需要运行脚本。

这里的要点是 /dev 将继承内核最初给出的任何名称,然后管理添加/删除。如果没有硬件更改,/dev 中的设备描述符可能不会改变。然而,在很多情况下它们可能会改变 - 重点是,/dev 中的名称不能完全依赖。

相关内容