web-dev-qa-db-ja.com

btrfsで単一ファイルの圧縮をオンにする方法は?

私は3 TBドライブイメージGNU ddrescueを生成しています。ドライブ(空のスペースは0x00ではなく0xAAで埋められるため、スパース出力ファイルを使用する代わりに、実際の圧縮が必要です)。

出力ファイルは、ファイルごとの圧縮をサポートするbtrfsファイルシステムにありますが、どの方法ですか?

  1. https://wiki.archlinux.org/index.php/Btrfs#Compression 言う:

既存のファイルに圧縮を適用するには、btrfs filesystem defragment -calgコマンドを使用します。ここで、algzliblzo、またはzstdのいずれかです。たとえば、zstdを使用してファイルシステム全体を再圧縮するには、次のコマンドを実行します。

  # btrfs filesystem defragment -r -v -czstd /

これは既存のファイルを再圧縮しますが、個々のファイルではなく、ファイルのフォルダー用のようです。

  1. それはまた言う:

ヒント: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>を使用してファイルに圧縮プロパティを設定すると  指定されたアルゴリズムを使用してそのファイルで使用される圧縮。

これは、あまり圧縮できないデータが含まれているために通常は圧縮されないファイルを強制的に圧縮するためのもののようですか?

既存のファイル全体を(デフォルトのLZO)圧縮に変換し、ボリュームにある他のファイルの圧縮を変更せずに、今後書き込まれるデータをさらに圧縮したいコマンドはどれですか。

1
endolith
# 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

(注:これにより、ファイルが強制的に圧縮されます)

2
Atemu