当我命令 multipath -ll 时,输出显示如下。
ocr3 (149455400000000000000000001000000ca0200000d000000) dm-9 IET,VIRTUAL-DISK
[size=980M][features=0][hwhandler=0]
\_ round-robin 0 [prio=0][active]
\_ 1:0:0:11 sdo 8:224 [active][ready]
\_ round-robin 0 [prio=0][enabled]
\_ 1:0:0:10 sdn 8:208 [active][ready]
但是,同一个 ocr3 的 devnode(如 sdo 和 sdn)在重启后会发生变化。
我认为这是一致性的问题。
为什么 devnode 在重启后会发生变化?
如何使 devnode 在重启后保持不变?
答案1
为了允许热插拔和动态重新配置,您不应假设/dev/sd*
设备节点在从一次启动到下一次启动时会保持不变。
在只有一个 AHCI SATA 控制器的工作站上,顺序通常是静态的,因为它主要由存储控制器驱动程序的加载顺序决定:通常,根磁盘的驱动程序在启动的 initramfs 阶段加载,在之前usb-storage
。AHCI 控制器管理的磁盘的顺序是固定的,因为驱动程序会按端口号顺序探测控制器端口。
但在连接到 SAN 存储的系统上,事情就没那么简单了。可能有多个磁盘控制器(一个用于内部系统磁盘,然后每个 SAN HBA 各一个),在启动时,通常按 PCI 总线顺序探测 HBA,然后按特定于驱动程序的顺序检测每个 HBA 内的 LUN,这可能也取决于 SAN 配置。单个 HBA 内的顺序可能基于 LUN WWID 或某些其他存储配置详细信息。
并且每个 HBA 没有预先分配的/dev/sd*
名称范围:一旦每个 HBA 的 LUN 分配了名称,系统就会继续处理下一个 HBA,而不会在/dev/sd*
名称中留下任何间隙。
一旦/dev/sd*
为磁盘或 LUN 分配了名称,系统运行时就不能自动将其重新分配以指向另一个 LUN,否则文件系统或数据库可能会损坏。系统运行时的此类重新分配必须始终由系统管理员参与。只有在启动时才能自动重新分配。
因此,当 SAN 管理员为您的系统提供新的 LUN 时,其 WWID 肯定应该是唯一的,但 WWID 值可能位于现有 LUN 之前、之后或中间。当热添加时,通往它的每个路径都将获得下一个空闲的设备名称,因此它们将位于所有现有 LUN 之后。仅凭这一点实际上就可以保证下次启动系统时名称/dev/sd*
的顺序会发生变化。/dev/sd*
当然,/dev/sda*
如果您愿意,可以使用 udev 规则将名称固定为特定的 HBA 和 WWID……但这样做需要做很多工作,而收获却很少。/dev/sd*
就内核而言,所有设备的性能都应该完全相同:如果您发现情况并非如此,则表明您发现了一个错误,应该报告它。因此,没有必要的理由来解释它们的顺序。
Linux 内核开发人员在 2.5.* 开发周期中意识到了这一点,因为他们试图消除在线配置方面的任何限制。现在有办法让您的系统配置完全独立于/dev/sd*
名称:
如果使用传统分区,则可以使用
/dev/disk/by-*
设备名称代替/dev/sd*
设备,或者使用UUID=
或LABEL=
语法/etc/fstab
。如果您使用 LVM,它甚至不会永久存储设备名称,而是在它能看到的任何磁盘和分区上查找 LVM 签名,然后从那里动态构建配置。这会在启动时以及每次运行 时自动发生。
vgscan
(是的,有一些安全措施可以防止在使用磁盘时更改 LVM 映射。)friendly_names
如果您使用多路径,它会通过 WWID(如果已禁用)来显示多路径 LUN ,通过/dev/mapper/mpath*
第一次看到每个 WWID 时分配的名称然后持久存储在/etc/multipath/wwids
(或/var/lib/multipath/bindings
在 RHEL/CentOS 6 及更早版本中,如果是单独的文件系统,则结果是一个错误/var
...),或者通过您可以自己通过 WWID 分配的别名。
我曾经管理过一个连接了 SAN 磁盘的旧 RHEL 3 系统。最初它只有一个 HBA;然后添加了另一个 HBA 以实现冗余和 SAN 迁移……但它来自不同的供应商,因此没有供应商特定的多路径解决方案。我不得不使用 的多路径功能(从那时起就被废弃了)mdadm
。它需要跟踪设备名称,就像您想象的那样。两个词:这很糟糕。当该系统最终被废除时,我感到非常高兴。