Скільки місця було б звільнено, видаливши підтомник btrfs?


11

Чи є спосіб обчислити, скільки місця я б звільнив, якби видалити один (або кілька) підтомників на диску Btrfs (не фактично їх видаляючи)? Я знаю, що "в даний час немає коду, який би зробив для вас обчислення" , але як би ви це зробили?

Мені також цікаво, чому вони кажуть, що це буде так повільно? Насправді, як видалити підпункт та запитати про вільний простір дуже швидко, на мій досвід, чому б робити те саме, що гіпотетично було набагато повільніше?


2
Сподіваюся, ви знаєте, що btrfs.wiki.kernel.org/index.php/Btrfs_mailing_list може бути кращим місцем для запитання про внутрішню роботу btrfs (або будь-якого іншого компонента ядра). Якщо ви отримаєте відповідь, будь ласка, опублікуйте її також тут. Мені цікаво сама відповідь.
Адам Ріцковський

1
Ви кажете: "Як фактично видалити підпункт та запитати про вільний простір, на мій досвід дуже швидко". Коли ви видаляєте підтем, це дійсно просто маркування , що підтем для видалення, він тільки фактично звільняє ці блоки , коли він отримує час (яке не є то , що «немає фіксації» означає повідомлення , коли ви робите це), так немає, видалення не обов'язково дуже швидко.
etskinner

Відповіді:


3

Ви повинні поглянути на ( btrfs quotaта btrfs qgroupsквотні групи).

В основному qgroupsвиконайте саме те, що ви просили, вони відстежують, скільки місця виділяється підпунктами. Щоб увімкнути qgroupфункціональність для btrfsфайлової системи, вам потрібно

# btrfs quota enable /path/to/btrfs/filesystem

Однак, перш ніж це зробити, слід попередити, що це запускає повне перерахування qgroupданих, що потребує певного часу, особливо для великих файлових систем з багатьма підпунктами. Цей процес працює асинхронно у фоновому режимі. Ви вже можете перевірити стан qgroupsс

# btrfs qgroup show /path/to/btrfs/filesystem

Це дасть вам такий вихід:

WARNING: rescan is running, qgroup data may be incorrect
qgroupid         rfer         excl
--------         ----         ----
0/5         843.69GiB     61.91MiB
0/4881      811.06GiB      9.34GiB
0/7990      867.32GiB    329.91MiB
0/8400      867.17GiB     37.64MiB

(Попередження в першому рядку існує до тих пір, поки Rescan ще працює.)

Btrfs автоматично створює qgroupдля кожного підтомника. У цьому випадку є три підпункти з ідентифікаторами підпункту 4881, 7990 та 8400. Частина перед прямою косою рисою є рівнем qgroup. Кожен підтомник qgroupзнаходиться на рівні 0. Крім того, є спеціальний qgroupрівень 0, який завжди має ID 5 і відповідає кореню файлової системи btrfs.

Для кожного qgroupвищенаведеного результату видно, на скільки місця посилається. Це означає, що відповідний підтомник містить файли, загальний розмір яких дорівнює показаному номеру.

Однак, завдяки знімкам та природі копіювання під час запису підбломів btrfs можливе спільне використання файлів. Це означає, що на вміст (або власне розширення) файлів може посилатися більше ніж один підпункт. Це виражається другим числом, яке показує, скільки місця виділяється виключно для кожного підпункту та не поділяється на жоден інший підпункт. У випадку, якщо ви видалите підтомник, це буде фактично звільнений простір.

Якщо ви хочете дізнатися, скільки місця буде звільнено, якщо ви видалите кілька підпунктів, ви можете використовувати вищезгадані рівні. qgroupsякі організовані в ієрархії і групах на верхніх рівнях (вище 0) агрегувати інформацію про більш низьких рівнях.

Таким чином, щоб дізнатися, скільки місця буде звільнено, якщо підпункти 4881 та 7990 (у наведеному вище прикладі) буде видалено, створіть нове qgroup(довільно з ID 0, але ви можете вибрати все, що вам тут подобається) на рівні 1 з

# btrfs qgroup create 1/0 /path/to/btrfs/filesystem

Потім призначте новостворене qgroupяк батьківство до qgroupsпідпунктів, з якими потрібно видалити

# btrfs qgroup assign 0/4881 1/0 /path/to/btrfs/filesystem
# btrfs qgroup assign 0/7990 1/0 /path/to/btrfs/filesystem

Це призведе до повторного сканування інформації про квоти, яка може зайняти деякий час. Якщо це закінчено, і ви зараз видаєте

# btrfs qgroup show -p /path/to/btrfs/filesystem

ви отримуєте такий результат:

qgroupid         rfer         excl parent
--------         ----         ---- ------
0/5           1.38TiB      2.51GiB ---
0/4881        1.11TiB     10.86GiB 1/0
0/7990        1.23TiB    502.41MiB 1/0
0/8400        1.34TiB      1.69GiB 1/0
1/0           1.51TiB    132.23GiB ---

(Я додав -pпрапор, щоб додати parentстовпець до виводу, який показує відносини батько / дитина qgroups.)

Тепер рядок з qgroup 1/0розповідає про те, на скільки місця посилаються обидва підтомника, які ви хочете видалити, і, що ще важливіше, він розповідає, скільки місця виділяється виключно ними . Це кількість місця, яке буде звільнено, якщо ви видалите обидва підпункти.

Мені також цікаво, чому вони кажуть, що це буде так повільно?

Це пов’язано з характером btrfs, який записується під час запису, разом із знімками. Якщо ви створюєте знімок у btrfs (як правило), всі фактичні дані в новоствореному підпункті, який містить знімок, надсилаються до джерела знімка. Тільки коли файл змінюється або замінюється у джерелі, він вказує на інший вміст (розширення). Це дуже важко оцінити, скільки місця буде фактично звільнено, якщо підтомник буде видалений, оскільки вам доведеться враховувати весь простір, який спільно використовується з іншими підпунктами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.