我正在使用 GNU 生成 3 TB 驱动器映像ddrescue
,并意识到它对于目标驱动器来说太大了(因为空白空间被 0xAA 而不是 0x00 填充,所以我不使用稀疏输出文件,而是使用稀疏输出文件)需要实际压缩)。
输出文件位于 btrfs 文件系统上,该系统支持按文件压缩,但通过哪种方法呢?
要将压缩应用于现有文件,请使用该命令,其中 是,或。例如,要使用 zstd 重新压缩整个文件系统,请运行以下命令:
btrfs filesystem defragment -calg
alg
zlib
lzo
zstd
# btrfs filesystem defragment -r -v -czstd /
这会重新压缩现有文件,但似乎是针对文件文件夹,而不是单个文件?
- 它还说:
提示:也可以在不使用 mount 选项的情况下为每个文件启用压缩
compress
;这样做适用chattr +c
于该文件。当应用于目录时,它将导致新文件在出现时自动压缩。
不过,尚不清楚这是否会重新压缩现有文件。
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
(注意:这将强制压缩文件)