Подтвердить что ты не робот

Можно ли получить сжатые и несжатые размеры файла в файловой системе btrfs?

Можно ли определить, какой сжатый размер (я предполагаю, что это то, что указано в ls -l), и несжатый размер файлов на btrfs с прозрачное сжатие включено?

4b9b3361

Ответ 1

Запустите btrfs filesystem df /mountpoint.

Пример вывода:

Data: total=2.01GB, used=1.03GB
System, DUP: total=8.00MB, used=4.00KB
System: total=4.00MB, used=0.00
Metadata, DUP: total=1.00GB, used=2.52MB
Metadata: total=8.00MB, used=0.00

Ключевая строка начинается с Data:; used= - сжатый размер, а total= - общий размер, как будто в несжатой файловой системе. Я создал тестовую файловую систему, смонтировал ее с опцией compress_force=zlib и скопировал 1 ГБ нулей в файл в файловой системе; в этой точке линия Data: была Data: total=1.01GB, used=32.53MB (нули вполне сжимаются!). Затем я снова смонтировал файловую систему с отключенным сжатием, скопировал на нее еще один килограмм нулей, и в этот момент строка Data: прочитала Data: total=2.01GB, used=1.03GB.

Как упоминалось выше, ls -l, напротив, показывает несжатый размер.

Ответ 2

Я не могу ответить на файл по файлу, а @catlover2 дал ответ для файловой системы. Но вы должны различать размер блока на диске, а размер в (виртуальной) файловой системе ls и du не может выходить за пределы файловой системы, поэтому они не дают информации о том, сколько блоков диска используется, и @jiliagre --apparent-size здесь бесполезно.

Чтобы лучше проиллюстрировать этот вопрос, я сделал тест с одной файловой системой btrfs файла 23G; сначала несжатый, затем 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 по-прежнему остается без ответа, и, возможно, нам нужно дождаться разработки btrfs (или для его разработки!), чтобы получить соответствующий базовый блок блоков du для особого файла. Было бы очень полезно, я очень расстраиваюсь, когда монтирую btrfs fs со сжатием (без силы), не зная, сжаты ли мои файлы или нет, и на каком уровне.

Ответ 3

есть сторонний инструмент, который может это сделать.

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  

Ответ 4

Размер файла на диске, независимо от типа файловой системы, задается 1 командой du, например:

$ 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 являются расширениями du, специфичными для GNU.

1 Кажется, что btrfs не следует этому правилу. Если это действительно/все еще верно, я понимаю, что это должно считаться ошибкой или, по крайней мере, несоответствие POSIX.

Ответ 5

Я тоже пытался ответить на этот вопрос, и вот что я нашел: du -s и df производят разные числа. Поэтому я сделал несколько тестов:

  • Я поставил тестовый каталог в /home с размером около 3 ТБ. Это частичная копия полного/домашнего каталога с типичным сочетанием документов, текстовых файлов, изображений и программ.

  • Я сжал этот каталог, используя .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%. Также из этой информации я пришел к выводу, что файл test.tar.gz с реальным размером 1592 G, занятый на диске 1595 G. Также я заметил, что использование флага --apparent-size создает незначительную разницу, возможно, из-за округления блока.

Боковое примечание, моя строка fstab для установки этого раздела:

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

Резюме:

Чтобы проверить степень сжатия для всего раздела, используйте две команды:

du -s /home df /home

Затем разделите выходы. Я предполагаю, что мой коэффициент сжатия 25% является типичным результатом, ожидаемым от компрессора zlib.

Ответ 6

Вы можете создать файловую систему 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