我有一台运行 Proxmox VE 8.2(基于 Debian 12)的服务器,已完全更新,使用多路径 SAN。我们在那里分配了一个空间,十个设备,每个设备 2T,每个设备被看到 16 次(路径数),并映射到 10 个多路径虚拟设备并收集到一个 LVM 组中,其中雕刻了一个逻辑卷。这部分没有问题。
它被“即时”初始化并正常运行,直到主机重新启动。之后我注意到,每当lvs
在系统 shell 中运行任何与 LVM 相关的命令( 等)时,它都会发出以下形式的警告:
WARNING: Device mismatch detected for <LV> which is accessing <list of devices like
/dev/sdak, /dev/sdaz, /dev/sdbn, ...> instead of <list of the devices
like /dev/mapper/oamdwhdg-01, /dev/mapper/oamdwhdg-02, ...>
这些/dev/mapper/oamdwhdg-XX
实际上是多路径设备,它们之所以这样命名是出于以下操作原因/etc/multipath.conf
:
multipaths {
...
multipath {
wwid 36...
alias oamdwhdg-04
}
...
}
即无论出于何种原因,LV 都是使用后端设备映射的,而不是使用多路径虚拟设备。
因此我更新了过滤器/etc/lvm/lvm.conf
,现在如下所示:
global_filter=[ "a|/dev/sda3|", "a|/dev/mapper/oamdwhdg|", "r|.*|" ]
(我更新了它,而不是添加的,它global_filter=["r|/dev/zd.*|","r|/dev/rbd.*|"]
之前是有评论的added by pve-manager to avoid scanning ZFS zvols and Ceph rbds
。我相信我的过滤器比这个严格得多。)
/dev/sda3
是安装 PVE 的本地磁盘,它包含pve
不依赖于 SAN 的 VG,因此它是唯一/dev/sd...
不使用多路径且被列入白名单的磁盘。
我使用这个过滤器测试了它vgscan
,它显示可以找到两个组。
然后我执行update-initramfs
并重新启动。在启动过程中,服务器无法进入紧急 shell。但是,当我到达Ctrl+D
那里时,它几乎正常启动:可以看到多路径 VG,但未激活(好像vgchange -an oamdwhdg
尚未运行)。但是,我使用上述命令手动完全正常地激活了它,并且它运行正常。
我怀疑这是因为 initramfs 中多路径在 LVM 之前未正确初始化,因此它尝试使用 /dev/sdXX 设备设置映射。但我不明白为什么添加过滤器后它无法进入紧急 shell。
这里有两个(非常相关的)问题:为什么要使用紧急 shell,也就是出了什么问题以及如何使其按预期工作?
事实证明这是一个非常愚蠢的问题。我不需要自定义过滤器。我需要将正确的多路径纳入 initramfs,但
multipath-tools
仅凭这一点是不够的。为此,
multipath-tools-boot
基于 Debian 的系统有一个单独的软件包。它使 /etc 中的 dm-multipath 模块和配置出现在 initramfs 中。我删除了所有自定义更改
lvm.conf
并运行:重新启动,瞧,一切都恢复到正确状态。
/etc/multipath/wwids
重要提示:在对多路径配置进行任何更改或添加设备或进行任何更改后/etc/multipath.conf
,需要重建 initramfs 以包含更新的版本: