แปลงอิมเมจของพาร์ติชันเป็นรูปของดิสก์ด้วยตารางพาร์ติชัน


20

dd if=/dev/sdXN of=image.binผมมีภาพของพาร์ทิชันที่มีอยู่สร้างขึ้นด้วยการ ตอนนี้ฉันต้องการใช้ภาพนี้เป็นพื้นฐานสำหรับเครื่องเสมือน ฉันรู้วิธีแปลงรูปเป็นรูปแบบที่ VirtualBox สามารถใช้ได้

ปัญหาคืออิมเมจ "ดิสก์" เป็นเพียงภาพของพาร์ติชันหนึ่งเท่านั้นดังนั้นจึงไม่มี MBR หรือตารางพาร์ติชัน สิ่งนี้ทำให้การบูต VM ยากมาก

มีวิธีง่าย ๆ ในการสร้างอิมเมจของพาร์ติชันเพื่อสร้างอิมเมจของดิสก์ที่เหมาะสมรวมถึงตารางพาร์ติชั่นหรือไม่?

คำตอบ:


13

คุณสามารถทำได้บนเครื่องโฮสต์ เครื่องมือส่วนใหญ่เช่นfdiskจะทำงานกับไฟล์และkpartxอนุญาตให้คุณเข้าถึงพาร์ติชันในไฟล์

  1. สร้างภาพกระจัดกระจาย 100GiB ใหม่ที่ว่างเปล่า (ทำให้นี่ใหญ่กว่าขนาดของอิมเมจพาร์ติชันเล็กน้อย)

    dd if=/dev/zero of=myvm.img bs=1G count=0 seek=100
    
  2. แบ่งไฟล์ภาพด้วย fdisk

    fdisk myvm.img
    
  3. ทำให้พาร์ติชันในไฟล์ภาพพร้อมใช้งานเป็นอุปกรณ์แต่ละชิ้น

    sudo kpartx -a myvm.img
    
  4. คัดลอกอิมเมจพาร์ติชันลงในพาร์ติชัน

    sudo cp image.bin /dev/mapper/loop0p1
    
  5. ขยายระบบไฟล์เพื่อเติมพาร์ติชันทั้งหมด

    sudo resize2fs /dev/mapper/loop0p1
    
  6. ปิดพาร์ติชัน

    sudo kpartx -d myvm.img
    
  7. ถอดอุปกรณ์ลูปแบ็ค

    sudo losetup -D
    

สิ่งนี้จะไม่ทำให้พาร์ติชันที่สร้างขึ้นในรูปภาพ "ไม่ตรงกับ" ความยาวของพาร์ติชันที่ถูกถ่ายภาพหรือไม่? และมีวิธีการแก้ปัญหานั้นหรือไม่? และตัวจัดการระบบไฟล์ "ฉลาดพอ" จะสามารถบอกได้ว่ามันไม่ได้ใช้ขนาดพาร์ติชั่นทั้งหมดและขยายตัวให้พอดี
killermist

@killermist คำตอบล่าสุด
mgorven

นี่เป็นคำตอบที่ดี คุณรู้วิธีการหลีกเลี่ยงการคัดลอกสิ่งทั้งหมดในกระบวนการหรือไม่?
มิกะฟิสเชอร์

@MikaFischer น่าเสียดายที่ไม่ใช่เพราะตารางพาร์ติชันจำเป็นต้องมีอยู่ก่อนพาร์ติชันและฉันไม่รู้กลไกใด ๆ ในการเพิ่มข้อมูลลงในไฟล์
mgorven

ฉันคิดว่าคำตอบของ Harun นั้นดีกว่าเพราะมันทำได้ง่ายและเขียนสคริปต์ได้
philcolbourn

9

ฉันแน่ใจว่าปัญหาดั้งเดิมได้รับการแก้ไขนานแล้ว แต่สำหรับใครก็ตามที่มีปัญหาคล้ายกัน:

วิธีหนึ่งในการหลีกเลี่ยงการคัดลอกอิมเมจทั้งหมดคือการสร้างอิมเมจรูปแบบ. vmdk ที่อ้างถึงไฟล์ขอบเขตแยกต่างหากสำหรับตารางพาร์ติชันและเนื้อหาพาร์ติชัน

ฉันมีตัวอย่างนี้วางอยู่ในไฟล์. vmdk จากการทดสอบที่ฉันทำเมื่อไม่นานมานี้:

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

ซึ่งหมายความว่า 63 ส่วนที่เริ่มต้นจาก offset 0 อ่านจากไฟล์ raw "parttable.bin" แต่ภาค 63 ขึ้นไปมาจาก raw partition dump "partition-image.bin" (แน่นอนแทนที่ 63 ด้วยอ็อฟเซ็ตจริงไปยังพาร์ติชันแรกโดยปกติคือ 2048 วันนี้)

ผลลัพธ์ที่ได้คือจากภายใน VBox ดูเหมือนว่าคุณได้เตรียมตารางพาร์ติชันไว้ด้านหน้าของอิมเมจพาร์ติชันโดยไม่ต้องทำการคัดลอกที่มีความยาว

แบ่งพาร์ติชันของไดรฟ์จากภายใน VM และถ้าคุณได้รับออฟเซ็ตที่ถูกต้องคุณควรเห็นเนื้อหาอิมเมจพาร์ติชันของคุณภายในพาร์ติชันที่สร้างขึ้นใหม่


2
ฉันคิดว่า '63' ในบรรทัดที่สองต้องเป็น 0 หาก partition-image.bin เป็นอิมเมจพาร์ติชัน ฉันเพิ่งทำอะไรแบบนี้และฉันจำเป็นต้องตั้งค่าออฟเซ็ตนี้ในไฟล์อิมเมจพาร์ติชันเป็นศูนย์ philatwarrimoo.blogspot.com.au/2014/01/…
philcolbourn


อัจฉริยภาพ ฉันต้องทำเช่นนี้เพื่อใช้พาร์ติชัน Windows สำหรับ VM บนโฮสต์ Linux และนี่เป็นสิ่งเดียวที่ทำงานได้โดยใช้ขั้นตอนจาก @philcolbourn: superuser.com/a/804396/93066
bmaupin

สิ่งที่ควรอยู่ในไฟล์ vmdk ที่เหลือ?
gozzilli

1
@gozzilli ส่วนที่เหลือของไฟล์เป็นรายละเอียดมากมายเช่นหมายเลขรุ่นของไฟล์, ประเภทของอะแดปเตอร์ดิสก์, uuids และรูปทรงเรขาคณิตของดิสก์ ฉันไม่รู้วิธีเขียนบิตเหล่านั้น ฉันอยากจะแนะนำเพียงแค่ใช้เครื่องมือในการสร้าง vmdk ที่ชี้ไปที่ภาพดิสก์แล้วแก้ไขเฉพาะบรรทัดที่อธิบายว่าจะรับส่วนหัวพาร์ติชันพิเศษจากที่ใด
Harun

3

ปัญหาที่น่าสนใจ นี่คือสิ่งที่ฉันจะทำ:

  1. สร้าง VM ด้วยดิสก์ที่มีขนาดใหญ่พอสมควรแล้วบูตจากซีดีกู้คืน
  2. เข้าถึงดิสก์อิมเมจที่มีอยู่ของคุณอย่างใด (nfs, cifs ฯลฯ )
  3. สร้างพาร์ติชันที่คุณต้องการบนโลคัลดิสก์ของ VM
  4. ใช้ dd เพื่อเขียนอิมเมจพาร์ติชันลงในพาร์ติชันบนดิสก์ vm

หลังจากเสร็จสิ้นคุณจะต้องอัปเดตบูตโหลดเดอร์ของคุณ สมมติว่าคุณกำลังใช้ GRUB ติดตั้งพาร์ติชันที่เขียนขึ้นใหม่จากนั้น chroot ลงในนั้นและเรียกใช้update-grub(ระวังแม้ว่าคุณอาจต้องปรับแต่งไฟล์ปรับแต่งก่อนที่มันจะทำงานได้)

โชคดี!


2

คุณสามารถปรับขนาดระบบไฟล์ด้วย GParted

สร้างภาพทดสอบ:

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

ฉันไม่ได้ใช้ resize2fs เพราะมันปรับขนาดไฟล์แทนที่จะปล่อยให้มีพื้นที่ว่าง

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

ฟรี 1 MB เมื่อเริ่มต้น

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

ในที่สุดสร้างตารางพาร์ทิชัน

fdisk extfs

ตั้งค่าเซกเตอร์แรกเป็น 2048 (2048 เซกเตอร์ * 512 B / เซกเตอร์ = 1MB) เซกเตอร์สุดท้ายเป็นค่าเริ่มต้น (เช่นจุดสิ้นสุดของรูปภาพ)


1

ddผมเองชอบที่จะผนวกการใช้

ฉันสมมุติว่ามี 512- ส่วนไบต์ที่นี่ อาจมีกรณีสำหรับภาค 2048 ไบต์ดังนั้นเพียงแค่สลับตัวเลขในและทำคณิตศาสตร์

ในแต่ละกรณีฉันใช้ไฟล์ทดสอบ 512MB ตัวอย่างเช่น:

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

MBR

การแต่งภาพ

โดยส่วนตัวฉันต้องการผนวก MB แรก (2048 ส่วน) เพื่อเริ่มต้น:

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

สุดท้ายเรียกใช้ fdisk เพื่อสร้างตารางพาร์ติชัน (หรือคัดลอกด้วยตัวคุณเอง) ฉันสร้างพาร์ติชัน 1 รายการโดยใช้ค่าเริ่มต้น

การตรวจสอบ

หากต้องการตรวจสอบให้สร้างพาร์ติชันวนซ้ำและตรวจจับอัตโนมัติ:

sudo losetup -fP full.img

และรันfileบนอุปกรณ์ลูปแบ็คที่แบ่งพาร์ติชันแล้วได้ผล:

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

การแต่งภาพ

ฉันเองต้องการผนวก MB แรกต่อไป (2048 ส่วนเนื่องจาก gdisk จะใช้ค่าเริ่มต้นเป็นตัวเลขนี้เนื่องจากมีการจัดตำแหน่ง 1 MB) สำหรับการเริ่มต้นสำหรับ MBR เริ่มต้นและ 34 ส่วนสิ้นสุด (หรือ 2048 สำหรับเต็ม MB) สำหรับจุดสิ้นสุด GPT (ส่วนท้ายอาจแตกต่างกัน) การละเว้นจุดสิ้นสุด GPT อาจทำให้ข้อมูลของคุณสูญหาย:

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

สุดท้ายเรียกใช้ gdisk เพื่อสร้างตารางพาร์ติชัน (หรือคัดลอกด้วยตัวคุณเอง) ฉันสร้างพาร์ติชั่น 1 ตัวโดยใช้ค่าเริ่มต้น

การตรวจสอบ

หากต้องการตรวจสอบให้สร้างพาร์ติชันวนซ้ำและตรวจจับอัตโนมัติ:

sudo losetup -fP full.img

และรันfileบนอุปกรณ์ลูปแบ็คที่แบ่งพาร์ติชันแล้วได้ผล:

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 ได้อย่างไร
อันวาร์

เมื่อฉันทำงานนี้ผมได้sudo file -s /dev/loop11p1 /dev/loop11p1: dataซึ่งก่อนหน้านี้เป็นระบบไฟล์ ext4 และผลที่ได้คือ full.img เล็กกว่า ฉันคิดว่าคุณมีทางออกที่ตรงกันข้าม
Anwar

ฉันคิดว่าคุณหมายถึงseek=2048ในคำสั่งนี้ววถ้า = testfs.img skip = 2048 bs = 512 จาก = full.img
Anwar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.