如何在 btrfs 上打开单个文件的压缩?

如何在 btrfs 上打开单个文件的压缩?

我正在使用 GNU 生成 3 TB 驱动器映像ddrescue,并意识到它对于目标驱动器来说太大了(因为空白空间被 0xAA 而不是 0x00 填充,所以我不使用稀疏输出文件,而是使用稀疏输出文件)需要实际压缩)。

输出文件位于 btrfs 文件系统上,该系统支持按文件压缩,但通过哪种方法呢?

  1. https://wiki.archlinux.org/index.php/Btrfs#压缩说:

要将压缩应用于现有文件,请使用该命令,其中 是,或。例如,要使用 zstd 重新压缩整个文件系统,请运行以下命令:btrfs filesystem defragment -calgalgzliblzozstd

  # btrfs filesystem defragment -r -v -czstd /

这会重新压缩现有文件,但似乎是针对文件文件夹,而不是单个文件?

  1. 它还说:

提示:也可以在不使用 mount 选项的情况下为每个文件启用压缩compress;这样做适用 chattr +c于该文件。当应用于目录时,它将导致新文件在出现时自动压缩。

不过,尚不清楚这是否会重新压缩现有文件。

  1. https://btrfs.wiki.kernel.org/index.php/Compression#Can_I_force_compression_on_a_file_without_using_the_compress_mount_option.3F

btrfs property set <file> compression <zlib|lzo|zstd>使用will 设置文件的压缩属性力量使用指定的算法对该文件进行压缩。

这似乎是为了强制压缩通常不会被压缩的文件,因为它们包含不太可压缩的数据?

我想要使​​用哪个命令将整个现有文件转换为(默认 LZO)压缩,并继续压缩将来写入该文件的任何更多数据,而不更改卷上其他文件的压缩?

答案1

# btrfs filesystem defragment -r -v -czstd /

这会重新压缩现有文件,但似乎是针对文件文件夹,而不是单个文件?

它也适用于单个文件。

(对于目录,您需要该-r标志,否则它将对该目录所属的子卷的元数据进行碎片整理)。

chattr +c

不过,尚不清楚这是否会重新压缩现有文件。

它不会。

btrfs property set <file> compression <zlib|lzo|zstd>

这似乎是为了强制压缩通常不会被压缩的文件,因为它们包含不太可压缩的数据?

它禁用检测文件是否可压缩并无论如何压缩它的机制。
我相信它只会存储压缩文件,如果它至少在某种程度上是可压缩的,更具体地说,如果压缩数据不大于原始 IIRC。

另请注意,该检测机制不是很复杂,有时也会禁用可压缩文件的压缩。

我想要使​​用哪个命令将整个现有文件转换为(默认 LZO)压缩,并继续压缩将来写入该文件的任何更多数据,而不更改卷上其他文件的压缩?

btrfs filesystem defragment -clzo /path/to/file

(注意:这将强制压缩文件)

相关内容