Jak zamontować skompresowany obraz dysku?


12

Jeśli utworzę obraz dysku i skompresuję go za pomocą gzip / xz / etc, czy istnieje sposób na zamontowanie go bezpośrednio bez uprzedniej dekompresji?

Powiedz, że użyłem

sudo dd if=/dev/sdc1 | gzip -9 > image1.dd.gz

jak mogę zamontować oryginalny obraz, nie tworząc najpierw nieskompresowanej kopii?

Lub użyłem

sudo dd if=/dev/sdc | gzip -9 > wholedisk.dd.gz

a dysk ma wiele partycji, czy byłoby to trudniejsze?

Przy nieskompresowanym obrazie całego dysku użycie kpartxlub nowsza wersja losetupz jego -Pflagą powinny stworzyć pętlę dla każdej partycji.

Ale czy istnieje sposób na zamontowanie / losetup / odczytanie skompresowanego obrazu?

Jeśli to nie zadziała dla gzip / xz, czy istnieje jakakolwiek metoda kompresji, która by działała?


Uwaga dotycząca duplikatu Q

Aktualnie sugerowany duplikat

NIE WYKORZYSTUJE KOMPRESJI i NIE JEST DUPLIKATEM .

mount sam nie zamontuje skompresowanego obrazu.


Mogę ci powiedzieć, że na pewno jest to możliwe. Ale nie mogę powiedzieć, jak atm, ponieważ instrukcje są na 2 zewnętrznych dyskach twardych i teraz nie mam dostępu do żadnego z nich, ale chcę poinformować, że to działa. Wrócę z odpowiedzią, kiedy ją otrzymam (i nikt inny do tej pory jej nie opublikował).
UTF-8


1
@ UTF-8 To zachęcające, dzięki. Do Twojej wiadomości, pierwotnym celem jest wykonanie mniejszej kopii zapasowej dysku / partycji, która jest prawie pusta lub zawiera wiele łatwo kompresowalnych danych, i jest w stanie ją odczytać bez zapisywania DUŻYCH dodatkowych danych lub potrzeby użycia dużej ilości wolnego miejsca do wyodrębnienia
Xen2050


2
@ bodhi.zazen Pardon? Może powinienem to wyjaśnić, mount nie automatycznie dekompresuje obrazów, więc to Q nie jest duplikatem askubuntu.com/questions/69363 (może przegapiłem żart, mam nadzieję, że dekompresja nie jest jedyną odpowiedzią :)
Xen2050

Odpowiedzi:


10

Możesz użyć squashfsdo kompresji obrazów dysków, a następnie ich zamontowania.

Utwórz obraz dysku

Jeśli nie masz jeszcze obrazu dysku, użyj go, ddaby go utworzyć:

dd if=/dev/sda1 of=/tmp/sda1.img bs=4M

Skompresuj obraz za pomocą squashfs

Zainstaluj squashfs:

apt-get install squashfs-tools

Skompresuj obraz:

mksquashfs /tmp/sda1.img /tmp/sda1.squash.img

Lub Streamuj kompresję (nie potrzebujesz tymczasowego pliku dd)

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

Komplementy dla terminatora14 na UbuntuForums.org . Definicje / objaśnienia:

  • empty-dir- „źródło” reż. Zasadniczo w naszym przypadku, po prostu pusty katalog, aby spełnić wejściowy format arg mksquashfs
  • squash.img - miejsce docelowe i nazwa pliku wyjściowego pliku squashfs
  • sda_backup.img - nazwa kopii zapasowej dd WEWNĄTRZ pliku squashfs
  • f - określa, że ​​sda_backup.img jest zwykłym plikiem (w przeciwieństwie do katalogu, urządzenia blokowego lub urządzenia char)
  • 444 - uprawnienia do pliku sda_backup.img wewnątrz obrazu squashfs
  • root root- UID i GID dla pliku sda_backup.img wewnątrz obrazu squashfs. Można podać według liczb dziesiętnych lub według nazwy
  • dd if=/dev/sda bs=4M - polecenie dd użyte do odczytu urządzenia, którego kopię zapasową chcemy utworzyć

Zamontuj obraz

Najpierw zamontuj squashfsobraz:

mkdir /mnt/squash
mount /tmp/sda1.squash.img /mnt/squash

Spowoduje to wyświetlenie nieskompresowanego obrazu dysku do zamontowania:

mkdir /mnt/sda1
mount /mnt/squash/sda1.img /mnt/sda1

Lub jeśli jest to pełny obraz dysku (podzielony na partycje), możesz użyć go, losetupaby dołączyć obraz dd do urządzenia pętlowego (ewentualnie opcjonalnego), a następnie kpartx -alub partprobeznaleźć i oddzielić partycje do oddzielnych urządzeń, a nawet vgscan/ vgchange -ayjeśli istnieje LVM.


2
Dodałem trochę informacji o squashfach w locie, aby uniknąć potrzeby tymczasowego zwykłego pliku dd. Świetna odpowiedź z squashfs, po prostu nie robi bardziej przyjaznych dla rur formatów xz / gz
Xen2050,

Czy to jakoś zadziała z obrazem pełnego dysku, który zawiera również wiele partycji?
friederbluemle


W zależności od typu systemu plików montowanie może wymagać następujących ro,noloadopcji:mount -o ro,noload /mnt/squash/sda1.img /mnt/sda1
HackerBoss

7

Udało mi się zdobyć serwer NBD, aby „obsługiwał” nieskompresowaną wersję pliku .gz lub .xz. Nie jestem pewien, czy musi on bardzo często czytać cały skompresowany plik (testowany dotychczas tylko z małymi plikami w pamięci RAM), ale przynajmniej działa bez konieczności wyodrębnienia całej nieskompresowanej kopii.

Wyświetlanie skompresowanego obrazu gd / xz „w locie”

  1. Zainstaluj nbdkit i klienta

    apt install nbdkit nbd-client
    
  2. Utwórz plik demonstracyjny w stylu „dd” - pusty plik 50M z systemem plików ext i spakuj go (opcjonalnie tylko do testowania)

    fallocate -l 50M 50m
    mkfs.ext3 -v 50m
    

    Następnie skompresuj za pomocą gzip lub xz

    gzip -vk9 50m
    xz -v9k 50m
    

    Uwaga: xzOpcja --block-size=16MiBpowinna zapewniać lepszą wydajność dostępu losowego, ale kosztem mniejszej kompresji (może 1%?). Zobacz opis wtyczki xz nbdkit .

  3. Uruchom serwer na obrazie COMPRESSED

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-gzip-plugin.so file=~/Downloads/50m.gz
    

    lub dla xz

    nbdkit -v --no-fork -i 127.0.0.1 /usr/lib/i386-linux-gnu/nbdkit/plugins/nbdkit-xz-plugin.so file=~/Downloads/50m.xz
    

    --no-forkInformuje serwer „nie widelec w tle” co powoduje, że ewentualne komunikaty o błędach i zabijając go z CTRL-C jest trochę łatwiej.

    -v może / pokaże zbyt wiele komunikatów o stanie, szczególnie podczas czytania.

  4. Uruchom klienta (w innym terminalu / oknie)

    sudo nbd-client -nofork 127.0.0.1 10809 /dev/nbd0
    

    -noforkJest podobny do -no-forkpowyższego, ale mogę nie zabić klientowi CTRL-C, kill <pid>lub sudo kill <pid>. Zakończenie działania serwera za pomocą CTRL-C zatrzymało zarówno serwer, jak i klienta.

  5. Zauważ, że /dev/nbd0jest teraz identyczny z obrazem NIE SPRĘŻONYM

    $ sudo diff -s /dev/nbd0 ~/Downloads/50m
    Files /dev/nbd0 and /home/user/Downloads/50m are identical
    

    /dev/nbd0może być teraz używany podobnie jak nieskompresowany obraz; zamontowane, odczyt / kopiowanie ddlub wykorzystanie kpartx, partprobe, vgscan/ vgchange, itp!

Dzięki Cristianowi Ciupitu na Unixowi i Linuksowi zajęło to trochę więcej czasu, aby znaleźć wtyczkę i wszystko połączyć.


W Fedorze 31 nbdkit -v --no-fork -i 127.0.0.1 --filter=xz file ~/Downloads/50m.xzdziałało świetnie z tym samym poleceniem klienta
EkriirkE

Na Ubuntu Xenial 16.04 LTS nbdkit 1.1.11 używa starego protokołu NBD, który różni się od nowego protokołu NBD, używanego w nbd-client 3.13, ale możesz używać wersji klienta nbd przed 3.10, np. nbd-client 3.8 from Ubuntu precise 12.04 old LTS[Używaj starych wersji tylko lokalnie dla bezpieczeństwa!]
użytkownik1742529

0

Oto mój sposób na zrobienie tego, ale nie znam tego odpowiednika na konsolę,

  • Skompresuj folder do formatu ISO. wprowadź opis zdjęcia tutaj
  • Zamontuj .isoplik za pomocą Disk Image Mounter. wprowadź opis zdjęcia tutaj
  • Tada Otwieram skompresowane ISO bez rozpakowywania go. wprowadź opis zdjęcia tutaj

4
Czy ta metoda faktycznie kompresuje dane? Wygląda na to, że używa zwykłego obrazu iso9660 (przez wałek do plików?), Który nie używa kompresji. Próbowałem go na pliku 100 MB ze wszystkimi zerami ( dd if=/dev/zeroi rolką do plików) i faktycznie dodaje on 362k danych (przypuszczam, że jest to narzut iso). Dzięki, pomysł jest na dobrej drodze
Xen2050,

Przykro mi, ale nie mam pojęcia o technologiach kompresji, ale jeśli spróbujesz innego formatu kompresji, założę się, że możesz również wyświetlić tę listę za pomocą rolki plików, ale jeśli chcesz przeczytać ten plik, musisz wyodrębnić tylko ten konkretny plik.
hellozee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.