e2fsck - 尽管在 /etc/e2fsck.conf 中设置了 [scratch_files],但内存不足

e2fsck - 尽管在 /etc/e2fsck.conf 中设置了 [scratch_files],但内存不足

我想修复外部 16GB SD 卡驱动器上的 ext2 文件系统。

当我发出以下命令时:

e2fsck -y /dev/xxx

我的系统内存不足(Fedora 17 x64 8GB RAM,8GB Swap)。

根据建议别处, 我已经添加:

[scratch_files]
directory = /var/cache/e2fsck    # (this directory exists and is writable to all)

到:

/etc/e2fsck.conf

不幸的是,这个修复似乎不起作用。e2fsck 确实使用了 /var/cache/e2fsck 目录,但仍然内存不足。

当我以交互方式运行该命令时,它会在以下提示处停止:

Inode 758 has an invalid extent
    (logical block 0, invalid physical block 140737488469058, len 1)
Clear<y>? yes
Inode 758, i_blocks is 8, should be 0.  Fix<y>? 

对该提示回答是或否都会有相同的结果:e2fsck 使用的 RAM 突然跳升至 8GB+,并且我的系统冻结。

编辑:在 VirtualBox 中

我尝试在 VirtualBox 中使用 fsck,它有高达 40GB 的交换空间。Fsck 使用了所有 4GB RAM 和大约 30 GB 的交换空间,然后它死机并显示以下错误消息:

Error storing directory block information (inode=759, block=0, num=295645313): 
Memory allocation failed

答案1

内存跳转听起来像是一个e2fsck错误。如果是这样的话,可以通过手动关注这个 inode 来解决问题(使用debugfs;但我不太熟悉,无法解释如何做到这一点)。

如果这不是一个错误,e2fsck只是需要更多内存,那么就有一个“解决方案”,它不需要添加 RAM,但它肯定会“重新定义性能”……问题是 e2fsck 不使用交换内存作为等效内存。至少在类似情况下是这样的。您的交换空间在e2fsck崩溃前是否已完全填满?可能不会。

您可以e2fsck通过欺骗的方式接受交换空间作为实际 RAM:您可以在 VM 中启动第二个 Linux,并将要检查的块设备导出到 VM。您为 VM 配置的内存比实际可用的内存更多。e2fsck在 VM 中将看到更多的 RAM。当然,这并不意味着无需使用 scratch_files。

我在启动虚拟机时遇到了内存分配多于可用物理 RAM 的问题,但是根据 Fedora 文档这应该是可能的(也许这甚至不是 KVM/QEMU 问题,而是一些花哨的内核问题)。

答案2

我通过在外部驱动器上创建交换文件解决了这个问题..我创建了一个 12gb 的交换来补充现有的交换..这使得 fsck 可以在 12tb 文件服务器上顺利完成..但是它确实降低了磁盘检查的性能。

此站点记录了以下步骤:http://www.cyberciti.biz/faq/linux-add-a-swap-file-howto/

相关内容