我把一个旧的 raid 阵列插入到一个新的系统并在尝试用它做任何事情时都会出现这个错误mdadm
。
# mdadm --detail --scan
ARRAY /dev/md/arch1:2021 metadata=1.2 UUID=c4c7cbde:5f6913a9:eb1c82ff:8fe6cd45
# mdadm --detail
mdadm: Value "arch1:2021" cannot be set as devname. Reason: Not POSIX compatible. Value ignored.
mdadm: No devices given.
一切仍然正常。我可以安装和使用阵列。“不合规”的名称可以正常显示为设备文件
# ls -la /dev/md/
total 0
drwxr-xr-x 2 root root 60 2024-08-09 03:16 .
drwxr-xr-x 20 root root 4580 2024-08-09 03:16 ..
lrwxrwxrwx 1 root root 8 2024-08-09 03:16 arch1:2021 -> ../md127
我可以使用的设备文件
# mdadm --detail /dev/md/arch1\:2021
/dev/md/arch1:2021:
Version : 1.2
Creation Time : Wed Jul 7 06:29:08 2021
Raid Level : raid1
以最安全的方式更新名称的最佳方法是什么?
此冒号将所属主机名与阵列名称分隔开: 。它作为字段
<hostname>:<name>
存储在MD 1.x 超级块中(DDF 外部元数据格式也支持此字段)。它是超级块(有关阵列名称的唯一真实来源),而不是。后者中的条目必须与超级块中存储的内容一致,系统才能激活阵列。生成正确条目的最简单方法是使用的输出。或者只是在条目中省略该名称参数,而使用,并且仅依赖于文件系统 UUID 或 LVM 或阵列上的任何更高级别的结构。set_name
mdadm.conf
mdadm --examine --scan
ARRAY /dev/mdN UUID=...
创建时,您只需提供后面的“名称”部分,而主机名是自动获取的,但您也可以强制执行:
将存储
arch1:2021
。在激活期间,如果当前系统主机名与存储的主机名相同,则 中的符号链接会
/dev/md/
省略主机名(看起来就像/dev/md/<name>
),否则会包含主机名,就像您的情况一样。您可以HOMEHOST hostname
在 中设置mdadm.conf
,以使用该主机名从存储在超级块中的名称中删除,而不是当前系统主机名。另请参阅这个精彩的答案
此错误消息是在 mdadm v4.3 中引入的。尽管开发人员承认在某些情况下这是一种倒退,但他们也明确表示它不会消失,所以 — — 我想,只能接受它了。
除了名称中的特殊字符外,mdadm v4.3 还会对大于 127 的数字产生影响。在最近的补丁中,这个数字被慷慨地扩展到 1024 — 然而在 mdadm v4.3 之前,您最多可以使用 1048575(内核限制)。
在您的情况下, if
arch1:2021
并非旨在表示/dev/md2021
,而是使用 2021 作为名称,不幸的是,mdadm 在其元数据link1 link2中不区分主机名、编号(首选次要)或名称。所有这些都进入同一个 32 字节字符串,并由解释决定。因此,如果您希望使用 mdadm 名称,则名称应避免使用所有特殊字符,也应避免使用数字。因此,如果可能的话,请仅使用 az。如果您必须使用数字,请确保它不是名称中的第一个字符(使用
foo123
而不是仅使用123
)。mdadm 名称(在元数据中)只能在组装时更改。如果阵列已在运行,则必须先停止它,这只有在不使用时才能完成,因此除非您启动救援系统,否则永远都无法停止。
那么它应该是这样的,但是...:
分段错误???嗯,这显然是不应该发生的
HOMEHOST <none>
... 这个错误(已在 git 中修复)仅当你在 mdadm.conf 中设置或你的主机名为空时才会触发。因此,在此修复程序发布之前,您或多或少只能将
mdadm
主机名包含在数组名称中。除非hostname:arrayname
长度超过 32 个字节,因为元数据无法存储更长的字符串。因此,您可以通过传递长度为 32 字节的主机名来作弊:
其结果如下:
因此,如果您想摆脱
arch1:
自己的名下的一切,那么这是目前唯一的方法。将您的样式更改
/etc/mdadm.conf
为使用/dev/md0
(数字样式,数字在范围内,0-127
因为较大的数字会无缘无故被拒绝)。或者使用(符号链接)命名样式/dev/md/name
和非数字名称。在组装命名数组时,
mdadm
将自行选择一个数字。对于每个数字,mdadm 都会进行解析/proc/mdstat
以检查它是否已被使用,直到找到一个空闲的数字 — 这对于组装 3 个数组来说还算可以,但对于组装 300 个数组来说就不太合适了,因为那时 mdstat 会被解析数千次。/dev/md/name
然后将是一个符号链接/dev/md127
(或其他数字)。命名数组也将显示为/dev/md127
下方/proc/mdstat
,并且这些数字可能会发生变化,因此在管理多个数组时请考虑到这一点。还有第三种命名风格:
这会将名称直接放入设备名称中
/dev/md_name
。这很不寻常,因为没有其他设备驱动程序这样做。这也是唯一一种以名称/proc/mdstat
而不是数字显示的样式。但是这种风格在 中完全没有记录
man 4 md
。并且man 5 mdadm.conf
不鼓励使用它,因为其他工具可能不需要这种风格。所以应该避免使用它。总而言之,
mdadm
它对名称的支持非常差。您无法设置它们,无法更改它们,除非经过很多麻烦,实用mdadm
程序不会使用它们,甚至不会显示它们。事实上,它什么也不显示,你应该看看/proc/mdstat
,因为mdadm
它本身甚至不能向您显示一个漂亮的数组及其状态列表。这与其他实用程序实际上帮助您管理事物并在执行过程中显示名称的方式相差甚远,甚至没有人关心数字。