在Linux中,如何检查磁盘是否碎片化?


28

在启动时,fsck有时会报告磁盘碎片:“ 5.3%非连续”。

我如何自己获取此信息?是否有特定的fsck调用?

Answers:


27

即使像这样挂载,您也可以在ext2 ext3或ext4文件系统上安全地运行fsck.ext2

sudo fsck.ext2 -fn /dev/sdXY

如果安装了驱动器,它将输出很多错误,但是-n参数告诉它不要接触驱动器。

$ sudo fsck.ext2 -fn /dev/sda1
e2fsck 1.42 (29-Nov-2011)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Ubuntu_Rescue: 291595/1222992 files (0.2% non-contiguous), 1927790/4882432 blocks

谢谢!fsck.ext2在我的主分区上发现了几个错误。现在,我想修复它。这就引出了一个问题:如何修复我的主分区,需要对其进行挂载才能登录?
2014年

3
@Michael如果已安装驱动器,则对其进行检查将始终报告错误。无论如何,如果要在下次重新引导时检查文件系统,请运行该文件sudo tune2fs -C 16000 /dev/sda1并重新引导。
Rucent88 2014年

1
fsck检查磁盘/存储中的内容,但是如果安装了磁盘,则将有正在进行的内容(一半写入)。这就是为什么您会看到错误,它们不是真正的错误,它们是错误的错误。别管他们。
ctrl-alt-delor

8

现代ext文件系统家族在分配文件时考虑了平衡性和连续性。在ext3和ext4中,通常通过按顺序应用日志条目来进行平衡,特别是在ext4中,通过预分配文件系统扩展以增加连续的块来实现平衡。将碎片级别控制在20%以下可能不值得花时间,尤其是在系统反复访问几个文件的情况下。我建议采用以下策略来提高单个磁盘系统的读取速度:

  • 增加内存:这增加了文件系统缓存

  • 增加块大小:通过从1k变为4k块大小,读取或读取比块大小大的文件可获得更好的性能

  • 如果您是书呆子,则可以按块大小将大文件和小文件组织到分区中,如果仅将照片,视频和源代码存储在单独的目录中,则可能只想这样做

  • 使用hdparm和/或笔记本电脑模式实用程序增加预读设置

  • 以线性方式(如tar)备份和还原文件系统

如果您有多个磁盘并且正在使用RAID条带化和/或LVM,则需要考虑其他因素,例如条带大小。


4

是的,有一个特定的fsck调用(作为root或sudo):

$ fsck /dev/sdXY

将X和Y替换为适合您的情况的正确参数(例如/dev/sda1)。

请勿在固定的分区上运行!它会严重损坏您的文件系统。

有关Linux和碎片整理的更多信息,请参见此处的答案。


如果您不需要专门运行fsck,而只想检查驱动器的碎片,可以使用以下脚本(从此处获取):

#!/usr/bin/perl -w

#this script search for frag on a fs
use strict;

#number of files
my $files = 0;
#number of fragment
my $fragments = 0;
#number of fragmented files
my $fragfiles = 0;

#search fs for all file
open (FILES, '-|', "find '$ARGV[0]' -xdev -type f -print0");

$/ = "\0";

while (defined (my $file = <FILES>)) {
        open (FRAG, "-|", "filefrag", $file);
        my $res = <FRAG>;
        if ($res =~ m/.*:\s+(\d+) extents? found/) {
                my $fragment = $1;
                $fragments += $fragment;
                if ($fragment > 1) {
                        $fragfiles++;
                }
                $files++;
        } else {
                print ("$res : not understand for $file.\n");
        }
        close (FRAG);
}
close (FILES);

print ( $fragfiles / $files * 100 . "% non contiguous files, " . $fragments / $files . " average fragments.\n"); 

然后可以在有问题的目录(或挂载点)上运行它:

$ frag_check.pl $HOME/
  1.32410691664555% non contiguous files, 1.05380668862427 average fragments.

那只是在分区上调用fsck,众所周知,它将破坏已安装的分区。有什么方法可以以只读方式告诉我如何对我的磁盘进行分段?
珀尔帖2012年

据我所知,@ Peltier。我以为您可以引导到较低的运行级别,卸载相关磁盘并运行fsck。认真地说,无论如何,您几乎可以肯定会忽略大多数Linux系统上的碎片。
terdon 2012年

@Peltier,请参阅我的最新答案。
terdon 2012年

1
是的,它很慢。请注意,我在500GB / home /分区上花费了大约2-3分钟。我再次强调,驱动器碎片不再是真正的问题。特别是在使用EXT3-4文件系统的情况下。
terdon 2012年

1
@KentFredric啊!确实是的。我明白你的意思了。我做了相应的编辑,谢谢。让我们删除注释以消除混乱。
terdon

0

您可以使用e2defrag之类的工具来获取此信息。

请注意,由于Linux文件系统的性质,通常不需要进行碎片整理。


您介意详细回答吗?我尝试通过获取信息e4defrag -c,但没有成功。
珀尔帖2012年

@Peltier将其指向-c最后一个参数的选项后的Ext3或Ext4插点。还有...“没用”吗?您得到什么错误?
gertvdijk 2012年

它说“完成”。但是,我没有将其直接指向设备,而是指向安装点。我正在尝试使用该设备。
珀尔帖2012年

请注意,这需要花费很多时间,而fsck非常快。
珀尔帖2012年

只需在设备上再次尝试,它只会显示“完成”。
珀尔帖(Peltier)2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.