Czy możliwe jest montowanie w locie skompresowanego obrazu gzip?

66

Lubię tworzyć kopię zapasową obrazu po raz pierwszy, kiedy tworzę kopię zapasową systemu. Po tym pierwszym użyciu używam rsync do tworzenia przyrostowych kopii zapasowych.

Moja zwykła kopia zapasowa obrazu jest następująca:

Zamontuj i wyzeruj puste miejsce:

dd if=/dev/zero of=temp.dd bs=1M

rm temp.dd

umount i dd dysk podczas kompresji

dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz

aby przywrócić system do normy, zwykle zrobię

gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K

Jest to naprawdę proste i pozwala mi zaoszczędzić „cały dysk”, ale tak naprawdę po prostu zaoszczędzić miejsce.

Oto problem. Powiedzmy, że robię powyższe, ale nie w czystym systemie i nie otrzymuję kopii zapasowych rsync wkrótce, a na obrazie znajdują się pliki, do których chcę uzyskać dostęp. Powiedzmy, że nie mam miejsca do rozpakowania i dodania obrazu do napędu, ale chcę zamontować obraz, aby uzyskać z niego pojedyncze pliki ... Czy to możliwe?

Zwykle nie można skompresować obrazu dd, co pozwoli ci po prostu zamontować obraz za pomocą -o loop... ale to nie jest mój przypadek ...

Wszelkie sugestie dotyczące montażu skompresowanego obrazu w locie?

Czy użycie AVFS do „zamontowania” pliku gz, a następnie zamontowanie wewnętrznej pracy dd.img (nie wydaje mi się, że tak ... ale wymagałoby weryfikacji ...)?

g19fanatic
źródło
Powinieneś używać SquashFSdo tego rodzaju rzeczy. Usuwa również duplikaty plików.
Avio
Wygląda na to, że ten facet robi to, o co pytasz: blogs.gnome.org/muelli/2012/10/...
Joshua,
Popieram sugestię Avio. Jedyne, czego squashfs nie archiwizuje, to acls. Archiwizuje xattrs, więc atrybuty selinux itp. Jeśli nie używasz acls, wtedy squashfs jest drogą do IMHO. Ostatnio musiałem zarchiwizować „na wszelki wypadek” niektóre stare dyski, które zostały już zmigrowane do nowej pamięci, a squashfs był idealny do tego zadania.
Kuba Ober

Odpowiedzi:

66

Zależy to od tego, czy obraz dysku jest obrazem pełnego dysku, czy tylko partycją.

Mycie partycji

Jeśli dysk jest w dobrym stanie, uzyskasz lepszą kompresję, jeśli umyjesz puste miejsce na dysku zerami. Jeśli dysk nie działa, pomiń ten krok.

Jeśli obrazujesz cały dysk, będziesz chciał umyć każdą partycję na dysku.

UWAGA: Należy uważać, chcesz ustawić ofdo pliku w zamontowanej partycji, NIE partycji sobie!

mkdir image_source
sudo mount /dev/sda1 image_source
dd if=/dev/zero of=image_source/wash.tmp bs=4M
rm image_source/wash.tmp
sudo umount image_source

Tworzenie obrazu partycji

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M

Gdzie sdajest nazwa urządzenia i 1numer partycji. Dostosuj odpowiednio do swojego systemu, jeśli chcesz obrazować inne urządzenie lub partycję.

Tworzenie obrazu całego dysku

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M

Gdzie sdajest nazwa urządzenia. Dostosuj odpowiednio do swojego systemu, jeśli chcesz obrazować inne urządzenie.

Kompresja

Utwórz obraz „squashfs”, który zawiera pełny nieskompresowany obraz.

sudo apt-get install squashfs-tools
mksquashfs image squash.img

Kompresja strumieniowa

Aby uniknąć tworzenia osobnego pliku tymczasowego o pełnym rozmiarze dysku, możesz przesyłać strumieniowo do obrazu squashfs.

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'

Montowanie skompresowanego obrazu partycji

Najpierw zamontuj obraz squashfs, a następnie zamontuj obraz partycji zapisany w zamontowanym obrazie squashfs.

mkdir squash_mount
sudo mount squash.img squash_mount

Teraz masz zamontowany skompresowany obraz, zamontuj sam obraz (czyli wewnątrz obrazu squashfs)

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

Teraz twój obraz jest zamontowany pod compressed_image.

EDYCJA: Jeśli chcesz po prostu przywrócić obraz dysku na partycję w tym momencie (zamiast montować go, aby przeglądać / czytać zawartość), po prostu ddobraz w squash_mount/sda1_backup.imgmiejscu docelowym zamiast robić mount.

Montowanie skompresowanego obrazu całego dysku

Wymaga to użycia pakietu o nazwie kpartx. kpartx pozwala montować pojedyncze partycje na pełnym obrazie dysku.

sudo apt-get install kpartx

Najpierw zamontuj zgniecioną partycję, która zawiera pełny obraz dysku

mkdir compressed_image
sudo mount squash.img compressed_image

Teraz musisz utworzyć urządzenia dla każdej partycji na pełnym obrazie dysku:

sudo kpartx -a compressed_image/sda_backup.img

Spowoduje to utworzenie urządzeń dla partycji na pełnym obrazie dysku, /dev/mapper/loopNpPgdzie N to numer przypisany do urządzenia pętli zwrotnej, a P to numer partycji. Na przykład: /dev/mapper/loop0p1.

Teraz masz sposób na zamontowanie poszczególnych partycji na pełnym obrazie dysku:

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
doug65536
źródło
ciekawe podejście do tego problemu (squashfs zamiast gzip). Nie jestem zaznajomiony z narzędziami squashfs ... czy możesz potokować wyjście dd, aby utworzyć partycję squasha w locie, jak to możliwe z partycją gzip? jakie są współczynniki kompresji (gzip jest w porządku / dobry, zwłaszcza biorąc pod uwagę fakt, że usuwam „puste miejsce zerami”)?
g19fanatic
jak włożyłbyś obraz z powrotem na dysk twardy?
g19fanatic
2
@ g19fanatic Nieskompresowany obraz dysku znajduje się „wewnątrz” obrazu squashfs. Zamontujesz obraz squashfs, a następnie umieścisz obraz w nim na dysku docelowym.
doug65536
@ g19fanatic Kompresja była doskonała (w moim przypadku prawie taka sama jak gzip). mksquashfs też był szybki, jest równoległy. W moim 990x (6 rdzeniach) było to faktycznie ograniczone przez prędkość zapisu dysku docelowego, około 100 MB / s.
doug65536
3
@ g19fanatic Możesz przesyłać strumieniowo do squashfs za pomocą flag -plub, -pfaby przekazać pseudo-plik. Pseudo plik może być wykorzystywany do tworzenia węzłów urządzeń, których inaczej nie można zrobić bez rootowania (przydatne do budowania obrazów w ramach procesu kompilacji) lub do przesyłania strumieniowego danych wyjściowych niektórych poleceń do obrazu. Jednym z przykładów podanych w dokumentacji ( /usr/share/doc/squashfs-tools/examples/pseudo-file.examplena Debianie / Ubuntu) jest input f 444 root root dd if=/dev/sda1 bs=1024 count=10skopiowanie pierwszych 10 KB z obrazu dysku do pliku o nazwie „wejście” w obrazie squashfs.
Brian Campbell
15

Jeśli obraz jest tylko do odczytu , możesz również użyć nbdkit ( strona podręcznika man ) i jego wtyczki xz (xz powinien zapewnić lepszą kompresję i losowy czas dostępu niż gzip).

Utwórz skompresowany obraz partycji

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz

--block-sizeOpcja 16 MiB powinien zapewnić dobrą wydajność dostępu losowego.

Uwaga: możesz użyć alternatywnych programów do kompresji xz, takich jak pixz, który zapewnia kompresję równoległą, po prostu upewnij się, że dzieli dane wyjściowe na wiele małych bloków, w przeciwnym razie nbdkit będzie musiał zdekompresować dużo danych. Na przykład we wrześniu 2015 r. Pxz nie obsługuje tego.

Podawaj za pomocą nbdkit

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       xz file=sda1.img.xz

Połącz się z serwerem NBD

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

Zamontuj go tylko do odczytu

mount -o ro /dev/nbd0 sda1

Po zakończeniu

umount /dev/nbd0
nbd-client -d /dev/nbd0

Zatrzymaj nbdkit , naciskając Ctrl+ C(lub z kill ).

Cristian Ciupitu
źródło
15

Próbować archivemount

root@srv1:/backup# archivemount windows-2003-S.gz /target/
Unrecognized archive format
root@srv1:/backup# archivemount -o formatraw windows-2003-S.gz /target/
Calculating uncompressed file size. Please wait.
root@srv1:/backup# ls /target/
data
root@srv1:/backup# file /target/data
/target/data: DOS/MBR boot sector; partition 1 : ID=0x7, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 63, 58717512 sectors, extended partition table (last)

archivemount to oparty na FUSE system plików dla wariantów Uniksa, w tym Linuksa. Jego celem jest montowanie archiwów (tj. Tar, tar.gz itp.) W punkcie montowania, w którym można je odczytać lub zapisać do nich, jak w każdym innym systemie plików. Dzięki temu dostęp do zawartości archiwum, który może być skompresowany, jest przezroczysty dla innych programów, bez ich dekompresji.

http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system

Po zamontowaniu archiwum możesz używać jego zawartości jak zwykłego pliku. Może zdobądź tablicę partycji lub przekonwertuj, zamontuj obraz za pomocą narzędzi qemu.

squashfs przydatne do uruchamiania z obrazu, ale o wiele skomplikowane do tworzenia kopii zapasowych.

eri
źródło
Doskonały! To jak dotąd najłatwiejsze i najbardziej eleganckie rozwiązanie. Zastanawiam się, dlaczego nie ma tutaj głosów.
TranslucentCloud
Myślę, że dzieje się tak, ponieważ jeśli zamontujesz archiwum takie jak disk.img.gz w folderze z archivemount, powiedzmy / mnt /, dostaniesz pojedynczy plik /mnt/disk.img, który będziesz musiał zamontować gdzie indziej. Pytanie chce zamiast tego czegoś, co może rozpakować oba w jednym kroku (a archivemount wydaje się być w stanie to zrobić na .tar.gz, ale nie na surowych obrazkach spakowanych gzipem).
p91paul
2
Ta odpowiedź jest również bardzo interesująca. Wierzę, że squashfs zyskuje więcej miłości, ponieważ ma większą świadomość. Natychmiast rozpoznałem nazwę, ale nigdy nie słyszałem o archiwizacji. Będę też musiał spróbować!
g19fanatic
2
archivemount nie pozwala na zamontowanie obrazu utworzonego za pomocą poleceniadd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Siergiej
3
Uzgodnione - w momencie pisania, archivemount obsługuje archiwa tar, które są spakowane gzip, ale nie zwykłe pliki spakowane gzip.
mwfearnley
10

Ta odpowiedź uzupełnia odpowiedź Cristiana Ciupitu . Jeśli używasz kompresji xz z rozsądnym rozmiarem bloku, możesz uzyskać dostęp do obrazu dysku za pomocą guestfish lub innych narzędzi libguestfs , takich jak to:

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'
Bogaty
źródło
8

Nie całkiem. Nie można tak naprawdę szukać określonego bloku w skompresowanym pliku bez uprzedniej dekompresji całości, co utrudnia użycie skompresowanego obrazu jako urządzenia blokowego.

Możesz użyć czegoś podobnego dumpi restore(lub tar, naprawdę), z których wszystkie używają formatu przesyłania strumieniowego ... dzięki czemu możesz uzyskać dostęp do poszczególnych plików, skutecznie skanując nieskompresowany strumień. Oznacza to, że jeśli żądany plik znajduje się na końcu skompresowanego archiwum, możesz długo czekać, ale nie wymaga on faktycznej dekompresji wszystkiego na dysk.

Korzystanie tarz kopii zapasowych może wydawać się nieco staromodne, ale masz dużą elastyczność.

Larsks
źródło
1
Problem polega na tym, że nawet nie wiem, czy dany plik rzeczywiście znajduje się na tej skompresowanej kopii zapasowej ... Czy znasz eksploratora plików, który przejdzie przez cały obraz .gz'd, zachowaj plik / katalog struktura w pamięci, zapewnia prosty widok struktury i pozwala „wybierać” pliki (teraz, gdy wie, gdzie one istnieją) do wyodrębnienia? Jest to bardzo niszowa specyfikacja ... ale widziałem mnóstwo zastosowań dla czegoś takiego ... jeśli istnieje.
g19fanatic
1
Jeśli tak się nie stanie, czy byłbyś w stanie wskazać mi instrukcje dotyczące wyciągania struktury z obrazu gz'd? Byłbym w stanie stworzyć taki program (program do życia ...), ale jestem ślepy na temat dekompresji danych obrazu i specyfiki różnych systemów plików.
g19fanatic
Podejrzewam, że zbudowanie własnego narzędzia będzie większym projektem, niż naprawdę chcesz się podjąć. Jednak ... zakładając, że masz system plików ext [234], sugerowałbym pakiet e2fsprogs , a może coś w rodzaju fuse-ext2 . Oba zapewniają narzędzia przestrzeni użytkownika do interakcji z systemami plików ext [234].
larsks
Zauważ też, że to, co masz, nie jest obrazem systemu plików, jest to obraz całego dysku, co oznacza, że ​​najpierw musisz przeanalizować tabelę partycji i zlokalizować odpowiednią partycję.
larsks
Źle wpisałem powyższe pytanie i naprawię to. Zwykle wykonuję obraz dd oparty na partycji i zapisuję kopię tablicy partycji. Zwykłem robić kopie całego dysku, ale nienawidziłem konieczności montowania z opcjami dotarcia do właściwej lokalizacji.
g19fanatic
3

Kolejny dodatek do odpowiedzi Cristiana Ciupitu :

Jeśli użyjesz nbdkitdo zamontowania pełnego obrazu dysku (vs. obrazu partycji), może być konieczne określenie rozmiaru bloku (rozmiar sektora dysku) podczas łączenia się z serwerem NBD, ponieważ domyślnie jest to 1024bajt. Aby 512zamiast tego użyć bajtów:

nbd-client 127.0.0.1 /dev/nbd0 -b 512 -n

Następnie dysk będzie wyglądał jak /dev/nbd0i powinieneś móc przeglądać tablicę partycji za pomocą fdisk -l. Jednak partycji nie można jeszcze zamontować - użyj kpartx(z odpowiedzi doug65536 ), aby utworzyć urządzenia dla partycji, np .:

kpartx -arv /dev/nbd0

Wreszcie partycje pojawią się w /dev/mapper/i możesz je zamontować jak zwykle. Pamiętaj, aby użyć trybu tylko do odczytu ( -o ro), ponieważ wtyczka xz obsługuje tylko odczyty:

mount -o ro /dev/mapper/nbd0p3 /mnt
friederbluemle
źródło