Konwertuj obraz partycji na obraz dysku z tablicą partycji

20

Mam obraz istniejącej partycji wygenerowany za pomocą dd if=/dev/sdXN of=image.bin. Teraz chcę użyć tego obrazu jako podstawy maszyny wirtualnej. Wiem, jak przekonwertować obraz do formatu, którego może używać VirtualBox.

Problem polega na tym, że obraz „dysku” jest tak naprawdę tylko obrazem jednej partycji, a zatem nie zawiera MBR ani tablicy partycji. To bardzo utrudnia uruchomienie maszyny wirtualnej.

Czy istnieje prosty sposób, biorąc pod uwagę obraz partycji, stworzenie odpowiedniego obrazu dysku, w tym tablicy partycji?

Mika Fischer
źródło

Odpowiedzi:

13

Możesz to zrobić na komputerze hosta. Większość takich narzędzi fdiskbędzie działać na plikach i kpartxzapewnia dostęp do partycji w pliku.

  1. Utwórz nowy pusty rzadki obraz 100GiB (powiększ go nieco do rozmiaru obrazu partycji)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Podziel plik obrazu na partycje za pomocą fdisk

    fdisk myvm.img
    
  3. Udostępnij partycje w pliku obrazu dla poszczególnych urządzeń

    sudo kpartx -a myvm.img
    
  4. Skopiuj obraz partycji do partycji

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Rozwiń system plików, aby wypełnić całą partycję

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Zamknij partycje

    sudo kpartx -d myvm.img
    
  7. Zdemontować urządzenie sprzężenia zwrotnego

    sudo losetup -D
    
mgorven
źródło
Czy nie spowodowałoby to, że utworzona partycja na obrazie „nie będzie pasować” do długości obrazowanej partycji? Czy istnieje sposób na rozwiązanie tego problemu? I czy „wystarczająco inteligentny” menedżer systemu plików byłby w stanie stwierdzić, że nie używa całego rozmiaru partycji i rozszerzyć się, aby pasował?
killermist,
@killermist Zaktualizowana odpowiedź.
mgorven
To dobra odpowiedź. Czy znasz sposób na uniknięcie kopiowania całego procesu?
Mika Fischer,
@MikaFischer Niestety nie, ponieważ tabela partycji musi istnieć przed partycją, a ja nie znam żadnego mechanizmu do dodawania danych do pliku.
mgorven
Myślę, że odpowiedź Haruna jest lepsza, ponieważ jest łatwa do zrobienia i może być napisana w skrypcie.
philcolbourn
9

Jestem pewien, że pierwotny problem został rozwiązany dawno temu, ale dla każdego z podobnym problemem:

Jednym ze sposobów uniknięcia kopiowania całego obrazu byłoby utworzenie obrazu w formacie .vmdk, który odnosi się do oddzielnych plików zakresu dla tabeli partycji i dla zawartości partycji.

Mam ten fragment kodu w pliku .vmdk z testu, który zrobiłem jakiś czas temu:

RW 63 FLAT "parttable.bin" 0
RW 585937489 FLAT "partition-image.bin" 63

Oznacza to, że 63 sektory zaczynające się od offsetu 0 są odczytywane z surowego pliku „parttable.bin”, ale sektor 63 i wyższy pochodzą z zrzutu surowej partycji „partition-image.bin”. (Oczywiście zastąp wartość 63 rzeczywistym przesunięciem do pierwszej partycji, zwykle obecnie 2048).

Ostateczny wynik jest taki, że z poziomu VBoxa wygląda na to, że wstawiłeś tabelę partycji na przód obrazu partycji, bez konieczności długiej operacji kopiowania.

Podziel dysk na partycje z maszyny wirtualnej, a jeśli poprawne zostaną przesunięcia, zawartość obrazu partycji powinna być widoczna w nowo utworzonej partycji.

Harun
źródło
2
Myślę, że „63” w drugim wierszu musi wynosić 0, jeśli partycja-image.bin jest obrazem partycji. Właśnie zrobiłem coś takiego i musiałem ustawić to przesunięcie w pliku obrazu partycji na zero. philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn
Geniusz. Musiałem to zrobić, aby użyć partycji Windows na maszynie wirtualnej na hoście Linux, i to jedyna rzecz, która zadziałała, korzystając z kroków z @philcolbourn: superuser.com/a/804396/93066
bmaupin
Co powinno znajdować się w pozostałej części pliku vmdk?
gozzilli
1
@gozzilli Reszta pliku to zbiór szczegółowych informacji, takich jak numery wersji plików, typ adaptera dysku, płyny pomocnicze i geometria dysku. Nie wiem jak napisać te bity. Poleciłbym po prostu użyć narzędzia do utworzenia vmdk wskazującego na obraz dysku, a następnie zmodyfikować tylko linie opisujące skąd pobrać dodatkowy nagłówek partycji.
Harun,
3

Ciekawy problem. Oto co bym zrobił:

  1. Utwórz maszynę wirtualną z odpowiednio dużym dyskiem, a następnie uruchom ją z dysku CD odzyskiwania.
  2. Uzyskaj dostęp do istniejącego obrazu dysku (nfs, cifs itp.).
  3. Utwórz potrzebne partycje na dysku lokalnym maszyny wirtualnej.
  4. Użyj dd, aby zapisać obraz partycji na partycji na dysku VM.

Po wykonaniu tej czynności musisz zaktualizować moduł ładujący. Zakładając, że używasz GRUB-a, zamontuj nowo napisaną partycję, a następnie uruchom na niej chroot i uruchom update-grub(bądź ostrożny, może być konieczne dostosowanie jego plików konfiguracyjnych, zanim będzie działać poprawnie).

Powodzenia!

bahamat
źródło
2

Możesz zmienić rozmiar systemu plików w miejscu, z GParted.

Utwórz obraz testowy:

dd if=/dev/zero of=extfs bs=1M count=20
mkfs.ext4 extfs

Nie używam resize2fs, ponieważ zmienia rozmiar pliku, zamiast pozostawiać wolne miejsce.

sudo losetup /dev/loop0 extfs
sudo ln -s /dev/loop0 /dev/loop0p1 # needed for GParted to be able to resize it
gksudo gparted /dev/loop0

Darmowy 1 MB na starcie.

sudo rm /dev/loop0p1
sudo losetup -d /dev/loop0

Na koniec utwórz tabelę partycji.

fdisk extfs

Ustaw pierwszy sektor na 2048 (2048 sektorów * 512 B / sektor = 1 MB), ostatni sektor jako domyślny (tj. Koniec obrazu).

ignis
źródło
1

Osobiście wolę dodawać za pomocą dd.

Zakładam sektory 512-bajtowe tutaj. Sytuacja może dotyczyć sektorów o długości 2048 bajtów, więc po prostu zamień liczby i wykonaj obliczenia matematyczne.

W każdym przypadku używam na przykład pliku testowego 512 MB:

dd if=/dev/zero of=testfs.img bs=512 count=1M mkfs.ext4 testfs.img

MBR

Komponowanie obrazu

Osobiście wolę dołączyć pierwszy MB (2048 sektorów) na jego początku:

dd if=testfs.img skip=2048 bs=512 of=full.img

Na koniec uruchom fdisk, aby utworzyć tablicę partycji (lub skopiuj własną), utworzyłem 1 partycję przy użyciu wartości domyślnych.

Weryfikacja

Aby to sprawdzić, utwórz partycje pętli i automatycznie wykryj:

sudo losetup -fP full.img

I uruchom filena wynikowym partycjonowanym sprzężeniu zwrotnym:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files)

GPT

Komponowanie obrazu

Ja osobiście wolę dołączyć pierwszy MB (2048 sektorów, ponieważ gdisk ustawi domyślnie na tę liczbę, ponieważ jest wyrównany 1 MB) na początku na początku MBR i 34 sektory na końcu (lub 2048 na pełny MB) na końcu GPT (sektor końcowy może być inny). Pominięcie końca GPT może spowodować utratę danych:

dd if=testfs.img skip=2048 bs=512 of=full.img dd if=/dev/zero seek=1050624 bs=512 of=full.img count=34

Na koniec uruchom gdisk, aby utworzyć tablicę partycji (lub skopiuj własną), utworzyłem 1 partycję przy użyciu wartości domyślnych.

Weryfikacja

Aby to sprawdzić, utwórz partycje pętli i automatycznie wykryj:

sudo losetup -fP full.img

I uruchom filena wynikowym partycjonowanym sprzężeniu zwrotnym:

sudo file -s /dev/loop2p1 /dev/loop2p1: Linux rev 1.0 ext4 filesystem data, UUID=ae2945fd-54b5-486f-8dd0-9b18d6ae01b4 (extents) (large files) (huge files) Ta metoda zapewnia brak zgadywania, zmiany rozmiaru lub ręcznego wyrównywania.

Dan Dart
źródło
Jak znaleźć końcowy sektor obrazu w gpt
Anwar
Kiedy to uruchomiłem sudo file -s /dev/loop11p1, dostałem /dev/loop11p1: data. Który wcześniej był systemem plików ext4. Wynikowy plik full.img jest mniejszy. Myślę, że masz odwrócone rozwiązanie.
Anwar
Myślę, że masz na myśli seek=2048to polecenie dd if = testfs.img skip = 2048 bs = 512 of = full.img
Anwar