Chuyển đổi hình ảnh của một phân vùng thành hình ảnh của một đĩa với bảng phân vùng


20

Tôi có một hình ảnh của một phân vùng hiện có được tạo ra với dd if=/dev/sdXN of=image.bin. Bây giờ tôi muốn sử dụng hình ảnh này làm cơ sở cho một máy ảo. Tôi biết cách chuyển đổi hình ảnh thành định dạng mà VirtualBox có thể sử dụng.

Vấn đề là hình ảnh "đĩa" thực sự chỉ là hình ảnh của một phân vùng và do đó không chứa MBR hoặc bảng phân vùng. Điều này làm cho nó rất khó để khởi động VM.

Có một cách đơn giản, được đưa ra một hình ảnh của một phân vùng, để tạo ra một hình ảnh đĩa thích hợp, bao gồm một bảng phân vùng?

Câu trả lời:


13

Bạn có thể làm điều này trên máy chủ. Hầu hết các công cụ như fdisksẽ hoạt động trên các tệp và kpartxcung cấp cho bạn quyền truy cập vào các phân vùng trong một tệp.

  1. Tạo một hình ảnh thưa thớt 100GiB trống mới (làm cho hình này lớn hơn một chút so với kích thước của hình ảnh phân vùng)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. Phân vùng tệp hình ảnh với fdisk

    fdisk myvm.img
    
  3. Làm cho các phân vùng trong tệp hình ảnh có sẵn là các thiết bị riêng lẻ

    sudo kpartx -a myvm.img
    
  4. Sao chép hình ảnh phân vùng vào phân vùng

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. Mở rộng hệ thống tập tin để lấp đầy toàn bộ phân vùng

    sudo resize2fs /dev/mapper/loop0p1
    
  6. Đóng các phân vùng

    sudo kpartx -d myvm.img
    
  7. Tháo dỡ thiết bị loopback

    sudo losetup -D
    

Điều này sẽ không làm cho phân vùng đã tạo trong ảnh "không khớp" với độ dài của phân vùng hình ảnh? Và có cách nào để giải quyết điều đó? Và, liệu người quản lý hệ thống tập tin "đủ thông minh" có thể nói rằng nó không sử dụng toàn bộ kích thước phân vùng và tự mở rộng để phù hợp?
sát thủ

@killermist Cập nhật câu trả lời.
mgorven

Đây là một câu trả lời tốt. Bạn có biết cách nào để tránh sao chép toàn bộ nội dung trong quy trình không?
Mika Fischer

@MikaFischer Rất tiếc là không, vì bảng phân vùng cần tồn tại trước phân vùng và tôi không biết bất kỳ cơ chế nào để thêm dữ liệu vào tệp.
mgorven

Tôi nghĩ câu trả lời của Harun là tốt hơn bởi vì nó dễ làm và có thể được viết kịch bản.
philcolbourn

9

Tôi chắc rằng vấn đề ban đầu đã được giải quyết từ lâu, nhưng đối với bất kỳ ai có vấn đề tương tự:

Một cách để tránh sao chép toàn bộ hình ảnh là tạo một hình ảnh định dạng .vmdk đề cập đến các tệp phạm vi riêng biệt cho bảng phân vùng và cho nội dung phân vùng.

Tôi có đoạn mã này nằm xung quanh trong tệp .vmdk từ một bài kiểm tra tôi đã làm cách đây một thời gian:

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

Điều này có nghĩa là 63 cung bắt đầu từ offset 0 được đọc từ tệp thô "parttable.bin", nhưng sector 63 trở lên đến từ phân vùng thô "phân vùng-image.bin". (Tất nhiên, thay thế 63 bằng phần bù thực tế cho phân vùng đầu tiên, thường là 2048 vào những ngày này).

Kết quả cuối cùng là, từ bên trong VBox, có vẻ như bạn đã đặt trước bảng phân vùng vào phía trước hình ảnh phân vùng, mà không phải thực hiện thao tác sao chép dài.

Phân vùng ổ đĩa từ bên trong VM và, nếu bạn nhận được sự bù đắp của mình, bạn sẽ thấy nội dung hình ảnh phân vùng của mình bên trong phân vùng mới được tạo.


2
Tôi nghĩ rằng '63' trên dòng thứ hai cần phải là 0 nếu phân vùng-image.bin là hình ảnh phân vùng. Tôi vừa mới làm một cái gì đó như thế này và tôi cần đặt phần bù này trong tệp hình ảnh phân vùng thành 0. philatwarrimoo.blogspot.com.au/2014/01/ từ
philcolbourn


Thiên tài. Tôi chỉ phải làm điều này để sử dụng phân vùng Windows cho máy ảo trên máy chủ Linux và đây là điều duy nhất có hiệu quả, sử dụng các bước từ @philcolbourn: superuser.com/a/804394/93066
bmaupin

Điều gì nên có trong phần còn lại của tập tin vmdk?
gozzilli

1
@gozzilli Phần còn lại của tệp là một loạt các chi tiết như số phiên bản tệp, loại bộ điều hợp đĩa, uuids và hình dạng đĩa. Tôi không biết làm thế nào để viết những bit đó. Tôi khuyên bạn chỉ nên sử dụng một công cụ để tạo vmdk chỉ vào hình ảnh đĩa và sau đó chỉ sửa đổi các dòng mô tả nơi nhận tiêu đề phân vùng bổ sung từ đó.
Harun

3

Vấn đề thú vị. Đây là những gì tôi sẽ làm:

  1. Tạo VM với một đĩa lớn một cách thích hợp sau đó khởi động nó từ đĩa CD khôi phục.
  2. Có được quyền truy cập vào hình ảnh đĩa hiện tại của bạn bằng cách nào đó (nfs, cifs, v.v.).
  3. Tạo các phân vùng bạn sẽ cần trên đĩa cục bộ của VM.
  4. Sử dụng dd để ghi hình ảnh phân vùng vào phân vùng trên đĩa vm.

Sau khi hoàn thành, bạn cần cập nhật bộ tải khởi động. Giả sử bạn đang sử dụng GRUB, gắn phân vùng mới được viết sau đó chroot vào nó và chạy update-grub(mặc dù vậy, hãy cẩn thận, bạn có thể cần điều chỉnh các tệp cấu hình của nó trước khi nó hoạt động tốt).

Chúc may mắn!


2

Bạn có thể thay đổi kích thước hệ thống tập tin tại chỗ, với GParted.

Tạo hình ảnh thử nghiệm:

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

Tôi không sử dụng resize2fs, vì nó thay đổi kích thước tệp, thay vì để lại không gian trống.

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

Miễn phí 1 MB khi bắt đầu.

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

Cuối cùng, tạo bảng phân vùng.

fdisk extfs

Đặt khu vực đầu tiên thành 2048 (2048 lĩnh vực * 512 B / sector = 1MB), khu vực cuối cùng mặc định (tức là cuối hình ảnh).


1

Cá nhân tôi thích nối thêm bằng cách sử dụng dd.

Tôi đang giả sử các lĩnh vực 512 byte ở đây. Có thể có một trường hợp cho các lĩnh vực 2048 byte, vì vậy chỉ cần trao đổi các số trong và làm toán.

Trong mỗi trường hợp, tôi đang sử dụng tệp thử nghiệm 512 MB chẳng hạn:

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

MBR

Soạn ảnh

Cá nhân tôi thích nối MB đầu tiên (2048 ngành) vào đầu:

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

Cuối cùng chạy fdisk để tạo bảng phân vùng (hoặc sao chép theo cách riêng của bạn), tôi đã tạo 1 phân vùng bằng các giá trị mặc định.

Đang xác minh

Để xác minh, tạo phân vùng vòng lặp và tự động phát hiện:

sudo losetup -fP full.img

Và chạy filetrên thiết bị loopback phân vùng kết quả:

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

Soạn ảnh

Cá nhân tôi thích nối thêm MB đầu tiên (2048 lĩnh vực, vì gdisk sẽ mặc định cho số này vì nó được căn chỉnh 1 MB) cho đầu MBR và 34 lĩnh vực vào cuối (hoặc 2048 cho một MB đầy đủ) cho đến cuối GPT (khu vực cuối có thể khác nhau). Bỏ qua GPT cuối có thể làm mất dữ liệu của bạn:

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

Cuối cùng chạy gdisk để tạo bảng phân vùng (hoặc sao chép theo cách riêng của bạn), tôi đã tạo 1 phân vùng bằng các giá trị mặc định.

Đang xác minh

Để xác minh, tạo phân vùng vòng lặp và tự động phát hiện:

sudo losetup -fP full.img

Và chạy filetrên thiết bị loopback phân vùng kết quả:

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) Phương pháp này đảm bảo không đoán, thay đổi kích thước hoặc căn chỉnh thủ công.


Làm thế nào để bạn tìm thấy khu vực cuối của hình ảnh trong gpt
Anwar

Khi tôi chạy cái này sudo file -s /dev/loop11p1tôi có /dev/loop11p1: data. Mà trước đây là một hệ thống tập tin ext4. Và kết quả full.img nhỏ hơn. Tôi nghĩ rằng bạn đã có giải pháp đảo ngược.
Anwar

Tôi nghĩ bạn có nghĩa là seek=2048trong lệnh này dd if = testfs.img Skip = 2048 bs = 512 of = full.img
Anwar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.