これを行うことができるサードパーティのツールがあります。
https://github.com/kilobyte/compsize
使用法:
ayush@devbox:/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
ファイルごとに回答することはできません。@ catlover2がファイルシステムに回答しました。ただし、ディスク上のブロックサイズと(仮想)ファイルシステム内のサイズを区別する必要があります。ls
とdu
はファイルシステムを超えることはできないため、ディスクブロックの数に関する情報は提供されません。が使用され、@ 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をマウントすると、非常にイライラします。
Ubuntu-18の場合
apt install btrfs-compsize
compsize /mnt/btrfs-partition
ファイルシステムの種類に関係なく、ファイルのディスク上のサイズが指定されます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不適合 と見なされるべきです。
私もこの質問に答えようとしていましたが、次のことがわかりました。du -s
とdf
は異なる数値を生成します。だから私はいくつかのテストをしました:
/ homeに約3TBのサイズのテストディレクトリを置きました。これは、/ homeディレクトリ全体の部分的なコピーであり、ドキュメント、テキストファイル、画像、およびプログラムが一般的に混在しています。
.tar.gzを使用してこのディレクトリを圧縮した結果、サイズのファイルが作成されました
# du -s ./test.tar.gz 1672083116 ./test.tar.gz
# 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%
圧縮率があります
# 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コンプレッサーに期待される典型的な結果だと思います。
ファイル内に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