在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:似乎对以只读模式挂载的分区,虽则安全,但也并不能修正文件系统的错误,恐怕并无意义。