Очищення невикористаного простору за допомогою нулів (btrfs)


10

Як очистити невикористаний простір нулями? (Я прошу інструмент для файлової системи btrfs )

Я шукаю щось розумніше

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Як і FSArchiver шукає "використаний простір" і ігнорує невикористаний, але протилежний сайт.

Мета: Я хотів би стиснути зображення розділів, тому наповнювати невикористаний простір нулями настійно рекомендується.

Btw. Для ext3, ext4: очищення невикористаного простору з нулями (ext3, ext4) . Тут я прошу btrfs

Уточнення "розумнішого алгоритму": Оскільки я бачу, що "розумніший алгоритм" призводить до плутанини, тут я нарешті вирішив додати рядок про нього. Шановний читачу, будь ласка, подумайте про файлову систему як структуру даних. Для спрощення уявимо собі самоврівноваження карти тримання червоно-чорного дерева, яка використовується як масив асоціації key-> value, де значення - цілі числа. Мета - очистити всі негативні значення нулями. Алгоритм "не розумний" буде повторювати його і додасть ключ: пара значень до нової карти (з можливою зміною мінус у нуль). Розумний алгоритм просто виявить місця, де зберігаються негативні значення, і очистить їх на місці .


2
Ви спробували sfillпропозицію ? Схоже, для цього не потрібен extX.
Кевін

1. Я знаю, що ви можете заповнити наявні файли нулями з клаптиком, але це, мабуть, не так, правда? 2.Як ви робите ці зображення? Можливо, ви можете зробити там усікання?
Златко

@kevin: саме тому я розмістив відповідь sfill в оригінальному запитанні. Я рідко використовую файлові системи ext2,3,4, тому я вважаю, що утиліти, які працюють лише на ext *, дратують марно.
cas

Мені потрібно щось "розумне". Щось, що заповнює порожній простір нулями, не торкаючись інших місць, я маю на увазі, не впливаючи на внутрішні структури даних, як-от B-Trees (Якщо вам цікаво, я написав питання "стиснення", але мені це потрібно також для інших цілей, як де-дублювання, аналіз та дослідження зображень)
Grzegorz Wierzowiecki

просто використовуйте truncateта / абоfallocate
mikeserv

Відповіді:


4

Ось модифікований і значно розширений репост моєї відповіді на ваше попереднє запитання:

sfillз secure-deleteпакета можна робити те, що ти хочеш.

На відміну від zerofree (який працює лише з файловими системами ext2, ext3 та ext4), sfill працюватиме з будь-якою файловою системою.

напр

sfill -l -l -z /mnt/X

Домашня сторінка sfill / secure-delete начебто зникла, але вона упакована для debian та ubuntu. ймовірно, інші дистрибутиви теж. якщо вам потрібен вихідний код, його можна знайти в архівах debian, якщо ви не можете його знайти більше ніде.

ПРИМІТКА: sfill працює лише у змонтованій файловій системі. Якщо ви заповнюєте нульові файли зображень з хост-системи, а не з VM, вам потрібно буде встановити зображення fs на хості. Точний метод залежить від типу файлу зображення (наприклад, qcow2 або raw).

Монтаж «сирих» зображень простий і простий. Просто використовуйте kpartxфайл зображення для створення пристрою циклу зворотного зв'язку, і / dev / mapper / записи для кожного розділу можуть бути змонтовані окремо.

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

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

ПРИМІТКА: передбачається, що кожен розділ на зображенні може бути встановлений. вірно в моєму випадку використання (зображення hd-фрідесона з одним розділом). Не відповідає дійсності, якщо один з розділів є, скажімо, свопом простору. Виявлення таких розділів та використання dd для нульового розміщення розділів залишається як вправа для читача :)

Цей метод або його варіант також повинен працювати для обсягів LVM.

Якщо ваші зображення є qcow, ви можете використовувати qemu-nbdінструмент із qemu-utilsпакета, який подасть файл зображення та його розділи як пристрої мережевого блоку - наприклад / dev / nbd0 / dev / ndb0p1 - який може бути використаний аналогічно / пристрої для розробників / картографів вище.

Можливо, простіше і менше клопотів (але забирає більше часу) використовувати qemu-imgдля перетворення з qcow в сировину, використовувати метод для сировини вище, а потім перетворити модифікований вихідний образ назад в стислий qcow2. Це, ймовірно, призведе до трохи менших зображень, ніж використання qemu-nbd, оскільки ви будете стискати нове зображення qcow2 під час його створення.


1
Я маю на увазі те, що це не вважається «розумним» способом заповнення невикористаного простору нулями. Це найбільш очевидний, типовий спосіб зробити це. Я не запитую про подібні речі.
Grzegorz Wierzowiecki

1
Опишіть, будь ласка, "розумний" алгоритм, який не характерний для певного сімейства файлових систем (наприклад, zerofill призначений для ext2 / 3/4). Ви хотіли, щоб програма могла виконати цю роботу. Ви не сказали, що це теж має бути магічним.
cas

1
і, дійсно, якщо файлова система не використовується (тому що, наприклад, вона встановлена ​​на хості для нульового заповнення), що має значення, наскільки розумним є алгоритм? Поповнення метаданих fs, що шукає порожніх секторів, не буде швидшим чи кращим, ніж просто написати величезну заливку, повну NULs ... сама файлова система вже достатньо розумна, щоб з’ясувати, де порожній простір.
cas

2
З одного боку, для ваших потреб цього достатньо - тому моє запитання вже містить фрагмент коду з цим рішенням - тож ваша відповідь не дає нічого нового. З іншого боку, мої потреби вимагають того, що я вказав, тому що я хочу стерти невикористаний простір нулями, не змінюючи внутрішніх структур (наприклад, перебалансування "Танцюючих B-Дерев" або іншого типу структури даних (наприклад, для аналізу та дедуплікації) цілі)
Grzegorz Wierzowiecki

2
@cas - Я думаю, ти пропускаєш той факт, що заповнення нуля є важливим кроком до ущільнення віртуальних жорстких дисків у віртуальних машинах. Якщо у вас диск з розширенням на 500 ГБ, з 10 ГБ файлів і 10 ГБ «порожнього» місця (тобто видалених файлів), запуск наївного «гігантського файлу з нульовим файлом» займе FAR довше, і зажадайте, щоб VHD розгорнувся до повних 500 ГБ. Б'юсь у заклад, що ОП передбачає, що і утиліта повинна бути специфічною для FS.
Підроблена назва

3

Правильний та "розумний" спосіб очищення вільного простору використовує:

fstrim /mountpoint

Використовуйте це у змонтованій файловій системі.

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

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

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