fsck - 修复损坏的文件系统
May 19, 2019 默认分类
为什么使用 fsck
计算机突然掉电,或者系统崩溃,就很有可能导致文件系统出现不一致,即只有部分内容实际写入了硬盘,而本应同时写入的数据并未写入。好在,现在常用的文件系统都使用了一致性保证技术,通常是日志(journal),也有软更新(soft-updates,用于 UFS ),或者两者并用(日志式软更新 Journaled Soft-updates,用于 FreeBSD 的 UFS)。重启后,内核或 fsck 检测到文件系统未正确卸载,就重放一遍日志或者进行后台清理。但是,如果文件系统损坏得更为严重,需要人工操作,系统会进入急救模式。这时,就需要人工运行 fsck
.
但是,fsck
是个比较危险的命令——可能造成文件系统不可逆的损坏。因此,在修复损坏较重的文件系统时,建议先做备份。而e2fsck
提供了“撤销”功能,即记录下对文件系统所做的更改。需要恢复时,用e2undo
恢复。很显然,这不能用来把文件系统恢复到已知正常的状态——它只能用于撤销e2fsck
和e2undo
命令造成的更改。因此,文件系统正常时,需要定期备份,以防不时之需。
fsck 常用参数:-p
自动修复文件系统。如有需要人工确认的操作,fsck
会退出,这时,可能要用fsck -y
。-y
接受所有操作,即强力“修复”文件系统。这个选项可能会把文件系统搞得更乱。-f
强制进行检查,即使文件系统没有设置“脏”位。-z undo_file
仅限ext文件系统。指定撤销文件存放的位置。如果不能做全盘备份,但又有可写分区,此选项很有用。
注意:
- fsck 需要进行大量的随机读写。
- fsck 有可能因为文件系统的严重损坏而崩溃。
- 一些文件系统没有常规意义上的
fsck
。它们一般使用内核来重放日志。但是,它们也有修复程序,只是名字不同,如 xfs 的叫做xfs_repair
。 - 在执行修复前,务必仔细阅读修复程序的文档,并做好备份。
- 绝对不要在已经挂载的文件系统上运行。
- fsck 可能会从头再次运行。在损坏严重的文件系统上会出现此现象。
- 可以使用
script
记录 fsck 的所有更改。
fsck 怎么工作?
fsck会重放日志(如果有),检查元数据间的矛盾之处,然后尝试通过修改元数据来解决矛盾。没有链接(即在目录树中不存在的文件),但有有效连接数的文件,会被放在lost+found
文件夹中。权限、所有者等信息依然存在,但是很可能要运行file
来判断文件类型。https://docs.freebsd.org/44doc/smm/03.fsck/paper.html处有一份 4.4BSD 的 UFS 上的 fsck 的原理和运行方式的详解,由 Marshall Kirk McKusick 所写。
mark了 感谢分享