xfs内核不兼容处理¶
我在 为GlusterFS部署准备CentOS环境 时遇到过 XFS 文件系统无法挂载的报错:
mount: wrong fs type, bad option, bad superblock on /dev/nvme0n1p1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
根据提示,执行 dmesg | tail
查看,原来是服务器内核不支持挂载参数:
XFS (nvme0n1p1): Superblock has unknown incompatible features (0x2) enabled.
Filesystem can not be safely mounted by this kernel.
XFS (nvme0n1p1): SB validate failed with error -22.
这个问题在我之前的实践中( CentOS 7 部署Gluster 6 没有遇到过(之前的操作系统内核版本应该是 4.19 ,但这次遇到的内核版本是是非常古老的 3.10.0-xxx
XFS默认格式化的时候,会为文件系统设置一个随机的UUID,类似 c1b9d5a2-f162-11cf-9ece-0020afc76f16
,这个uuid也可以设置为 nil
意味着文件系统UUID设置成没有UUID。但是,对于旧版本内核,在激活了CRC的文件系统中,这会导致不兼容而无法挂载文件系统。
上述这种内核不兼容报错在将XFS文件系统从 RHEL 8 改到 RHEL 7上经常会出现:
RHEL 8 使用的XFS文件系统是 XFS v5,包含了大量的 RHEL 7 内核(kernel 3.10)不支持的功能
mkfs.xfs
(从xfsprogs 3.2.4
开始)默认创建 XFS v5版本超级快,并提供大量增强功能,例如元数据CRC校验和。这种XFS v5 superblock需要内核3.16
或更高版本支持,在默认的 RHEL 7/CentOS 7使用的Kernel 3.10 内核无法挂载在搭配使用最新版本
xfsprogs
和老版本内核(例如 kernel 3.10)时,务必使用以下选项创建v4
文件系统:
mkfs.xfs -f -i size=512 -m crc=0,finobt=0 /dev/nvme0n1p1
那么怎么验证使用 -m crc=0,finobt=0
参数格式化之后的 XFS superblock 是v4版本呢?
使用
xfs_db
检查:
xfs_db -r -c "sb" -c p /dev/nvme0n1p1 | grep versionnum
如果是 v4 版本 xfs superblock,则输出:
versionnum = 0xb4a4
如果是 v5
版本 xfs superblock,则输出:
versionnum = 0xb4a5
此外,当将文件系统重新格式化成 XFS superblock v4 之后,就能够正常在 kernel 3.10 内核(RHEL 7/CentOS 7)挂载,此时内核消息输出也能看到是挂载XFS v4:
[Sun Jul 2 21:28:43 2023] XFS (nvme0n1p1): Mounting V4 Filesystem
[Sun Jul 2 21:28:43 2023] XFS (nvme0n1p1): Ending clean mount
其他方法(归档参考)¶
Unmountable XFS filesystem 的回答提供了以下移除默认参数的方法( 但是我实践没有成功 )
xfs_admin -U restore /dev/nvme0n1p1