多路径和 mdadm 隐藏 /dev/sdX 设备。

多路径和 mdadm 隐藏 /dev/sdX 设备。

我们有使用多路径的 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

您可以使用DEVICEin 中的条目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 中。

相关内容