我如何告诉我的内核不要将外部驱动器放在内部驱动器之前?

我如何告诉我的内核不要将外部驱动器放在内部驱动器之前?

我有一些内部驱动程序,通常采用名称/dev/sda...。/dev/sdc但是,如果我插入外部硬盘并重新启动,则会重新排序,并/dev/sdb由于某种原因占用外部驱动器。

现在,我知道我还可以通过某种方式通过设备的 UUID 来引用设备 - 但这很难记住。我想防止这种重新排序 - 除非我改变我的内部硬件。至少,我想防止外部硬盘插入前四个硬盘。

答案1

默认情况下,在初始化存储控制器驱动程序时,设备/dev/sd*名称按照先到先得的顺序分配。如果您有多个不同的存储控制器,您也许能够操纵它们的加载顺序。

如果这不可能,那么是时候学习编写 udev 规则了。这并不难。

第一次运行udevadm info -q all -a -n /dev/sda。这将列出可用于识别/dev/sdaudev 磁盘的所有属性。该命令将从/dev/sda磁盘设备开始,然后沿着设备树向上移动,每次输出一个属性块。您可以使用第一个块中的属性以及您选择的另一块

第一个块始终是实际的块设备。它往往没有太多有用的属性,但我们可以使用该SUBSYSTEM属性来确保我们的规则只会针对实际的块设备触发。所以我们的 udev 规则的第一个条件是SUBSYSTEM=="block".

对于典型的 SATA 磁盘,第二个块包含sd驱动程序级别的信息。它具有ATTRS{model}和/或ATTRS{wwid},可用于唯一标识该特定磁盘。可能ATTRS{wwid}是一个带有许多空格的长字符串,但它应该包含驱动器的序列号或其他唯一标识符 - 这将是最佳候选。如果序列号周围有空格或其他不重要的字符串,您可以这样匹配:

ATTRS{wwid}=="*<serial number>*"

一旦有足够的条件来唯一标识您的磁盘设备,您就可以决定如何处理它。最好的解决方案可能是SYMLINK+="custom_name"创建一个自动指向实际设备名称的链接,无论这次是什么。

您还可以使用类似NAME="sda"硬编码实际设备名称的方法,但如果这样做,最好为所有当前磁盘创建此类规则,以便尚未具有自定义 udev 规则的磁盘不会获得重叠分配。 (如果您这样做,您还应该更新您的文件/etc/fstab以匹配新名称,并知道如何从外部媒体启动来修复问题,以防您犯错。在这方面,符号链接更安全。)

因此,对于序列号为 S12345 且型号字符串为 的磁盘"HyperDisk ",您可以为其分配一个别名 ,/dev/dsk_sys规则​​如下:(注意:如果udevadm info报告某个属性有尾随空格,则必须包含通配符或将它们包含在规则字符串与列出的完全相同。)

SUBSYSTEM=="block", ATTRS{model}=="HyperDisk   ", ATTRS{wwid}="*S12345*", SYMLINK+="dsk_sys"

将您的自定义规则放入 例如/etc/udev/rules.d/custom.rules,然后重新启动(或者可能运行partprobe /dev/sda),您现在应该有一个/dev/dsk_sys指向该磁盘的符号链接 - 即使命名发生变化,它也会继续指向该磁盘/dev/sd*

相关内容