Bir bölümün görüntüsünü bölüm tablosu olan bir diskin görüntüsüne dönüştürme


20

İle oluşturulan varolan bir bölümün bir görüntü var dd if=/dev/sdXN of=image.bin. Şimdi bu görüntüyü sanal bir makinenin temeli olarak kullanmak istiyorum. Görüntüyü VirtualBox'ın kullanabileceği bir biçime dönüştürmeyi biliyorum.

Sorun, "disk" görüntüsünün sadece bir bölümün görüntüsü olması ve dolayısıyla bir MBR veya bölüm tablosu içermemesidir. Bu, VM'yi başlatmayı çok zorlaştırır.

Bir bölüm tablosu da dahil olmak üzere uygun bir disk görüntüsü oluşturmak için bir bölümün görüntüsü verildiğinde basit bir yol var mı?

Yanıtlar:


13

Bunu ana makinede yapabilirsiniz. Gibi çoğu araç fdiskdosyalar üzerinde çalışır ve kpartxbir dosyadaki bölümlere erişmenizi sağlar.

  1. Yeni bir boş 100GiB seyrek görüntü oluşturun (bunu bölüm görüntüsünün boyutundan biraz daha büyük yapın)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Görüntü dosyasını fdisk

    fdisk myvm.img
    
  3. Görüntü dosyasındaki bölümlerin kullanılabilir olmasını sağlayın

    sudo kpartx -a myvm.img
    
  4. Bölüm görüntüsünü bölüme kopyalayın

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Dosya sistemini tüm bölümü dolduracak şekilde genişletme

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Bölümleri kapatın

    sudo kpartx -d myvm.img
    
  7. Geri döngü aygıtını sökün

    sudo losetup -D
    

Bu, resimdeki oluşturulan bölümün, görüntülenen bölümün uzunluğuyla "eşleşmediğini" yapmaz mı? Bunu çözmenin bir yolu var mı? Ve, "yeterince akıllı" bir dosya sistemi yöneticisi bölümün tamamını kullanmadığını söyleyebilir ve kendini sığacak şekilde genişletebilir mi?
killermist

@killermist Güncellenmiş yanıt.
mgorven

Bu iyi bir cevap. İşlemdeki her şeyi kopyalamaktan kaçınmanın herhangi bir yolunu biliyor musunuz?
Mika Fischer

@MikaFischer Ne yazık ki, çünkü bölüm tablosu bölüm önce var olması gerekir, ve ben bir dosyaya veri başına herhangi bir mekanizma bilmiyorum.
mgorven

Bence Harun'un cevabı daha iyi çünkü yapılması kolay ve yazılabilir.
philcolbourn

9

Eminim orijinal problem uzun zaman önce çözüldü, ancak benzer bir sorunu olan herkes için:

Tüm görüntüyü kopyalamaktan kaçınmanın bir yolu, bölüm tablosu ve bölüm içerikleri için ayrı ayrı dosyaları ifade eden bir .vmdk biçiminde görüntü oluşturmaktır.

Bir süre önce yaptığım bir testten bir .vmdk dosyasında bu parçacığı var:

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

Bu, ofset 0'dan başlayan 63 sektörün "parttable.bin" ham dosyasından okunduğu, ancak 63 ve daha yukarılarının ham bölüm dökümü "partition-image.bin" den geldiği anlamına gelir. (Elbette, 63'ü ilk bölüme gerçek ofset ile değiştirin, genellikle bu günlerde 2048).

Sonuç olarak, VBox içinden, uzun kopyalama işlemini yapmak zorunda kalmadan bölüm tablosunu bölüm görüntüsünün önüne eklediğiniz anlaşılıyor.

Sürücüyü VM içinden bölümleyin ve ofsetlerinizi doğru şekilde ayarlarsanız, bölüm görüntü içeriklerinizi yeni oluşturulan bölüm içinde görmelisiniz.


2
Partition-image.bin bir partition image ise, ikinci satırdaki '63' değerinin 0 olması gerektiğini düşünüyorum. Ben sadece böyle bir şey yaptım ve bölüm görüntü dosyasında bu ofset sıfıra ayarlamak gerekiyordu. philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn


Cin. Bir Linux ana bilgisayarındaki bir VM için bir Windows bölümü kullanmak zorunda kaldım ve @philcolbourn'daki adımları kullanarak işe yarayan tek şey bu oldu: superuser.com/a/804396/93066
bmaupin

Vmdk dosyasının geri kalanında ne olmalıdır?
gozzilli

1
@gozzilli Dosyanın geri kalanı, dosya sürüm numaraları, disk bağdaştırıcısı türü, uuids ve disk geometrisi gibi bir grup ayrıntıdır. Bu parçaları nasıl yazacağımı bilmiyorum. Disk görüntüsüne işaret eden bir vmdk oluşturmak için sadece bir araç kullanmanızı ve ardından yalnızca ekstra bölüm başlığının nereden alınacağını açıklayan satırları değiştirmenizi öneririm.
Harun

3

İlginç bir sorun. İşte yapacağım şey:

  1. VM'yi uygun büyüklükte bir diskle oluşturun ve ardından kurtarma CD'sinden önyükleyin.
  2. Mevcut disk görüntünüze bir şekilde erişin (nfs, cifs, vb.).
  3. VM'nin yerel diskinde ihtiyacınız olan bölümleri oluşturun.
  4. Bölüm görüntüsünü vm diskteki bölüme yazmak için dd'yi kullanın.

Bu yapıldıktan sonra önyükleme yükleyicinizi güncellemeniz gerekir. GRUB kullandığınızı varsayarak, yeni yazılan bölümü takın ve içine krokeleyin ve çalıştırın update-grub(dikkatli olun, doğru çalışmadan önce yapılandırma dosyalarını ayarlamanız gerekebilir).

İyi şanslar!


2

GParted ile dosya sistemini yerinde yeniden boyutlandırabilirsiniz.

Test görüntüsünü oluşturun:

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

Boş alan bırakmak yerine dosyayı yeniden boyutlandırdığı için resize2fs kullanmıyorum.

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

Başlangıçta 1 MB ücretsiz.

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

Son olarak, bölüm tablosunu oluşturun.

fdisk extfs

İlk sektörü 2048'e (2048 sektör * 512 B / sektör = 1MB), son sektörü varsayılana (yani görüntü sonu) ayarlayın.


1

Ben şahsen kullanarak eklemeyi tercih ediyorum dd.

Burada 512 baytlık sektörler olduğunu varsayıyorum. 2048 baytlık sektörler için bir durum olabilir, bu yüzden sadece sayıları değiştirin ve matematik yapın.

Her durumda örneğin bir 512MB test dosyası kullanıyorum:

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

MBR

Görüntünün oluşturulması

Şahsen ilk MB'yi (2048 sektör) başlangıcına eklemeyi tercih ediyorum:

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

Son olarak bölüm tablosunu oluşturmak için fdisk'i çalıştırın (veya kendi kopyasını kendiniz kopyalayın), varsayılan değerleri kullanarak 1 bölüm oluşturdum.

Doğrulanıyor

Doğrulamak için döngü bölümleri oluşturun ve otomatik algılayın:

sudo losetup -fP full.img

Ve filesonuçta bölümlenmiş geri döngü aygıtında çalıştırın :

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

Görüntünün oluşturulması

Şahsen ilk MBR'yi (2048 sektör, gdisk varsayılan olarak 1 MB hizalanmış olduğu için bu sayıya varsayılan olarak) eklemeyi tercih ediyorum. GPT (son sektör farklı olabilir). Son GPT'yi atlamak verilerinizi kaybedebilir:

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

Son olarak bölüm tablosunu oluşturmak için gdisk'i çalıştırın (ya da kendiniz kopyalayın), varsayılan değerleri kullanarak 1 bölüm oluşturdum.

Doğrulanıyor

Doğrulamak için döngü bölümleri oluşturun ve otomatik algılayın:

sudo losetup -fP full.img

Ve filesonuçta bölümlenmiş geri döngü aygıtında çalıştırın :

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) Bu yöntem hiçbir tahmin, yeniden boyutlandırma veya manuel hizalama yapılmasını önler.


Görüntünün son sektörünü gpt'de nasıl buluyorsunuz
Anwar

Bunu koştuğumda sudo file -s /dev/loop11p1aldım /dev/loop11p1: data. Daha önce bir ext4 dosya sistemi vardı. Ve ortaya çıkan dolu. İmg daha küçük. Sanırım çözüm tersine döndü.
Anwar

Bence seek=2048bu komutta dd if = testfs.img atla = 2048 bs = 512 / = full.img
Anwar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.