LINUX.ORG.RU

BTRFS и место на диске (df и compsize)

 ,


0

1

Здравствуйте, помогите, пожалуйста, разобраться с логикой сжатия в BTRFS - а то что-то я туплю.

У меня стоит Fedora 38 с файловой системой btrfs по умолчанию. Утилита df показывает, что занято 29 Гб на диске.

[m@fedora ~]$ df -h

Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
devtmpfs           4,0M            0  4,0M            0% /dev
tmpfs              7,5G         9,8M  7,5G            1% /dev/shm
tmpfs              3,0G         1,9M  3,0G            1% /run
/dev/nvme0n1p3     232G          29G  202G           13% /
/dev/nvme0n1p3     232G          29G  202G           13% /home
/dev/nvme0n1p2     974M         358M  549M           40% /boot
tmpfs              7,5G         312K  7,5G            1% /tmp
tmpfs              1,5G          15M  1,5G            1% /run/user/1000

В интернете читал, что команда df показывает некорректное значение - подсчитывает размер файлов на уровне ОС и ссылки btrfs на один файл считает за разные файлы, поэтому показывает больше, чем хранится физически на диске.

При этом btrfs fi usage показывает те же 28-29 Гб в Used:

[m@fedora ~]$ sudo btrfs fi usage /

Overall:
    Device size:		 231.88GiB
    Device allocated:		  32.06GiB
    Device unallocated:		 199.82GiB
    Device missing:		     0.00B
    Device slack:		     0.00B
    Used:			  28.56GiB
    Free (estimated):		 201.06GiB	(min: 101.15GiB)
    Free (statfs, df):		 201.06GiB
    Data ratio:			      1.00
    Metadata ratio:		      2.00
    Global reserve:		  82.22MiB	(used: 0.00B)
    Multiple profiles:		        no

Data,single: Size:28.00GiB, Used:26.76GiB (95.57%)
   /dev/nvme0n1p3	  28.00GiB

Metadata,DUP: Size:2.00GiB, Used:923.00MiB (45.07%)
   /dev/nvme0n1p3	   4.00GiB

System,DUP: Size:32.00MiB, Used:16.00KiB (0.05%)
   /dev/nvme0n1p3	  64.00MiB

Unallocated:
   /dev/nvme0n1p3	 199.82GiB

Утилита compsize показывает, что физически (у меня один физический диск) на диске хранится 9.7 Гб данных:

[m@fedora ~]$ sudo compsize -x /

Processed 364368 files, 235685 regular extents (339431 refs), 201866 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL       48%      9.7G          20G          28G       
none       100%      5.7G         5.7G         7.5G       
zstd        27%      4.0G          14G          20G       
prealloc   100%       12K          12K         7.9M 

Вопрос: Что будет, если Disk Usage будет близок к емкости диска (232 Гб)? Допустим, Disk Usage 200 Гб, при этом Referenced 400 Гб, то есть больше емкости самого диска. Такое возможно? Как будет себя вести система, когда с ее точки зрения количество занимаемой памяти превысит емкость диска? Что будет отображаться в df? Это можно как-то проверить - например, запустить Live Fedora на небольшой флешке и скопировать несколько файлов - какие файлы взять, чтобы сжатие было высоким? Может есть какая-то статья с примерами такого поведения?

Может у кого-то есть ссылка на то, о чем я спрашиваю? - сам нагуглить не смог

Допустим, Disk Usage 200 Гб, при этом Referenced 400 Гб, то есть больше емкости самого диска. Такое возможно?

Возможно - за счет рефлинков. Т.е. есть файл 4ГБ плюс ссылка на него - «referenced 8G». Затем, если поменяется 128 МБ - будет disk usage 4.1G, а referenced, если правильно понимаю, столько, сколько осталось неизменённым.

Как будет себя вести система, когда с ее точки зрения количество занимаемой памяти превысит емкость диска?

Позволит писать новые данные вплоть до реального заполнения.

Что будет отображаться в df?

Полная хрень.

Это можно как-то проверить - например, запустить Live Fedora на небольшой флешке и скопировать несколько файлов - какие файлы взять, чтобы сжатие было высоким? Может есть какая-то статья с примерами такого поведения?

И флешку не нужно. Достаточно создать файл размером в несколько гигабайт (fallocate), отформатировать его в btrfs, подмониторвать куда-нибудь - и экспериментировать.

Может у кого-то есть ссылка на то, о чем я спрашиваю? - сам нагуглить не смог

Официальная вики Btrfs, например.

token_polyak ★★★★
()
Последнее исправление: token_polyak (всего исправлений: 3)
Ответ на: комментарий от token_polyak

Сделал, как вы предлагаете, спасибо. Создал файл 1 Гб и смортировал его в btrfs. Внутри этого диска (loop0) создал 2 файла по 100 Мб и скопировал их несколько раз.

В основной fs у меня в compsize Referenced 29 Гб, DIsk Usage 9.7 Гб и в df 29 Гб, а в этой экспериментальной fs получилось, что в compsize Referenced 1 Гб, в Disk Usage 200 Мб и в df 200 Мб занято. Почему здесь df и btrfs fi usage увидели реальное используемое место?

Я ожидал, что как и в основной fs df посчитает скопированные файлы за отдельные экземпляры независимые и покажет, что занято все пространство

[m@fedora VHD]$ df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
devtmpfs           4,0M            0  4,0M            0% /dev
tmpfs              7,5G          11M  7,5G            1% /dev/shm
tmpfs              3,0G         1,9M  3,0G            1% /run
/dev/nvme0n1p3     232G          29G  202G           13% /
/dev/nvme0n1p3     232G          29G  202G           13% /home
/dev/nvme0n1p2     974M         358M  549M           40% /boot
tmpfs              7,5G         316K  7,5G            1% /tmp
tmpfs              1,5G          15M  1,5G            1% /run/user/1000
/dev/loop0         1,2G         205M  863M           20% /mnt/VHD
[m@fedora VHD]$ sudo btrfs fi usage /mnt/VHD
Overall:
    Device size:		   1.17GiB
    Device allocated:		 392.00MiB
    Device unallocated:		 808.00MiB
    Device missing:		     0.00B
    Device slack:		     0.00B
    Used:			 200.75MiB
    Free (estimated):		 864.00MiB	(min: 460.00MiB)
    Free (statfs, df):		 863.00MiB
    Data ratio:			      1.00
    Metadata ratio:		      2.00
    Global reserve:		   3.50MiB	(used: 0.00B)
    Multiple profiles:		        no

Data,single: Size:256.00MiB, Used:200.00MiB (78.12%)
   /dev/loop0	 256.00MiB

Metadata,DUP: Size:60.00MiB, Used:368.00KiB (0.60%)
   /dev/loop0	 120.00MiB

System,DUP: Size:8.00MiB, Used:16.00KiB (0.20%)
   /dev/loop0	  16.00MiB

Unallocated:
   /dev/loop0	 808.00MiB
[m@fedora VHD]$ sudo compsize -x /mnt/VHD
Processed 10 files, 2 regular extents (10 refs), 0 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL      100%      200M         200M        1000M       
none       100%      200M         200M        1000M

MaksimIT
() автор топика
Ответ на: комментарий от token_polyak

Если на одном разделе, то нет, сейчас reflink по умолчанию уже во всех дистрибутивах после обновления linuxutils, а в Fedora вообще давным-давно, они даже патчили пакеты.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)

Кстати, сходу не заметил.

В интернете читал, что команда df показывает некорректное значение - подсчитывает размер файлов на уровне ОС и ссылки btrfs на один файл считает за разные файлы, поэтому показывает больше, чем хранится физически на диске.

Это не совсем верно: так ведёт себя du, вызывая stat для каждого файла по отдельности, а вот df вызывает statfs и сообщает о занятом-свободном месте так, как его видит драйвер ФС - что, собственно, и указано в выводе btrfs fi usage.

token_polyak ★★★★
()
Последнее исправление: token_polyak (всего исправлений: 1)

какие файлы взять, чтобы сжатие было высоким?

Возьми /dev/zero, последовательные нули жмутся лучше некуда. Например, чтобы создать файл размером 1000 MB:

$ dd if=/dev/zero of=file bs=1M count=1000
Kron4ek ★★★★★
()

У тебя есть файл размером 1 гиг. Ты сделал снапшот, а потом дописал 128 MiB, и вот referenced по идее размер 1 GiB + 1.1 GiB, те 2.1 GiB, на диске же реально хранится 1.1 GiB.

df если встретит «папку» со снапшотами, то по-честному сложит размер всех файлов, показывая фантастические цифры типа того referenced

Processed 26780990 files, 806548 regular extents (15021548 refs), 17046095 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL       69%       66G          95G         1.5T       
none       100%       51G          51G         982G       
zstd        33%       14G          43G         593G       
prealloc   100%      302M         302M          11G

У меня раздел 300000 MiB (~292 GiB). Видишь? 1.5T на него явно не влезут.

Сжати указывается при монтировании и применяется только к созданным файлам после его включения, поэтому имеет смсыл разок копировать все файлы в новый subvolume, чтобы сжати заработало. Оно, кстати, не работает с архивами, png-картинками и видео, те с уже сжатыми данными, а поэтому бесполезно для чего либо кроме гигабайтных логов или исходников, таких данных ес-но у обычного юзверя мало, а у меня только исходников яндекса 40 гигов

uwuwuu
()
Последнее исправление: uwuwuu (всего исправлений: 3)
Ответ на: комментарий от token_polyak

Спасибо, теперь более понятно стало, почему числа совпадали у df и btrfs fi usage.

Да, du показала, что занято 45 Гб, то есть сжатие все же есть, просто compsize почему-то его некорректно показывает

MaksimIT
() автор топика
Ответ на: комментарий от MaksimIT

Все, я разобрался! У меня установлена Fedora на весь диск с параметрами по-умолчанию, где и / и /home смонтированы на один и тот же диск, однако как /, так и /home - это отдельные subvolumes в btrfs у меня. Когда я запускал compsize -x /, то он игнорировал /home сабвольюм. А при запуске df показывал место для всего, включая и / и /home точки монтирования

На диске был фильм 10 Гб, я его удалил уже, поэтому размер на 10 Гб меньше стал. Теперь df -h показывает 19 Гб:

m@fedora Загрузки]$ df -h
Файловая система Размер Использовано  Дост Использовано% Cмонтировано в
devtmpfs           4,0M            0  4,0M            0% /dev
tmpfs              7,5G         2,2M  7,5G            1% /dev/shm
tmpfs              3,0G         1,9M  3,0G            1% /run
/dev/nvme0n1p3     232G          19G  212G            9% /
/dev/nvme0n1p3     232G          19G  212G            9% /home
tmpfs              7,5G          28K  7,5G            1% /tmp
/dev/nvme0n1p2     974M         358M  549M           40% /boot
tmpfs              1,5G         7,3M  1,5G            1% /run/user/1000
/dev/nvme0n1p3     232G          19G  212G            9% /run/BtrfsAssistant/2e094c7e-8061-4341-9c7f-f148009dd2ac

Compsize для 2 подтомов показывает суммарно использование диска около 16.7 Гб (9.9 + 6.8):

[m@fedora Загрузки]$ sudo compsize -x /
Processed 385172 files, 240549 regular extents (344905 refs), 219184 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL       48%      9.9G          20G          28G       
none       100%      5.8G         5.8G         7.6G       
zstd        27%      4.0G          14G          21G       
prealloc   100%       12K          12K          16M       
[m@fedora Загрузки]$ sudo compsize -x /home
Processed 273858 files, 129299 regular extents (135753 refs), 183176 inline.
Type       Perc     Disk Usage   Uncompressed Referenced  
TOTAL       69%      6.8G         9.8G         9.9G       
none       100%      5.3G         5.3G         5.3G       
zstd        33%      1.5G         4.5G         4.5G       
prealloc   100%      6.7M         6.7M          12M  

И еще 2 Гб - метаданные:

[m@fedora ~]$ sudo btrfs fi df /
Data, single: total=29.00GiB, used=16.59GiB
System, DUP: total=32.00MiB, used=16.00KiB
Metadata, DUP: total=2.00GiB, used=811.12MiB
GlobalReserve, single: total=82.44MiB, used=0.00B

А вот du показывает 32 Гб по системе:

[m@fedora ~]$ sudo du -smh /
du: невозможно получить доступ к '/proc/34384/task/34384/fd/4': Нет такого файла или каталога
du: невозможно получить доступ к '/proc/34384/task/34384/fdinfo/4': Нет такого файла или каталога
du: невозможно получить доступ к '/proc/34384/fd/3': Нет такого файла или каталога
du: невозможно получить доступ к '/proc/34384/fdinfo/3': Нет такого файла или каталога
du: невозможно получить доступ к '/run/user/1000/doc': Отказано в доступе
32G	/

Вот сейчас вроде все складывается примерно.

Из-за недостатка базовых знаний возникло недопонимание. Всем спасибо за помощь!

MaksimIT
() автор топика