![如何在已有 10 年历史的 2010 CentOS 系统上挂载在最近的系统上创建的 ext4 分区?](https://linux22.com/image/177251/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%B7%B2%E6%9C%89%2010%20%E5%B9%B4%E5%8E%86%E5%8F%B2%E7%9A%84%202010%20CentOS%20%E7%B3%BB%E7%BB%9F%E4%B8%8A%E6%8C%82%E8%BD%BD%E5%9C%A8%E6%9C%80%E8%BF%91%E7%9A%84%E7%B3%BB%E7%BB%9F%E4%B8%8A%E5%88%9B%E5%BB%BA%E7%9A%84%20ext4%20%E5%88%86%E5%8C%BA%EF%BC%9F.png)
我在 Ubuntu 18.04.4 LTS 上创建了一个 ext4 分区,以便将大量数据传输到生产服务器。服务器运行的是 CentOS 6.10,内核为 2.6.32。这Ext4 操作指南声明“Ext4 在 Linux 2.6.28 中作为功能完整且稳定的文件系统发布”,因此我认为我将能够挂载该分区。
但是,当尝试在服务器上安装分区时,我收到错误:
localhost kernel: EXT4-fs (sdd1): couldn't mount RDWR because of unsupported optional features (400)
localhost kernel: JBD: Unrecognised features on journal
localhost kernel: EXT4-fs (sdd1): error loading journal
我拥有服务器的完全 root 访问权限,但由于运行软件的兼容性问题,我无法升级任何操作系统组件。
最初的谷歌搜索表明该问题是由于元数据校验和功能造成的,因此我下载并编译了最新的 e2fsprogs (1.46-WIP (20-Mar-2020)) 并使用它们来禁用该功能:
sudo /home/user/bin/e2fsck -f /dev/sdd1
sudo /home/user/bin/tune2fs -O ^metadata_csum /dev/sdd1
然而,分区仍然无法安装,尽管我不再收到“不支持的可选功能(400)”消息:
$ sudo mount /dev/sdd1 /mnt/disk1
mount: wrong fs type, bad option, bad superblock on /dev/sdd1,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so
$ sudo tail /var/log/messages
Jul 20 08:01:21 localhost kernel: JBD: Unrecognised features on journal
Jul 20 08:01:21 localhost kernel: EXT4-fs (sdd1): error loading journal
有什么方法可以在不重新启动服务器或更改任何系统软件的情况下访问该分区上的数据吗?似乎有两个选择:要么按原样使用挂载分区(使用 FUSE,或编译我自己的 mount.ext4 二进制文件),要么使用une2fs 删除剩余的不兼容功能(我如何找出它们是什么?)
我应该提到,由于 COVID-19 封锁措施,需要等待两到三周的时间才能有人从服务器上拔下驱动器并将其插入另一台机器。我需要找到一个可以更快实施的解决方案。
答案1
首先尝试运行
sudo e2fsck -f -v -C 0 -t /dev/sdd1
可能需要运行 e2fsck 才能完成该功能的删除。
如果仍然没有帮助,请尝试删除并重新创建日志:
sudo /home/user/bin/tune2fs -O '^has_journal,^64bit' /dev/sdd1
sudo /home/user/bin/resize2fs -s /dev/sdd1
sudo /home/user/bin/tune2fs -j /dev/sdd1
最后,如果它仍然无法安装,请比较用于 和 的标志sudo dumpe2fs /dev/existing_parition
,sudo dumpe2fs /dev/sdd1
并删除现有分区中不存在的标志。
作为将来的参考,如果您在旧系统而不是新系统上格式化文件系统,则新内核应该始终可以使用它。如果您需要在新系统上进行格式化,您可以使用mke2fs -t ext4 -O '^metadata_csum,^64bit'
以避免某些较新的功能(尽管这可能是一个移动目标),或者mke2fs -t ext3
(尽管这可能会比 ext4 慢一些,但在兼容性方面非常安全)。
答案2
我需要使用旧的救援环境(~2014?)来修复现代系统上的 grub 引导加载程序,并且遇到了同样的问题。对我来说,解决方案是在没有日志的情况下挂载文件系统:
# mount -o ro,noload /dev/sda1 /mnt
“noload”参数似乎没有(IMO正确)记录,但它确实出现在mount(8)
手册页中--read-only
:
-r, --read-only
Mount the filesystem read-only. A synonym is -o ro.
Note that, depending on the filesystem type, state
and kernel behavior, the system may still write to the device.
For example, ext3 and ext4 will replay the journal if the
filesystem is dirty. To prevent this kind of write access,
you may want to mount an ext3 or ext4 filesystem with the
[look->] ro,noload mount options or set the block device itself to
read-only mode, see the blockdev(8) command.
您也可以挂载读写,但我只需要只读。