Jak przekonwertować obraz dysku Linux na plik rzadki?

12

Mam kilka obrazów dysków, wykonanych za pomocą narzędzia ddrescue, na partycji EXT i chcę zmniejszyć ich rozmiar bez utraty danych, ale nadal można je montować.

Jak mogę wypełnić puste miejsce w systemie plików obrazu zerami, a następnie przekonwertować plik na plik rzadki, aby to puste miejsce nie było faktycznie przechowywane na dysku?

Na przykład:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

W rzeczywistości zawiera on tylko 50G rzeczywistych danych, więc drugi pomiar powinien być znacznie mniejszy.

To rzekomo wypełni puste miejsce zerami:

cat /dev/zero > zero.file
rm zero.file

Ale jeśli pliki rozrzedzone są obsługiwane w sposób przezroczysty , może faktycznie utworzyć plik rozrzedzony bez zapisywania czegokolwiek na dysku wirtualnym, co ironicznie uniemożliwia mi przekształcenie obrazu dysku wirtualnego w sam plik rzadki. :) Czy to?

Uwaga: Z jakiegoś powodu sudo dd if=/dev/zero of=./zero.filedziała, gdy catnie ma obrazu zamontowanego dysku.

endolit
źródło
2
Zapisanie zer do pliku nie spowoduje utworzenia pliku rzadkiego. To inna koncepcja. Podczas wyszukiwania / odczytu rzadkiego pliku, gdy system operacyjny odkryje, że blok danych tak naprawdę nie istnieje (lista bloków jest pusta dla danych w tym regionie), automatycznie (system operacyjny) automatycznie wypełnia bufor odczytu zerowymi bajtami.
hotei
Uwaga: sudo cat /dev/zero > zero.filenie działa, ponieważ twoja bash (działająca jak ty, a nie root) dokonuje przekierowania przed wykonaniem sudopolecenia. Zobacz unix.stackexchange.com/questions/1416/…
Fritz

Odpowiedzi:

19

Po pierwsze, rzadkie pliki są obsługiwane w sposób przezroczysty tylko wtedy, gdy szukasz, a nie, jeśli zapisujesz zera.

Żeby było bardziej jasne, przykład z Wikipedii

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

czy nie pisać żadnych zer, to otworzyć plik wyjściowy, seek (przeskoczyć) 5MB, a następnie napisać zerowe zera (czyli nic w ogóle). To polecenie ( nie z Wikipedii)

dd if=/dev/zero of=sparse-file bs=1k count=5120

zapisze 5 MB zer i nie utworzy rzadkiego pliku!

W rezultacie plik, który już nie jest rzadki, nie będzie magicznie później rzadki.

Po drugie, aby plik z dużą ilością zer nielicznych, trzeba cp to

cp --sparse=always original sparsefile

lub możesz użyć opcji tar - rar lub rsync - sparse.

Mihi
źródło
1
Według Wikipedii pisanie zer za pomocą dd spowoduje utworzenie rzadkiego pliku. Czy możesz wyjaśnić, co oznacza „szukanie”?
endolith
1
A co z kotem? Na stronie podręcznika nie ma nic o plikach rzadkich, więc zakładam, że cat /dev/zero > zero.filemożna całkowicie wypełnić zerami puste miejsce?
Ludwig Weinzierl
2
@endolith: Zaktualizowałem moją odpowiedź, aby wyjaśnić, jaka jest różnica ddmiędzy pisaniem zer i szukaniem.
mihi
2
@Ludwig Weinzierl: Tak, to catpolecenie wypełni cały dysk (lub przynajmniej kwotę niezarezerwowaną dla roota lub kwot) z „prawdziwymi” zerami i nie utworzy rzadkich plików.
mihi
1
@endolith będziesz potrzebować dodatkowej przestrzeni, tak. ale ponieważ możesz skompresować plik archiwalny, potrzebujesz tylko miejsca na oryginalny plik i skompresowaną wersję pliku rzadkiego.
mihi
12

Być może najłatwiejszym sposobem sparsify pliku w miejscu jest użycie fallocatenarzędzia w następujący sposób:

fallocate -v --dig-holes {file_name}

fallocate (1) jest dostarczany przez pakiet util-linux na Debianie .

Onlyjob
źródło
1
Z jakiegoś powodu fallocate --dig-holesotrzymałem plik 103GiB z 299GiB oryginału, a cp --sparse=alwaysdałem mi 93GiB - wszystkie z tą samą sumą SHA1 (rozmiary sprawdzane przez du -B1Gvs du --apparent-size -B1G). Więc fallocatewydaje się dawać gorsze rezultaty.
Ruslan
3

Edytowanie mojej odpowiedzi pod kątem kompletności:

  1. Dociśnij puste miejsce FS zerami (OSTRZEŻENIE: zmienia to obraz dysku):

losetup --partscan --find --show disk.img

Załóżmy, że daje / dev / loop1 jako dysk i jest tylko jedna partycja, w przeciwnym razie musimy powtórzyć to dla każdej partycji z zamontowanym FS (zignoruj ​​partycję wymiany itp.).

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

Niech zakończy się niepowodzeniem z ENOSPC.

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. Skopiuj do rzadkiego obrazu:

„dd” ma opcję konwersji pliku z zerami na plik rzadki:

dd if=disk.img of=disk-sparse.img conv=sparse

Lam Das
źródło
1
Tak, ta opcja nie pochodzi od momentu, kiedy OP poprosił. To było raczej „zostaw bułkę tartą dla innych poszukiwaczy” ... :-)
Lam Das,
1
w zależności od typu systemu plików, zerofreemoże być szybsze niż montowanie i zapisywanie zer w systemie plików oraz zmniejszanie rozmiaru obrazu dysku, jeśli zawiera już wiele zer.
mihi
2

Czy masz na myśli, że tworzony obraz ddrescue ma, powiedzmy, 50 GB, a w rzeczywistości wystarczyłoby znacznie mniej?

W takim przypadku nie możesz po prostu utworzyć nowego obrazu za pomocą dd:

dd if=/dev/zero of=some_image.img bs=1M count=20000

a następnie utwórz w nim system plików:

mkfsofyourchoice some_image.img

a następnie po prostu zamontuj obraz i skopiuj wszystko ze starego obrazu na nowy? czy to byłoby dla Ciebie ok?

Janne Pikkarainen
źródło
2

PartImage może tworzyć obrazy dysków, które przechowują tylko używane bloki systemu plików, drastycznie zmniejszając wymaganą przestrzeń, ignorując nieużywany blok. Nie sądzę, że możesz bezpośrednio zamontować powstałe obrazy, ale przechodząc:

image -> partimage -> image -> cp --sparse=alway

Powinieneś produkować to, co chcesz (być może uda się wbić ostatni krok, nie próbowałem).

Grumbel
źródło
1
Niestety obrazów utworzonych przez partimage nie można zamontować bez ich ponownego rozwinięcia, co czyni je odpowiednimi tylko do celów archiwalnych.
Perkins
0

Jest teraz narzędzie o nazwie virt-sparsify, które to zrobi. Wypełnia puste miejsce zerami, a następnie kopiuje obraz do rzadkiego pliku. Wymaga to jednak zainstalowania wielu zależności.

endolit
źródło
-2

Podejrzewam, że będziesz potrzebować niestandardowego programu napisanego do tej specyfikacji, jeśli NAPRAWDĘ to chcesz zrobić. Ale czy to jest ...?

Jeśli faktycznie masz wiele obszarów zerowych, każde dobre narzędzie do kompresji znacznie go obniży. A próba zapisu rzadkich plików nie będzie działać we wszystkich przypadkach. Jeśli dobrze pamiętam, nawet rzadkie pliki zajmują co najmniej 1 blok pamięci wyjściowej, przy czym blok wejściowy zawiera DOWOLNE bity niezerowe. Na przykład - powiedzmy, że masz plik, który ma średnio nawet 1 niezerowy bit na 512 bajtowy blok - nie można go zapisać „rzadko”. Nawiasem mówiąc, nie stracisz danych, jeśli skompresujesz plik za pomocą zip, bzip, bzip2 lub p7zip. Nie są jak stratna kompresja MPEG lub JPEG.

Z drugiej strony, jeśli chcesz wykonać losowe odczyty wyszukiwania w pliku, kompresja może być bardziej kłopotliwa niż jest warta i wracasz do rzadkiego zapisu. Kompetentny programista C lub C ++ powinien być w stanie napisać coś takiego za godzinę lub krócej.

hotei
źródło
Interesujące - głosowanie negatywne, ale zauważam, że nie można obalić tego, co napisałem. Jeśli jest dokładny, ale nieprzydatny, nie jest to powód do głosowania za nim. Jeśli nie jest to dokładne i nie jest pomocne, to zasługuje na to.
hotei
Widzę gdzie indziej, że OP miał pytanie dotyczące montażu skompresowanych obrazów. Zakładam, że jest to kontynuacja tego wątku. Wiedząc, że teraz rozumiem, dlaczego moja propozycja kompresji nie została zaakceptowana. Prosty program w C jest nadal łatwym sposobem na tworzenie rzadkich plików. ALE - czy (nieokreślony) system operacyjny pozwoli ci zamontować rzadkie ISO. Tak wybredny jak narzędzie do montowania systemu Ubuntu ISO jest to, że nie jestem w 100% pewien, że to zadziała ... ale w każdym razie powodzenia.
hotei
4
po co wymyślać koło ponownie? cp --sparse=alwaysdziała dobrze
mihi
@mihi: To dobry pomysł. Nie wiedziałem o opcji rzadkiej, ponieważ nie jest ona dostępna w wersjach BSD ( freebsd.org/cgi/… ) i nigdy nie musiałam szukać strony podręcznika użytkownika systemu Linux dla cp (do dziś).
hotei
Jednym ze sposobów na skompresowanie obrazów i ich zamontowanie jest po prostu przechowywanie ich w systemie plików obsługującym kompresję natywną. Sprawia, że ​​odzyskiwanie danych jest okropne, jeśli masz awarię dysku, ale po to są kopie zapasowe, prawda?
Perkins