我们有使用多路径的 Linux 服务器
我认为我们有一些东西是多路径和 mdadm 之间的竞争条件
如果我们在 /dev/mapper/mpathab 等 powerpath 设备上构建 raid .. 重新启动后,raid 要么降级,要么在 /dev/sdX 等设备中构建,因此出于某种原因,它不会保留初始配置。
我们已经安装了 emc powerpath,因为 san 是一个 vnx,并创建了如下的 raid:
mdadm --verbose --create /dev/md0 --level=mirror --raid-devices=2 /dev/emcpowera /dev/emcpowerb
但重新启动后,这是 raid 的状态:
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Mon Jun 11 15:14:47 2018
Raid Level : raid1
Array Size : 419298304 (399.87 GiB 429.36 GB)
Used Dev Size : 419298304 (399.87 GiB 429.36 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Intent Bitmap : Internal
Update Time : Tue Jun 12 15:25:02 2018
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Consistency Policy : unknown
Name : cjlnwp01:0 (local to host cjlnwp01)
UUID : d2779403:bd8d370b:bdea907e:bb0e3c72
Events : 567
Number Major Minor RaidDevice State
0 65 0 0 active sync /dev/sdq
1 8 160 1 active sync /dev/sdk
看起来 mdadm 在重新启动时会占用它找到的第一个设备?
如何确保当设备是多路径的一部分时,它不会显示为单独的 /dev/sdX 设备。
每次安装设备 sdc 到 sdq 不应出现在下面的 lsblk 输出中。
sdc 8:32 0 400G 0 disk
sde 8:64 0 400G 0 disk
sdg 8:96 0 400G 0 disk
sdi 8:128 0 400G 0 disk
sdk 8:160 0 400G 0 disk
sdm 8:192 0 400G 0 disk
sdo 8:224 0 400G 0 disk
sdq 65:0 0 400G 0 disk
emcpowera 120:0 0 400G 0 disk
└─md0 9:0 0 399.9G 0 raid1
emcpowerb 120:16 0 400G 0 disk
└─md0 9:0 0 399.9G 0 raid1
mdadm 和多路径之间是否存在某种竞争条件,可以通过在 systemd 中添加依赖项来安排?
根据记录,HPE Proliant DL380 G9 服务器上的操作系统为 OEL 7.5。
答案1
您可以使用DEVICE
in 中的条目mdadm.conf
使其仅考虑特定设备名称并忽略其他所有内容。默认情况下,mdadm
接受 中列出的所有块设备/proc/partitions
。
DEVICE /dev/emc*
不幸的是,这只能被认为是一个糟糕的解决方法。这仍然是一个巨大的混乱,因为很多情况下可能最终会使用错误的设备。
这也是您在使用循环设备时遇到的问题:
# losetup --find --show /dev/sdi2
/dev/loop4
现在,/dev/loop4
和/dev/sdc3
是相同的,这也意味着它们共享相同的 UUID:
# blkid /dev/sdi2 /dev/loop4
/dev/sdi2: UUID="0a73725c-7e29-4171-be5d-be31d56bf8fe" TYPE="ext2"
/dev/loop4: UUID="0a73725c-7e29-4171-be5d-be31d56bf8fe" TYPE="ext2"
现在,当您应该使用哪种设备mount UUID=0a73725c-7e29-4171-be5d-be31d56bf8fe
?
# mount UUID=0a73725c-7e29-4171-be5d-be31d56bf8fe /mnt/tmp
# df -h /mnt/tmp
Filesystem Size Used Avail Use% Mounted on
/dev/loop4 2.0G 490M 1.4G 26% /mnt/tmp
在这种情况下,它最终选择了循环设备,这可能是也可能不是我的意图。
像这样复制设备是一个大问题,因为突然之间,本应唯一的 UUID 不再是唯一的,因此最终可能会使用错误的设备。
LVM 也遇到了这个问题,这里有详细描述:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/ological_volume_manager_administration/duplicate_pv_multipath
不幸的是,该文档也没有提供适当的解决方案,它只是建议了一种设备过滤器解决方法。
对于正确的解决方案,最好完全避免使用两个不同的块设备来表示相同的数据。通常这涉及将数据放置在偏移处。我不知道多路径默认情况下是否具有偏移功能。
对于分区表、mdadm、LUKS、LVM,您通常可以免费获得偏移量,因为它们在其父设备的开头有一个标头,并且它们提供的子块设备是从该标头偏移的。
因此,在 /dev/sdx 上您只能看到分区表,/dev/sdx1 您只能看到 mdadm 标头,/dev/md1 您只能看到 LUKS 标头,/dev/mapper/cryptomd1 您只能看到 LVM 标头,而 / dev/VG/LV 您只能看到文件系统,因为这些设备中的每一个都与其父数据有偏移。
如果您对多路径设置执行相同的操作,则 mdadm 元数据将仅在 上可见/dev/emcpowera
,但在 上不可见/dev/sdk
,并且后者将无法错误地组装到 RAID 中。