Konversi gambar partisi menjadi gambar disk dengan tabel partisi

20

Saya memiliki gambar partisi yang ada dihasilkan dd if=/dev/sdXN of=image.bin. Sekarang saya ingin menggunakan gambar ini sebagai dasar untuk mesin virtual. Saya tahu cara mengubah gambar menjadi format yang dapat digunakan VirtualBox.

Masalahnya adalah bahwa gambar "disk" benar-benar hanya gambar dari satu partisi dan karenanya tidak mengandung MBR atau tabel partisi. Ini membuatnya sangat sulit untuk mem-boot VM.

Apakah ada cara sederhana, diberikan gambar partisi, untuk membuat image disk yang tepat, termasuk tabel partisi?

Mika Fischer
sumber

Jawaban:

13

Anda dapat melakukan ini di mesin host. Sebagian besar alat seperti fdiskakan beroperasi pada file, dan kpartxmemberi Anda akses ke partisi dalam file.

  1. Buat gambar jarang 100GiB kosong baru (buat ini sedikit lebih besar dari ukuran gambar partisi)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Partisi file gambar dengan fdisk

    fdisk myvm.img
    
  3. Membuat partisi dalam file gambar tersedia adalah perangkat individual

    sudo kpartx -a myvm.img
    
  4. Salin gambar partisi ke partisi

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Perpanjang sistem file untuk mengisi seluruh partisi

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Tutup partisi

    sudo kpartx -d myvm.img
    
  7. Bongkar perangkat loopback

    sudo losetup -D
    
Mgorven
sumber
Apakah ini tidak membuat partisi yang dibuat dalam gambar "tidak cocok" dengan panjang partisi yang dicitrakan? Dan adakah cara untuk menyelesaikannya? Dan, apakah manajer sistem file yang "cukup pintar" dapat mengatakan bahwa ia tidak menggunakan seluruh ukuran partisi dan memperluas dirinya agar sesuai?
killermist
@killermist Jawaban yang diperbarui.
mgorven
Ini jawaban yang bagus. Apakah Anda tahu cara untuk menghindari menyalin seluruh hal dalam proses?
Mika Fischer
@MikaFischer Sayangnya tidak, karena tabel partisi perlu ada sebelum partisi, dan saya tidak tahu mekanisme untuk menambahkan data ke file.
mgorven
Saya pikir jawaban Harun lebih baik karena mudah dilakukan dan dapat dituliskan.
philcolbourn
9

Saya yakin masalah aslinya sudah dipecahkan sejak lama, tetapi bagi siapa pun yang memiliki masalah serupa:

Salah satu cara untuk menghindari penyalinan seluruh gambar adalah dengan membuat gambar berformat .vmdk yang merujuk ke file tingkat terpisah untuk tabel partisi dan untuk konten partisi.

Saya memiliki potongan ini di dalam file .vmdk dari tes yang saya lakukan beberapa waktu lalu:

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

Ini berarti bahwa 63 sektor mulai dari offset 0 dibaca dari file mentah "parttable.bin", tetapi sektor 63 dan ke atas berasal dari dump partisi mentah "partisi-image.bin". (Tentu saja, ganti 63 dengan offset aktual ke partisi pertama, biasanya 2048 hari ini).

Hasil akhirnya adalah bahwa, dari dalam VBox, sepertinya Anda telah menambahkan tabel partisi ke depan gambar partisi, tanpa harus melakukan operasi penyalinan yang panjang.

Partisi drive dari dalam VM dan, jika Anda mendapatkan offset Anda dengan benar, Anda akan melihat konten gambar partisi Anda di dalam partisi yang baru dibuat.

Harun
sumber
2
Saya pikir '63' pada baris kedua harus 0 jika partisi-image.bin adalah gambar partisi. Saya baru saja melakukan sesuatu seperti ini dan saya perlu mengatur offset ini dalam file gambar partisi menjadi nol. philatwarrimoo.blogspot.com.au/2014/01/...
philcolbourn
Jenius. Saya hanya perlu melakukan ini untuk menggunakan partisi Windows untuk VM pada host Linux, dan ini adalah satu-satunya yang bekerja, menggunakan langkah-langkah dari @philcolbourn: superuser.com/a/804396/93066
bmaupin
Apa yang seharusnya ada di sisa file vmdk?
gozzilli
1
@gozzilli Sisa file adalah banyak detail seperti nomor versi file, tipe adaptor disk, uuids, dan geometri disk. Saya tidak tahu bagaimana menulis bit-bit itu. Saya akan merekomendasikan hanya menggunakan alat untuk membuat vmdk menunjuk ke disk image dan kemudian memodifikasi hanya garis-garis yang menggambarkan di mana mendapatkan header partisi tambahan.
Harun
3

Masalah menarik. Inilah yang akan saya lakukan:

  1. Buat VM dengan disk yang cukup besar lalu boot dari CD pemulihan.
  2. Dapatkan akses ke disk image Anda yang ada, entah bagaimana (nfs, cifs, dll.).
  3. Buat partisi yang Anda perlukan pada disk lokal VM.
  4. Gunakan dd untuk menulis gambar partisi ke partisi pada disk vm.

Setelah ini selesai, Anda harus memperbarui boot loader Anda. Dengan asumsi Anda menggunakan GRUB, pasang partisi yang baru ditulis lalu chroot ke dalamnya dan jalankan update-grub(hati-hati, Anda mungkin perlu menyesuaikan file konfigurasi sebelum itu akan berfungsi dengan benar).

Semoga berhasil!

bahamat
sumber
2

Anda dapat mengubah ukuran sistem file di tempat, dengan GParted.

Buat gambar uji:

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

Saya tidak menggunakan resize2fs, karena mengubah ukuran file, daripada meninggalkan ruang kosong.

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

Gratis 1 MB di awal.

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

Akhirnya, buat tabel partisi.

fdisk extfs

Atur sektor pertama ke 2048 (2048 sektor * 512 B / sektor = 1MB), sektor terakhir default (yaitu, ujung gambar).

ignis
sumber
1

Saya pribadi lebih suka menambahkan menggunakan dd.

Saya mengasumsikan sektor 512-byte di sini. Mungkin ada kasus untuk sektor 2048-byte, jadi ganti saja angka-angkanya dan lakukan perhitungan.

Dalam setiap kasus saya menggunakan file uji 512MB misalnya:

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

MBR

Menyusun gambar

Saya pribadi lebih suka menambahkan MB pertama (2048 sektor) ke awalnya:

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

Akhirnya jalankan fdisk untuk membuat tabel partisi (atau salin sendiri), saya membuat 1 partisi menggunakan nilai default.

Memverifikasi

Untuk memverifikasi, buat partisi lingkaran dan deteksi otomatis:

sudo losetup -fP full.img

Dan jalankan filepada perangkat loopback yang dipartisi yang dihasilkan:

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

Menyusun gambar

Saya pribadi lebih suka menambahkan MB pertama (2048 sektor, karena gdisk akan default ke nomor ini karena 1 MB disejajarkan) ke awal untuk MBR awal dan 34 sektor ke ujungnya (atau 2048 untuk MB penuh) untuk akhir GPT (sektor akhir mungkin berbeda). Mengabaikan GPT akhir mungkin kehilangan data Anda:

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

Akhirnya jalankan gdisk untuk membuat tabel partisi (atau salin sendiri), saya membuat 1 partisi menggunakan nilai default.

Memverifikasi

Untuk memverifikasi, buat partisi lingkaran dan deteksi otomatis:

sudo losetup -fP full.img

Dan jalankan filepada perangkat loopback yang dipartisi yang dihasilkan:

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) Metode ini memastikan tidak ada menebak, mengubah ukuran atau menyelaraskan secara manual.

Dan Dart
sumber
Bagaimana Anda menemukan sektor akhir gambar di gpt
Anwar
Ketika saya menjalankan ini sudo file -s /dev/loop11p1saya mendapat /dev/loop11p1: data. Yang sebelumnya adalah sistem file ext4. Dan full.img yang dihasilkan lebih kecil. Saya pikir Anda punya solusinya terbalik.
Anwar
Saya pikir maksud Anda seek=2048dalam perintah ini dd jika = testfs.img lewati = 2048 bs = 512 of = full.img
Anwar