首次重新启动后,MD 设备名称更改为包含“HOSTNAME:”。如何获得一致的名称?

首次重新启动后,MD 设备名称更改为包含“HOSTNAME:”。如何获得一致的名称?

在 Ubuntu 18.04 上,我创建了一个 RAID 1 阵列,如下所示:

mdadm --create /dev/md/myarray --level=1 --run --raid-devices=2 /dev/sdc /dev/sdd

然后,我将输出添加mdadm --detail --scan /dev/md/myarray到 /etc/mdadm/mdadm.conf。它看起来像这样:

ARRAY /dev/md/myarray metadata=1.2 name=MYHOSTNAME:myarray UUID=...

设备名称已添加前缀“MYHOSTNAME:”。此时符号链接/dev/md/myarray仍然存在,但在我第一次重新启动后它变成了/dev/md/MYHOSTNAME:myarray,破坏了东西。更糟糕的是,这种情况只发生在一些机器 - 在其他机器上符号链接仍然存在/dev/md/myarray。全部都运行 Ubuntu 18.04,所以我不知道为什么。

如何为我的 MD 设备获取一致的设备路径,最好是我指定的路径(“/dev/md/myarray”)?我尝试编辑 mdadm.conf 以删除主机名,但即使该行显示

ARRAY /dev/md/myarray metadata=1.2 name=myarray UUID=...

在“需要”主机名的计算机上,符号链接在重新启动时仍然会发生变化。我还尝试采用另一种方式并在两个位置添加主机名:

ARRAY /dev/md/HOSTNAME:myarray metadata=1.2 name=HOSTNAME:myarray UUID=...

但在“不想要”主机名的机器上,符号链接在重新启动后变为 /dev/md/myarray !

我也无法使用数字设备(/dev/md127),因为当像这样创建多个 MD 设备时,它们也往往会在 md126 和 md127 之间交替!这太疯狂了!

答案1

如何为我的 MD 设备获取一致的设备路径,最好是我指定的路径(“/dev/md/myarray”)?

之后mdadm --create /dev/md/foobar ...hostname和都name存储在 mdadm 元数据中,您应该使用mdadm --examine或进行验证mdadm --detail

# mdadm --detail /dev/md/foobar
           Name : ALU:foobar  (local to host ALU)

ALU恰好是我的 ArchLinux 机器的主机名:

# hostname
ALU

您可以指定在创建时应存储的主机:

# mdadm --create /dev/md/foobar --homehost=barfoo
# mdadm --detail /dev/md/foobar
               Name : barfoo:foobar

...但通常没有人记得这样做。


这已经是问题开始的地方...您可能已经从某些 LiveCD 或其他光盘创建了 RAID 阵列,并且该环境中的主机名与您的主安装根本不匹配。然后元数据存储一些完全不相关的主机名。

同样,如果您正确设置了所有内容,但随后遇到 RAID 问题并启动救援系统进行检查,仍然会出现主机名不匹配的情况。

或者相反,即使是错误的机器,主机名也可能匹配 - 如果您对两个独立系统使用相同的主机名,然后迁移驱动器。然后外星阵列取代了原来的名字......


现在,元数据也可以稍后使用mdadm --assemble --update=homehost或进行更改--update=name,这是处理问题的一种方法。它应该正确设置,但很难更改,因为(由于某种原因)缺乏直接十六进制编辑元数据,它只能在汇编时完成。

另一种方法是忽略系统hostname,而是--homehost在程序集上指定或HOMEHOST在 中设置mdadm.conf。 mdadm.conf 联机帮助页对此进行了详细描述。

家庭主机
homehost 行为 mdadm 提供 --homehost= 选项的默认值。一行中通常应该只有一个其他单词。它应该是主机名,或者特殊单词<system>,<none>和之一<ignore>。如果<system>给出,则使用 gethostname(2) 系统调用来获取主机名。这是默认设置。
[...]
创建数组时,该主机名将存储在元数据中。当使用自动组装来组装数组时,未在其元数据中记录正确的宿主主机名称的数组将使用“外来”名称进行组装。 “外国”名称始终以数字字符串结尾,前面带有下划线,以将其与任何可能的本地名称区分开来。例如/dev/md/1_1 或/dev/md/home_0。

因此,您可以尝试设置HOMEHOST ALU(在我的例子中),或更通用的HOMEHOST <ignore>(或HOMEHOST <none>mdadm.conf。但只有当它mdadm.conf存在时它才会起作用。同样,如果您设置忽略,然后从另一台计算机连接数组,则可能会遇到名称冲突。

因此,最好在元数据和 mdadm.conf 中正确设置主机名,并且不要忽略它,最好在组装之前在 initramfs 中设置实际主机名,但这可能很难付诸实践。

我个人的偏好是坚持经典的数字风格。仅通过 UUID 进行识别:

ARRAY /dev/md1 UUID=8fe790ca:f3fa3388:4ae125b6:2c3a5d44
ARRAY /dev/md2 UUID=f14bef5b:a5356e51:25fde128:09983091
ARRAY /dev/md3 UUID=0639c68d:4c844bb1:5c02b33e:00ab4a93

这也是一致的(但也取决于它是否以这种方式创建和/或在元数据中进行相应设置,否则您可能也必须--update这样做)。与给定 UUID 不匹配的外来数组最终应为/dev/md127+.


归根结底,无论您做什么,您都不应该盲目依赖/dev/mdX或,/dev/md/name就像不盲目依赖/dev/sdX字母一样。始终使用文件系统 UUID 来识别这些阵列上的内容。

在太多的极端情况下,名称可能会意外更改,因此,这充其量只能为系统管理员提供方向帮助或提示,而不是所有问题的答案。

答案2

我使用 Arch Linux 并经历了同样的行为。我使用与我的主机相同的主机创建了 RAID5 阵列。mdadm --detail /dev/md/data显示以下行

              Name : MY-NAS:data  (local to host MY-NAS)
              UUID : 3f3b2cba:5c184b08:183f0bc1:4bb971a1
            Events : 14720

我的主机名是MY-NAS.通过该命令mdadm --detail --scan >> /etc/mdadm.conf,我得到了用于 RAID 组装的附加行

ARRAY /dev/md/data metadata=1.2 spares=1 name=MY-NAS:data UUID=3f3b2cba:5c184b08:183f0bc1:4bb971a1

但是,当我重新启动计算机时,该阵列出现在/dev/md/MY-NAS:data而不是/dev/md/data。如果我mdadm --stop /dev/md/MY-NAS:data然后mdadm --assemble --scan,它出现在/dev/md/data

深入了解 udev 规则的工作原理后https://git.kernel.org/pub/scm/utils/mdadm/mdadm.git/tree/udev-md-raid-arrays.rules,我相信你需要

  1. mdadm_udev钩子放在前面lvm
  2. mkinitcpio -P每次进行更改时都会运行,/etc/mdadm.conf因为文件是直接添加到initramfs

执行此操作后,设备的名称就会得到纠正。

顺便说一句:我是 Arch Linux 的用户。对于 Ubuntu/Debian ,mkinitcpio相当于 update-initramfshttps://askubuntu.com/questions/1210480/ubuntu-equivalent-of-mkinitcpio-conf。但我不知道如何修改钩子的顺序。

相关内容