Wyczyść nieużywane miejsce zerami (btrfs)

10

Jak wyczyścić nieużywane miejsce zerami? (Proszę o narzędzie do systemu plików btrfs )

Szukam czegoś mądrzejszego niż

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

Podobnie jak FSArchiver szuka „zużytej przestrzeni” i ignoruje nieużywaną, ale przeciwną stronę.

Cel: Chciałbym skompresować obrazy partycji, więc wysoce zalecane jest wypełnienie nieużywanego miejsca zerami.

Btw. Dla ext3, ext4: Wyczyść nieużywane miejsce zerami (ext3, ext4) . Tutaj proszę o btrfs

Wyjaśnienie „inteligentniejszego algorytmu”: Jak widzę, że „inteligentniejszy algorytm” prowadzi do zamieszania, tutaj w końcu postanowiłem dodać linię na ten temat. Drogi czytelniku, pomyśl o systemie plików jako o strukturze danych. Dla uproszczenia wyobraźmy sobie samoczynnie równoważącą się czerwono-czarną mapę trzymania drzewa, która jest używana jako klucz asocjacyjny-> tablica wartości, gdzie wartości są liczbami całkowitymi. Celem jest usunięcie wszystkich wartości ujemnych zerami. Algorytm „nie inteligentny” będzie się nad nim powtarzał i doda klucz: pary wartości do nowej mapy (z ewentualną zmianą wartości ujemnej na zero). Inteligentny algorytm po prostu wykryje miejsca, w których przechowywane są wartości ujemne i wyczyści je w miejscu .

Grzegorz Wierzowiecki
źródło
2
Wypróbowałeś sfillsugestię ? Wygląda na to, że nie wymaga extX.
Kevin
1. Wiem, że możesz wypełnić istniejące pliki zerami z niszczeniem, ale to chyba nie jest prawda, prawda? 2.Jak robisz te obrazy? Może możesz zrobić tam obcięcie?
Zlatko
@kevin: dlatego zamieściłem odpowiedź sfill w pierwotnym pytaniu. rzadko sam używam systemów plików ext2,3,4, więc uważam, że narzędzia działające tylko na ext * są denerwująco bezużyteczne.
cas
Potrzebuję czegoś „inteligentnego”. Coś, co wypełnia puste miejsca zerami bez dotykania innych miejsc - mam na myśli, nie wpływając na wewnętrzne struktury danych, takie jak B-Drzewa (jeśli jesteście ciekawi, napisałem pytanie „kompresja”, ale potrzebuję go również do innych celów, jak zduplikowanie obrazów fs, analiza i badania)
Grzegorz Wierzowiecki,
po prostu użyj truncatei / lubfallocate
mikeserv

Odpowiedzi:

4

Oto zmodyfikowana i znacznie rozszerzona odpowiedź na moje poprzednie pytanie:

sfillz secure-deletepaczki możesz robić co chcesz.

W przeciwieństwie do zerofree (który działa tylko z systemami plików ext2, ext3 i ext4), sfill będzie działał z każdym systemem plików.

na przykład

sfill -l -l -z /mnt/X

Wygląda na to, że strona główna sfill / secure-delete zniknęła, ale jest spakowana dla Debiana i Ubuntu. prawdopodobnie inne dystrybucje też. jeśli potrzebujesz kodu źródłowego, możesz go znaleźć w archiwach Debiana, jeśli nie możesz go znaleźć nigdzie indziej.

UWAGA: sfill działa tylko na zamontowanym systemie plików. Jeśli wypełniasz zero plików obrazów z systemu hosta, a nie z maszyny wirtualnej, musisz zainstalować obraz fs na hoście. Dokładna metoda różni się w zależności od rodzaju pliku obrazu (np. Qcow2 lub raw).

Montowanie „surowych” obrazów jest łatwe i proste. Wystarczy użyć kpartxpliku obrazu, aby utworzyć urządzenie zwrotne, a / dev / mapper / wpisy dla każdej partycji można następnie zamontować osobno.

oto częściowy skrypt zmodyfikowany z fragmentu skryptu, którego używam do montowania obrazów dysku twardego freedos z uruchamianiem sieciowym (używanych do aktualizacji bios na komputerach, na których Flashrom nie działa):

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"

UWAGA: zakłada, że ​​każdą partycję na obrazie można zamontować. prawda w moim przypadku użycia (obraz HD Freedos z jedną partycją). nieprawda, jeśli jedną z partycji jest, powiedzmy, przestrzeń wymiany. Wykrywanie takich partycji i używanie dd do zerowania partycji wymiany pozostawia się jako ćwiczenie dla czytelnika :)

Ta metoda lub jej wariant powinien również działać w przypadku woluminów LVM.

Jeśli twoje obrazy to qcow, możesz użyć qemu-nbdnarzędzia z qemu-utilspakietu, które przedstawi plik obrazu i jego partycje jako urządzenia blokujące sieć - np. / Dev / nbd0 / dev / ndb0p1 - które mogą być używane w podobny sposób jak / urządzenia deweloperskie / mapujące powyżej.

Być może jest to łatwiejsze i mniej kłopotliwe (ale bardziej czasochłonne), aby użyć qemu-imgdo konwersji z Qcow na Raw, użyj powyższej metody dla Raw, a następnie przekonwertować zmodyfikowany surowy obraz z powrotem do skompresowanego qcow2. Prawdopodobnie spowoduje to nieco mniejsze obrazy niż użycie qemu-nbd, ponieważ będziesz kompresował nowy obraz qcow2 podczas jego tworzenia.

cas
źródło
1
Chodzi mi o to, że jest nie uznać „inteligentny” sposób wypełniania nieużywanego miejsca z zerami. To najbardziej oczywisty, typowy sposób na zrobienie tego. Nie pytam o takie rzeczy.
Grzegorz Wierzowiecki
1
Proszę opisać „inteligentny” algorytm, który nie jest specyficzny dla konkretnej rodziny systemów plików (jak zerofill dla ext2 / 3/4). Chciałeś programu, który mógłby wykonać tę pracę. Nie powiedziałeś, że to też musi być magiczne.
cas
1
a tak naprawdę, jeśli system plików nie jest używany (ponieważ np. jest zamontowany na hoście w celu zerowania), co ma znaczenie, jak inteligentny jest algorytm? Przeszukanie metadanych fs w poszukiwaniu pustych sektorów nie będzie ani szybsze, ani lepsze niż zapisanie ogromnego wypełnienia pełnego NUL… sam system plików jest już wystarczająco inteligentny, aby dowiedzieć się, gdzie jest pusta przestrzeń.
cas
2
Z jednej strony, wystarczy na twoje potrzeby - więc moje pytanie zawiera już fragment kodu z tym rozwiązaniem - więc twoja odpowiedź nie zawiera niczego nowego. Z drugiej strony moje potrzeby wymagają tego, co określam, ponieważ chcę wyczyścić nieużywane miejsce zerami bez modyfikowania struktur wewnętrznych (na przykład przywracanie równowagi „Dancing B-Trees” lub innego rodzaju struktury danych (np. Do analiz i usuwania duplikatów) cele)
Grzegorz Wierzowiecki,
2
@cas - Myślę, że brakuje ci faktu, że wypełnienie zera jest niezbędnym krokiem przed kompaktowaniem wirtualnych dysków twardych na maszynach wirtualnych. Jeśli masz 500 GB rozszerzającego się dysku, z 10 GB plików i 10 GB „pustego” miejsca (tzn. Usuniętych plików), uruchomienie naiwnego podejścia „gigantycznego pliku zerowego” zajmie FAR dłużej i będzie wymagało, aby VHD wzdychał do pełne 500 GB. Założę się, że OP zakłada, że narzędzie musi być również specyficzne dla FS.
Fałszywe imię
3

Prawidłowym i „inteligentnym” sposobem na zwolnienie wolnego miejsca jest użycie:

fstrim /mountpoint

Użyj tego w zamontowanym systemie plików.

Należy zauważyć, że nie ma w tym żadnej korzyści bezpieczeństwa. Jeśli chcesz wyczyścić dysk ze względów bezpieczeństwa, wykonaj kopię zapasową plików, wyzeruj cały dysk za pomocą polecenia „niszcz”, a następnie przywróć pliki.

Jednak rozwiązanie działa dobrze, jeśli dysk jest cienkim zapasem w rzadkim systemie plików i chcesz odzyskać nieużywane miejsce.

DustWolf
źródło