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

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

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

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

答案1

即使像这样挂载,你也可以在 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

答案2

现代 ext 系列文件系统在分配文件时会考虑平衡和连续性。在 ext3 和 ext4 中,平衡通常通过按顺序应用日志条目来实现,而在 ext4 中,具体来说,平衡是通过预分配文件系统扩展区来增加连续块来实现的。追求低于 20% 的碎片化水平可能不值得您花时间,尤其是当您的系统重复访问一些文件时。我建议采用以下策略来提高单个磁盘系统的读取速度:

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

  • 增加块大小:通过将块大小从 1k 移至 4k,您可以获得接近或大于块大小的文件的读取性能

  • 如果你很严谨,你可以按照块大小将大文件和小文件组织到分区中,如果你将照片、视频和源代码存储在单独的目录中,你可能只想这样做

  • 使用 hdparm 和/或 laptop-mode 实用程序增加预读设置

  • 以线性方式备份和恢复文件系统,例如使用 tar

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

答案3

是的,有一个特定的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.

答案4

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

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

相关内容