我可以检查 /dev/ 中 sda、sdb 等设备的命名是否默认是持久的吗
或者
是否存在一些 udev 规则来为它们创建持久命名?
udev 本身是否在 /dev 中动态创建设备命名,但使用规则来确保持久命名?
答案1
设备命名是在内核初始化设备时执行的 - 因此命名不是持久的。通常使用 UUID 来识别磁盘,因为 /dev/sdX 可能会发生变化。可以使用 udev 通过序列号(或其他属性)识别磁盘并在 /dev 中创建符号链接,例如 /dev/mydisk1。
有多种方式可以填充 /dev;最常见的(现在)是内核使用 devtmpfs 在启动时动态填充 /dev。然后由 Udev 接管并处理设备添加、删除、脚本编写等。
内核异步检测设备,udev 镜像内核的 sysfs 文件系统,因此设备按检测顺序命名和编号。因此默认情况下,udev 不提供持久的设备名称。但是,有些设备类有机制可以提供这些
这是最近的回复针对类似的问题,描述了设置永久名称的过程,并提供了进一步相关答案的链接......
编辑:对于 fstab,建议使用 UUID 设置设备,而不是设置 udev 符号链接;运行以下命令
blkid /dev/sda1 -s UUID -o value
输出将是分区的 UUID,您可以在 fstab 中使用它。不要使用 /dev/sda1,而要使用 UUID=thelonguuidabove123456
编辑2:启动期间事件的顺序将是这样的,取决于你的内核/用户空间的设置方式:
- 内核初始化一个包含空 /dev 文件夹的裸根文件系统。内核使用 devtmpfs(包含每个硬件设备条目的动态伪文件系统)填充此文件夹。这是一个动态过程,设备可能会发生变化。此时我们处于 ramdisk 和内核空间中,没有 udev / 根文件系统
- 在此之上安装了 initrd / initramfs 文件系统,它提供了更多的“东西”来启动和运行“其他东西” - 例如,它可能包含 fsck 工具、内核模块等东西。/dev 仍然由 devtmpfs 管理。
- 在此之上,然后正确安装根文件系统,init 已经运行,现在正在用户空间中启动服务,其中之一是 udev。然后 udev 接管 /dev 目录并将 devtmpfs 重新安装到其中,从此 udev 管理 /dev 的内容,使用来自内核的事件来“了解”何时添加或删除设备并根据需要运行脚本。
这里的要点是 /dev 将继承内核最初给出的任何名称,然后管理添加/删除。如果没有硬件更改,/dev 中的设备描述符可能不会改变。然而,在很多情况下它们可能会改变 - 重点是,/dev 中的名称不能完全依赖。