- Openebs >= v1.4
- e2fsprog < v1.47.0
由容器创建的文件系统,在主机运行 e2fsck, resize2fs 等命令时报错:
# resize2fs /dev/mapper/lvmvg-pvc--bcc852f8--7266--48c4--aedc--34adb523d224
resize2fs 1.46.5 (30-Dec-2021)
resize2fs: Filesystem has unsupported feature(s) (/dev/mapper/lvmvg-pvc--bcc852f8--7266--48c4--aedc--34adb523d224)
# e2fsck -f /dev/mapper/lvmvg-pvc--bcc852f8--7266--48c4--aedc--34adb523d224
e2fsck 1.46.5 (30-Dec-2021)
/dev/mapper/lvmvg-pvc--bcc852f8--7266--48c4--aedc--34adb523d224 is mounted.
e2fsck: Cannot continue, aborting.
诊断
报错信息为 Filesystem has unsupported feature
,查看该挂载点文件系统特性:
可以看出某些文件系统特性 FEATURE_C12
无法被 dumpe2fs
程序辨识。
阅读 e2fsprogs
的源码,分析 dump 时打印逻辑:
// lib/e2p/feature.c
// 利用 mask bit ,检查特性是否属于此版本支持特性之一,如果是,打印它 verbose 的特性名。
for (f = feature_list; f->string; f++) {
if ((compat == f->compat) &&
(mask == f->mask)) {
strncpy(buf, f->string, buf_len);
buf[buf_len - 1] = 0;
return;
}
}
// 并非已经列出的特性,直接输出 mask bit 位数
switch (compat) {
case E2P_FEATURE_COMPAT:
fchar = 'C';
break;
case E2P_FEATURE_INCOMPAT:
fchar = 'I';
break;
case E2P_FEATURE_RO_INCOMPAT:
fchar = 'R';
break;
default:
fchar = '?';
break;
}
for (fnum = 0; mask >>= 1; fnum++);
sprintf(buf, "FEATURE_%c%d", fchar, fnum);
经过换算后可得知 FEATURE_C12
为:
// lib/ext2fs/ext2_fs.h
#define EXT4_FEATURE_COMPAT_ORPHAN_FILE 0x1000
从代码中也看得出来 v1.46.5 版本的 e2fsprogs 确实不支持 EXT4_FEATURE_COMPAT_ORPHAN_FILE
:
#define EXT2_LIB_FEATURE_COMPAT_SUPP (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
EXT2_FEATURE_COMPAT_RESIZE_INODE|\
EXT2_FEATURE_COMPAT_DIR_INDEX|\
EXT2_FEATURE_COMPAT_EXT_ATTR|\
EXT4_FEATURE_COMPAT_SPARSE_SUPER2|\
EXT4_FEATURE_COMPAT_FAST_COMMIT|\
EXT4_FEATURE_COMPAT_STABLE_INODES)
由上述可推测挂载点文件系统为不同版本的 e2fsprogs 所建,因此可能默认开启这个特性。由于 pv 上文件系统为 Openebs LVM driver 管理,检查容器中 e2fsprogs
版本:
# e2fsck -V
e2fsck 1.47.0 (5-Feb-2023)
Using EXT2FS Library version 1.47.0, 5-Feb-2023
再次查看 v1.47.0 e2fsprogs 的支持特性:
#define EXT2_LIB_FEATURE_COMPAT_SUPP (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
EXT2_FEATURE_COMPAT_RESIZE_INODE|\
EXT2_FEATURE_COMPAT_DIR_INDEX|\
EXT2_FEATURE_COMPAT_EXT_ATTR|\
EXT4_FEATURE_COMPAT_SPARSE_SUPER2|\
EXT4_FEATURE_COMPAT_FAST_COMMIT|\
EXT4_FEATURE_COMPAT_STABLE_INODES|\
EXT4_FEATURE_COMPAT_ORPHAN_FILE) // <---
v1.47.0 支持 ORPHAN_FILE
,推测成立。
解法
系统 e2fsprogs 需与 Openebs LVM 容器中版本保持一致。