Debian 或 Linux 通常如何在 ZFS 上分配诸如 /dev/sdX 之类的设备名称?

jst*_*err 0 debian udev devices disk

我有三个相同的服务器,所有三个相同的布线和正确放置的硬盘。尽管其中一台服务器/dev/sdg /dev/sdh使用了 sata-ssds,而另外两台服务器使用了它们/dev/sda /dev/sdb- 我将 Proxmox 与 ZFS 一起使用。

SATA-SSD 连接到板载(SATA 布线到板),而硬盘通过单电缆 (SAS) 连接到 SAS-HBA。

这些名字是如何分配的?序列号?在这里找不到对我有帮助的有效信息。在 Debian + ZFS 中安装后有没有办法更改设备名称?

tel*_*coM 6

这些/dev/sd*名称只是按检测顺序分配的,如果每次启动时存储驱动程序模块加载顺序不完全相同,或者如果插入或拔出磁盘,则可能会从一次启动到下一次启动。当前的智慧是在您的配置中使用其他东西:

  • 在 中/etc/fstab,您可以使用UUID=orLABEL=语法代替设备名称
  • 如果您使用的是 LVM,它已经包含了一种机制来自动发现物理卷而不考虑设备名称,并使用保证持久的路径来呈现逻辑卷
  • 如果使用软件 RAID,它同样包含一种机制,可以根据磁盘上的实际内容而不是设备名称来查找 RAID 成员
  • 如果使用多路径 SAN LUN,device-mapper-multipath将自动发现各个/dev/sd*路径并构建一个持久设备名称,以使用所有这些路径访问磁盘,通过 WWID、自动生成的持久名称或根据您的偏好自定义名称
  • 根据您要查找的内容,您可能会使用/dev/disk/by-*/目录中的符号链接找到以合适方式命名的磁盘/分区:
    • /dev/disk/by-id/* 按磁盘型号名称和序列号
    • /dev/disk/by-uuid/*通过文件系统 UUID(/etc/fstab对于不涉及的用途,实际上等效于UUID= 语法/etc/fstab
    • /dev/disk/by-label/*按文件系统标签(/etc/fstab对于不涉及的用途,实际上等效于LABEL= 语法/etc/fstab
    • /dev/disk/by-path/* 按硬件设备路径:“总线 X、插槽 Y、功能 Z、控制器插槽 N”(如果您想要基于布线的名称,可能会很有用)
    • 在 GPT 分区的磁盘上,还可以使用/dev/disk/by-partuuid/*/dev/disk/by-partlabel/*

某些发行版(例如,如果我没记错的话,例如 SuSE)也可能具有基于 udev 规则的机制,/dev/sd*当操作系统首次看到它时,该机制会将特定信息与具有特定序列号或其他识别信息的磁盘联系起来。Debian 没有。

启动 Debian 时,当系统仍在 initramfs 上运行时,首先加载根文件系统的磁盘控制器。如果您的系统仅使用一个磁盘控制器(例如台式机上的 AHCI SATA,或机架式服务器上的热插拔感知 SAS 硬件 RAID 控制器),它通常会以某种稳定的顺序(特定于驱动程序)检测连接到它的所有磁盘,例如通过 SATA 连接器编号或热插拔插槽顺序),这就是它的结尾:这样的顺序可能非常稳定。

但是如果你有多个不同的存储控制器,你可能会头疼,因为systemd基于 -based 的启动过程不能保证有任何持久的确定性顺序,这意味着启动过程早期部分的小时间差异可能会改变后面部分的顺序. 并且在启动时,许多事情会并行发生,所以无论如何你都不应该依赖隐式排序。

ZFS FAQ 有很多关于在 Linux 上选择正确类型的设备名称的内容。基本上:

  • 使用/dev/sd*的小型开发/测试设置只
  • 对于小型池(少于大约 10 个磁盘),请使用 /dev/disk/by-id/*
  • 对于较大的池,最佳解决方案是设置一个/etc/zfs/vdev.conf文件以创建仍然反映底层硬件布局的漂亮短名称
  • 大型池的替代解决方案是/dev/disk/by-path/*虽然名称会很长而且很麻烦。

幸运的是,更改现有池的名称并不困难:它基本上只是导出和重新导入池,同时在导入时指定新的名称方案。

例如,如果您的池名为zfspool,则可以导出它,然后使用如下/dev/disk/by-id/*名称重新导入:

# <prepare pool for export, i.e. unmount mount points or stop VMs as necessary>
zpool export zfspool
zpool import -d /dev/disk/by-id zfspool
# <resume using the pool>
Run Code Online (Sandbox Code Playgroud)

(这表明 ZFS 实际上可能具有与 Linux LVM 类似的自动发现系统;只是发现发生在导入池时,而不是在每次启动时。)