Можно ли определить, какой сжатый размер (я предполагаю, что это то, что указано в ls -l
), и несжатый размер файлов на btrfs с прозрачное сжатие включено?
Можно ли получить сжатые и несжатые размеры файла в файловой системе btrfs?
Ответ 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
- С этим файлом, существующим в файловой системе, я сделал это:
# 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%. Также из этой информации я пришел к выводу, что файл 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