当启用压缩功能时,btrfs会自动压缩现有文件吗?

我在Ubuntu 12.04 LTS安装程序中选择了btrfs作为我的/文件系统的格式。安装完成后,我在/etc/fstab中的挂载选项中添加了compress=lzo,并重新启动。
现有的文件现在会自动压缩吗?还是我需要明确采取一些措施来实现压缩?

1你不需要重新启动,只需执行sudo mount -o remount /命令,新的fstab选项就会生效。 - sep332
请注意,您可能需要使用压缩强制选项,否则某些文件无论您如何操作仍将保持未压缩状态... - rogerdpack
2关于compress-force的注意事项。普通的compress具有一个特点,即如果检测到压缩对该特定文件几乎没有好处,它将不会继续进行压缩(从而节省了浪费的CPU资源)。而使用compress-force,它将尝试进行无用的压缩。这种情况通常适用于已经压缩过的文件(多媒体文件、zip文件等)。换句话说,compress-force通常是一个糟糕的想法。;) - zaTricky
5个回答

你需要运行来强制重新压缩现有数据。否则,只有新数据会被压缩。
常见问题解答中可以看到:

...考虑使用-o compress重新挂载,并且要么就地重写特定文件,要么运行btrfs fi defragment来重新压缩所有内容。这可能需要一些时间。


1btrfs fi defragment -r -clzo /path/to/fs - David Goodwin
3autodefrag挂载选项怎么样?当它自动碎片整理时,是否也会压缩之前未压缩的文件? - Geremia
3确保在压缩目录时使用"-r"递归标志。 - Salami

我按照Norbert Fabritius所说的做了,但是我没有注意到现有文件中有任何压缩 - df -h / 之前 btrfs fi defragment = 658MB | df -h / 之后 btrfs fi defragment = 658MB。新文件没问题。稍微搜索了一下,找到了这段引用:

运行以下命令:

# btrfs filesystem defragment ~/stuff

不会对目录的内容进行碎片整理。

这是设计上的。btrfs fi defrag只对传递给它的单个文件系统对象进行碎片整理。这意味着该命令只对目录对象保存的元数据进行碎片整理,而不是目录的内容。如果你想要对目录的内容进行碎片整理,可以尝试类似以下的命令:

# find -xdev -type f -exec btrfs fi defrag '{}' \;

在此之后,我的/占用了656MB - 不算太大,但肯定有压缩效果。

来源:{{ link1 }}

1
  1. 当使用btrfs时,不要使用或信任df命令
  2. 为了获得更好的压缩比,可以使用zlib(但速度较慢)。
- ignis
4如果你想要真正压缩文件,你的命令行不应该只包含defrag,而是应该包括defrag -clzo或者defrag -czlib - jbo5112
8现在有一个"-r"递归标志,所以你可以直接这样做: btrfs fi defrag -r -czlib ~/stuff - Salami
仅供参考,我在全新安装的Ubuntu 22.04上使用zstd:3(默认设置)得到了一个9.17 -> 5.89 GiB的结果。太棒了。 - martixy

根据Oracle的文档,你可以通过使用-c、-clzo或-czlib选项来对现有的在线文件系统中的每个文件进行碎片整理,从而压缩现有文件。建议使用LZO以提高速度。
find / -xdev \( -type f -o -type d \) -exec btrfs filesystem defragment -v -clzo -- {} +

这使用find命令在根文件系统中的每个文件上运行btrfs碎片整理器(在“find”命令之后的斜杠处给出)。如果您有其他子卷,可以再次使用它,并将子卷的路径(例如,我在/home下有一个)替换为单个斜杠。
您需要root权限才能执行此操作,因此如果需要,请在前面添加sudo。
参见:

根据https://btrfs.wiki.kernel.org/index.php/Mount_options#List_of_options,以下是可用的压缩算法:

compress,compress-force
Enable compression. Starting with kernel 2.6.38 you can choose the algorithm for compression:

 - compress=zlib - Better compression ratio. It's the default and safe for olders kernels.
 - compress=lzo - Faster compression.
 - compress=no - Disables compression (starting with kernel 3.6). 

compress-force= - Enable compression even for files that don't compress well, like videos and dd images of disks. The options compress-force=zlib and compress-force=lzo works for kernels >2.6.38.

Note that old (before 2012) btrfs-progs versions will probably fail some operations (e.g. fsck) on filesystems with LZO compression. 

注意:这篇帖子是对下面问到的附加问题“有哪些可用的压缩算法”的回答...所以请不要责怪我。

根据ArchWiki的说法:
引用: 提示:可以在不使用compress挂载选项的情况下,对每个文件启用压缩;只需对文件应用chattr +c。当应用于目录时,它将导致新文件在写入时自动进行压缩。
太好了!上帝保佑BTRFS!
此外,根据BTRFS wiki的说法:
引用: 我能否在不使用compress挂载选项的情况下强制对文件进行压缩? 是的。实用程序chattr支持设置文件属性c,标记inode以压缩新写入的数据。

所以chattr方法是针对单个文件,而btrfs filesystem defragment是针对整个文件夹的文件? - endolith