fsck修复受损的文件系统

 

Linux不正常关机,有时候再次启动时会报文件系统损坏,如何修复文件?

首先会让你输入root用户的密码。 

1)出错的时候如果告诉你是哪一块硬盘的分区有问题,比如是/dev/hda3 

接着用如下的命令去对付它呀: 

#fsck -y /dev/hda3 

结束后,reboot。这样就OK了! 

2)如果你不知道时哪个地方出了问题。(常用此种方法) 

可以直接 

#fsck 

在随后的多个确认对话框中输入:y 

结束后,reboot。就ok了。

 

说明: 对Linux系统中常用文件系统的检查是通过fsck工具来完成的。 

功能说明:检查文件系统并尝试修复错误。

语  法:fsck [-aANPrRsTV][-t ][文件系统...] 

补充说明:当文件系统发生错误四化,可用fsck指令尝试加以修复。

参  数: 

-a 自动修复文件系统,不询问任何问题。 

-A 依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统。 

-N 不执行指令,仅列出实际执行会进行的动作。

-P 当搭配"-A"参数使用时,则会同时检查所有的文件系统。 

-r 采用互动模式,在执行修复时询问问题,让用户得以确认并决定处理方式。 

-R 当搭配"-A"参数使用时,则会略过/目录的文件系统不予检查。 

-s 依序执行检查作业,而非同时执行。 

-t 指定要检查的文件系统类型。 

-T 执行fsck指令时,不显示标题信息。 

-V 显示指令执行过程。

 

用fsck检查文件系统完整性文件系统很复杂,因此易于发生错误。可以用fsck 命令检查文件系统是否正确和有效。它可以根据指令修复找到的小错误,并将未修复错误报告用户。幸运的是,文件系统的代码非常有效,所以根本极少出现问题,并且问题通常原因是电源失败、硬件失败、或操作错误,例如没有正常关闭系统。 大多数系统设置为启动时自动运行fsck ,因此任何错误将在系统使用前被检测到(并根据希望修正)。使用有错误的文件系统可能使问题变得更坏:如果数据结构有问题,使用这个文件系统可能使之更糟,导致更多的数据丢失。当然,在大的文件系统上运行fsck 会花一定的时间,如果系统正常关闭,几乎从不发生错误,因此有一些方法可以不进行检查。如果文件/etc/fastboot 存在,就不检查。另外,如果ext2文件系统在超级快中有一个特定的标记告知该文件系统在上次mount后没有正常unmount. 如果标记指出unmount正常完成(假设正常unmount指出没问题),e2fsck (fsck 的ext2文件系统版) 就不检查系统。/etc/fastboot 是否影响系统依赖于你的启动手稿,但ext2标记则在你使用e2fsck 时发生作用--基于一个e2fsck 选项(参阅e2fsck 手册页) 自动检查只对启动时自动mount的文件系统发生作用。使用fsck 手工检查其他文件系统,比如软盘。 如果fsck 发现为修复的问题,你需要深入了解文件系统的一般工作原理和有问题的文件系统的细节,或好的备份。最后一个办法容易(虽然冗长)安排,如果你自己不知道,有时可以通过朋友、linux新闻组、电子邮件列表或其他支持源安排。我很想告诉你更多,但我对这的学习和实践也并不多。theodore t’so的debugfs 程序应该有用。 fsck 只能运行于未mount的文件系统,不要用于已mount的文件系统(除了启动时的只读根文件系统)。这是因为它存取原始磁盘,在操作系统不知道的情况下修改文件系统。 there will be trouble, if the operating system is confused.


在windows下,磁盘的文件系统出错,需要运行chkdsk命令进行修复。而在linux下,则需要运行fsck命令。由于linux对于文件系统的错误非常敏感,由于意外断电或者其它原因导致linux系统意外关机或者重启,都可能对linux的文件系统造成严重的损坏,从而导致不能正常地进入系统。这也使得fsck变成一个不可或缺的命令。然而这个fsck命令却有一个致命的软肋,就是对于已经挂载了的分区运行具有极大的危险性,远不如windows下的chkdsk命令的安全。
本文以ubuntu系统为例进行讲述。

由于fsck命令的这个致命的软肋,所以运行这个命令的最好方式是用livecd方式启动ubuntu,进入桌面后,首先确认要运行命令的分区是否挂载。比如要对第一硬盘第一分区进行运行,首先可以用umount命令进行卸载:

sudo umount /dev/sda1

一般情形下,都是没有挂载的。运行这个umount命令只是为了确认一下,或者说是为了以怕万一而已。
确认没有挂载后,需要确认这个分区的文件系统是什么,这个可以用命令:

sudo fdisk -l

以查看这个分区的文件系统是什么。文件系统千万不能错了。这里以ext4文件系统为例进行讲述。这个命令不止是确认分区的文件系统是什么,同时也是确认这个分区是如何写法的。sata硬盘的写法是sda,而ide硬盘的写法是hda。

确认没有挂载和文件系统是什么后,输入下面的命令:

fsck -t  ext4 /dev/sda1

-t参数是指明文件系统是什么。/dev/sda1则是指定分区。

这个命令还有另外一种输入法,这就是:

fsck.ext4 /dev/sda1

其实就是fsck -t ext4这个命令就是在调用fsck.ext4这个命令。

fsck默认只对有错误的档案进行检测,但是,我们可以加一个参数-f,让fsck对于没有错的档案也强行检测。这样大约可以修复一些分区的轻微的错误吧。

fsck.ext4 -f /dev/sda1

fsck还有检测硬盘坏道的功能,参数是-c

fsck.ext4 -fc /dev/sda1

检测坏道是很慢的。一般是不需要运行这个命令的。但有必要了解一下吧。
上面是以/dec/sda1分区为例进行讲述,对于其它的分区的运行,举一反三就是了。


如果没有livecd怎么办呢?可以用硬盘启动映象文件的办法启动ubuntu.只要你懂硬盘安装ubuntu的办法,你也就会知道这种启动的办法,具体启动的办法就不赘述了。

但有一个要点,对于映象文件所在的分区不可检测。这里的原因当然是因为这个分区是被挂载了的。即便用:sudo umount -l /isodevice命令卸载掉了这个分区,也仍是不宜检测为好。

另外,fsck命令只能检测linux分区,对于windows分区就不可以用这个命令进行检测了。
所以我一般的办法是把ubuntu映象文件放在windows分区。这样可以无障碍地检测全部linux分区。

在ubuntu9.04的recovery mode中有一个fsck选项。在这个选项中,系统设定了运行fsck命令的一些安全参数。选择这个选项后,系统将自动运行fsck命令。从我的经验来看,这种方式的检测还是很安全的。不知什么缘故,官方在ubuntu9.10中,把这个选项去掉了。但是,我们仍然可以在recovery mode中,手动运行fsck命令。

进入recovery mode后,先以root用户登陆文本界面。

首先运行命令:
fsck -F
请注意,这个参数是大写F,而不是小写f,如果你写错,麻烦可就大了。我也就曾经误写过,后果是很严重的。好在我很熟知这方面的知识,没有造成实质的损失。
这个命令的作用是清除掉内存中的磁盘缓存。所以这个命令毋须指定分区对象。根据我的经验,使用这个参数的一个要点是不要同时使用其它的参数。就单独运行一下这个参数。

找到的资料对于这个参数的说明是:

-F: 在检查前将硬盘的 buffer cache 清空,避免发生错误。

根据我的经验,用这个参数是很安全的,确实可以极有效地防止fsck出错。我曾经在虚拟机做过试验。在正常登陆状态下,先用这个命令清除掉内存中的硬盘缓存,然后运行命令:fsck -AfsC
重启电脑后,居然成功地进入了桌面。而不用先用这个命令,直接用fsck -AfsC命令,结果重启进不了桌面。效果对照是很明显的。

然后运行命令:
sudo umount -a
这个命令是把/etc/fstab文件中设定的分区,能卸载掉的都卸载掉。一般来说,除了/分区,其它的都能卸载掉的。卸载掉分区后再运行fsck命令,安全系统就大大地增加了。

然后输入命令:
fsck -Afs


-A 依照/etc/fstab配置文件的内容,检查文件内所列的全部文件系统。
-f参数的作用前面说了。
-s参数的作用是分别检测。分别检测是与并行检测相对的。所谓并行检测,就是同时检测/etc/fstab中设定的多个分区。

由于/分区没有卸载掉,所以在这里我们不能用-c参数。因为对于没有卸载掉的分区运行-c参数,危险性更为加大。但是,我们可以加参数-R,略过/分区不检测。

fsck -AfscR

还有一个参数是-C,这个参数可以在运行时显示进度条,这样命令运行起来时更好看些吧。比如:

fsck -ARCfsc

最后特别强调一下,由于fsck命令对于已经挂载的分区运行具有高度的危险性,所以千万不能在正常登陆下运行这个命令。



ps:
还有一个重要的命令,可以以只读模式挂载/分区,这样运行fsck命令就非常之安全了。而对以只读模式挂载的分区运行fsck命令是安全的。

mount -no remount,ro /

-n
  一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
-o 是挂载选项,remount重新挂载,ro只读挂载。


可以考虑预先做一个可执行文件放到在/分区可以找得到的地方,比如放在/root下,并命名为runfsck,然后进recovery mode执行这个文件,避免了手动输入命令的麻烦。

=====================
mount -no remount,ro /
umount -a
fsck -F
fsck -AfsC
=====================

其实命令中的fsck -F已经没有必要了。

ps:似乎对以只读模式挂载的分区,虽则安全,但也并不能修正文件系统的错误,恐怕并无意义。