web-dev-qa-db-ja.com

btrfsファイルシステムでファイルの圧縮サイズと非圧縮サイズを取得することは可能ですか?

btrfs ファイルシステム上のファイルの圧縮サイズ(ls -lでリストされているものだと思います)と非圧縮サイズ( 透過圧縮 )を判別することは可能ですか?有効ですか?

22
gandalf3

これを行うことができるサードパーティのツールがあります。

https://github.com/kilobyte/compsize

使用法:

[email protected]:/code/compsize$ Sudo compsize /opt
Processed 54036 files, 42027 regular extents (42028 refs), 27150 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
Data        82%      5.3G         6.4G         6.4G       
none       100%      4.3G         4.3G         4.3G       
zlib        37%      427M         1.1G         1.1G       
lzo         56%      588M         1.0G         1.0G  
18
Ayush

ファイルごとに回答することはできません。@ catlover2がファイルシステムに回答しました。ただし、ディスク上のブロックサイズと(仮想)ファイルシステム内のサイズを区別する必要があります。lsduはファイルシステムを超えることはできないため、ディスクブロックの数に関する情報は提供されません。が使用され、@ jiliagre --apparent-sizeここでは役に立たない。

この質問をわかりやすく説明するために、単一の23Gファイルbtrfsファイルシステムでテストを行いました。最初に非圧縮、次にlzo圧縮。サンプルファイルは仮想マシンイメージであり、圧縮レベルは0.5のみです。 df、およびbtrfs filesystem df圧縮を表示できます。

$   lvcreate vg0 test_btrfs -L 30G
Logical volume "test_btrfs" created
$ mkfs.btrfs /dev/vg0/test_btrfs
...
fs created label (null) on /dev/vg0/test_btrfs
    nodesize 16384 leafsize 16384 sectorsize 4096 size 30.00GiB
$ mount /dev/vg0/test_btrfs /tmp/test_btrfs
$ btrfs filesystem df /tmp/test_btrfs
Data, single: total=8.00MiB, used=256.00KiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=1.00GiB, used=112.00KiB
Metadata, single: total=8.00MiB, used=0.00
$ cp bigfile /tmp/test_btrfs
$ btrfs filesystem df /tmp/test_btrfs
Data, single: total=24.01GiB, used=22.70GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=1.00GiB, used=23.64MiB
Metadata, single: total=8.00MiB, used=0.00
$ btrfs filesystem df /tmp/test_btrfs
... unchanged!
$ cd /tmp/test_btrfs/
$ ls -l bigfile
-rw------- 1 root root 24367940096 May  4 15:03 bigfile
$ du -B1 --apparent-size bigfile
24367940096 bigfile
$ du -B1 bigfile
24367943680 bigfile
$ btrfs filesystem defragment -c bigfile
$ ls -l bigfile
-rw------- 1 root root 24367940096 May  4 15:03 bigfile
$ du -B1 --apparent-size bigfile
24367940096 bigfile
$ du -B1 bigfile
24367943680 bigfile
$ btrfs filesystem df /tmp/test_btrfs
Data, single: total=24.01GiB, used=12.90GiB
System, DUP: total=8.00MiB, used=16.00KiB
System, single: total=4.00MiB, used=0.00
Metadata, DUP: total=1.00GiB, used=39.19MiB
Metadata, single: total=8.00MiB, used=0.00
$ df -BG /tmp/test_btrfs
Filesystem                 1G-blocks  Used Available Use% Mounted on
/dev/mapper/vg0-test_btrfs       30G   13G       16G  47% /tmp/test_btrfs

@ gandalf3の質問にはまだ回答がなく、適切な基になるディスクブロックdu forを取得するには、btrfsの開発を待つ(または開発を支援する)必要があるかもしれません。独特のファイル。ファイルが圧縮されているかどうか、どのレベルで圧縮されているかわからない圧縮(forceなし)でbtrfs fsをマウントすると、非常にイライラします。

7
marcz

Ubuntu-18の場合

apt install btrfs-compsize
compsize /mnt/btrfs-partition
2
Dmytro Gierman

ファイルシステムの種類に関係なく、ファイルのディスク上のサイズが指定されます1duコマンドによる例:

$ du -h *
732K    file
512 file1
4.0M    file2
$ du -B1 *
749568  file
512 file1
4091904 file2

ディスク上のサイズは、ファイルのサイズにメタデータのサイズを加えたものに等しく、ファイルシステムのブロックサイズに丸められます。非圧縮ファイルは通常、実際の(バイト数)サイズよりもディスクサイズがわずかに大きくなります。

すでに述べたように、非圧縮サイズはls -lで示されます。 du--apparent-size optionで報告することもできます。

$ du --apparent-size -h *
826K    file
64M file1
17M file2
$ du --apparent-size -B 1  *
845708  file
67108864    file1
16784836    file2

-B1--apparent-sizeはGNU特定のdu拡張子であることに注意してください。

1btrfsはこのルールに従わないようです。これが本当に/まだ真実である場合、私の理解では、バグまたは少なくとも POSIX不適合 と見なされるべきです。

2
jlliagre

私もこの質問に答えようとしていましたが、次のことがわかりました。du -sdfは異なる数値を生成します。だから私はいくつかのテストをしました:

  1. / homeに約3TBのサイズのテストディレクトリを置きました。これは、/ homeディレクトリ全体の部分的なコピーであり、ドキュメント、テキストファイル、画像、およびプログラムが一般的に混在しています。

  2. .tar.gzを使用してこのディレクトリを圧縮した結果、サイズのファイルが作成されました

# du -s ./test.tar.gz 1672083116 ./test.tar.gz

  1. このファイルがファイルシステムに存在するので、私はこれを行いました:

# du -s /home 11017624664 /home

# du --apparent-size -s /home 11010709168 /home

# df /home Filesystem 1K-blocks Used Available Use% Mounted on /dev/md2 31230406656 9128594488 22095200200 30% /home

つまり、((11017624664/(1024**2))/(9128594488/(1024**2))-1)*100 = 20%圧縮率があります

  1. それから私はこのファイルを削除し、これを手に入れました:

# du -s /home 9348284812 /home

# du --apparent-size -s /home 9340957158 /home

# df /home Filesystem 1K-blocks Used Available Use% Mounted on /dev/md2 31230406656 7455549036 23764949364 24% /home

25%の圧縮率をもたらします。また、この情報から、実際のサイズ1592Gのtest.tar.gzファイルがディスク1595Gで占有されていると結論付けました。また、--apparent-sizeフラグを使用すると、おそらくブロックサイズの丸めが原因で、わずかな違いが生じることにも注意しました。

ちなみに、このパーティションをマウントするための私のfstab行は次のとおりです。

UUID=be6...07fe /home btrfs defaults,compress=zlib 0 2

概要:

パーティション全体の圧縮率を確認するには、次の2つのコマンドを使用します。

du -s /home df /home

次に、出力を分割します。私の25%の圧縮率は、zlibコンプレッサーに期待される典型的な結果だと思います。

1
cosurgi

ファイル内にBtrfsファイルシステムを作成してマウントし、そこにファイルをコピーしてdfを実行できます。

$ dd if=/dev/zero of=btrfs.data size=1M count=1K
$ mkdir btrfs
$ mount btrfs.data btrfs -o compress
... copy the files to ./btrfs
$ sync
$ cd btrfs
$ btrfs filesystem df .

17MiBから5MiBに圧縮された単一ファイルの例:

$ cd btrfs
$ ls -l
-rwx------ 1 atom atom 17812968 Oct 27  2015 commands.bin
$ btrfs filesystem df .
Data, single: total=1.01GiB, used=5.08MiB
System, DUP: total=8.00MiB, used=16.00KiB
Metadata, DUP: total=1.00GiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B
1
atomsymbol