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.file
działa, gdy cat
nie ma obrazu zamontowanego dysku.
źródło
sudo cat /dev/zero > zero.file
nie działa, ponieważ twoja bash (działająca jak ty, a nie root) dokonuje przekierowania przed wykonaniemsudo
polecenia. Zobacz unix.stackexchange.com/questions/1416/…Odpowiedzi:
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
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)
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
lub możesz użyć opcji tar - rar lub rsync - sparse.
źródło
cat /dev/zero > zero.file
można całkowicie wypełnić zerami puste miejsce?dd
między pisaniem zer i szukaniem.cat
polecenie wypełni cały dysk (lub przynajmniej kwotę niezarezerwowaną dla roota lub kwot) z „prawdziwymi” zerami i nie utworzy rzadkich plików.Być może najłatwiejszym sposobem sparsify pliku w miejscu jest użycie
fallocate
narzędzia w następujący sposób:fallocate (1) jest dostarczany przez pakiet util-linux na Debianie .
źródło
fallocate --dig-holes
otrzymałem plik 103GiB z 299GiB oryginału, acp --sparse=always
dałem mi 93GiB - wszystkie z tą samą sumą SHA1 (rozmiary sprawdzane przezdu -B1G
vsdu --apparent-size -B1G
). Więcfallocate
wydaje się dawać gorsze rezultaty.Edytowanie mojej odpowiedzi pod kątem kompletności:
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
„dd” ma opcję konwersji pliku z zerami na plik rzadki:
dd if=disk.img of=disk-sparse.img conv=sparse
źródło
zerofree
może być szybsze niż montowanie i zapisywanie zer w systemie plików oraz zmniejszanie rozmiaru obrazu dysku, jeśli zawiera już wiele zer.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:
a następnie utwórz w nim system plików:
a następnie po prostu zamontuj obraz i skopiuj wszystko ze starego obrazu na nowy? czy to byłoby dla Ciebie ok?
źródło
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:
Powinieneś produkować to, co chcesz (być może uda się wbić ostatni krok, nie próbowałem).
źródło
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.
źródło
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.
źródło
cp --sparse=always
działa dobrze