Ви повинні поглянути на ( 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 (як правило), всі фактичні дані в новоствореному підпункті, який містить знімок, надсилаються до джерела знімка. Тільки коли файл змінюється або замінюється у джерелі, він вказує на інший вміст (розширення). Це дуже важко оцінити, скільки місця буде фактично звільнено, якщо підтомник буде видалений, оскільки вам доведеться враховувати весь простір, який спільно використовується з іншими підпунктами.