我想修复外部 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/