我有一些内部驱动程序,通常采用名称/dev/sda
...。/dev/sdc
但是,如果我插入外部硬盘并重新启动,则会重新排序,并/dev/sdb
由于某种原因占用外部驱动器。
现在,我知道我还可以通过某种方式通过设备的 UUID 来引用设备 - 但这很难记住。我想防止这种重新排序 - 除非我改变我的内部硬件。至少,我想防止外部硬盘插入前四个硬盘。
答案1
默认情况下,在初始化存储控制器驱动程序时,设备/dev/sd*
名称按照先到先得的顺序分配。如果您有多个不同的存储控制器,您也许能够操纵它们的加载顺序。
如果这不可能,那么是时候学习编写 udev 规则了。这并不难。
第一次运行udevadm info -q all -a -n /dev/sda
。这将列出可用于识别/dev/sda
udev 磁盘的所有属性。该命令将从/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*
。