在 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,我相信你需要
- 将
mdadm_udev
钩子放在前面lvm
mkinitcpio -P
每次进行更改时都会运行,/etc/mdadm.conf
因为文件是直接添加到initramfs
执行此操作后,设备的名称就会得到纠正。
顺便说一句:我是 Arch Linux 的用户。对于 Ubuntu/Debian ,mkinitcpio
相当于 update-initramfs
https://askubuntu.com/questions/1210480/ubuntu-equivalent-of-mkinitcpio-conf。但我不知道如何修改钩子的顺序。