สร้างอิมเมจของไดรฟ์ USB โดยไม่มีการแบ่งพาร์ติชัน


10

ฉันมีไดรฟ์ USB 8GB ติดตั้งกับระบบของฉันซึ่งมีลักษณะดังนี้:

[root@host]# fdisk -l /dev/sdb

Disk /dev/sdb: 8462 MB, 8462008320 bytes
255 heads, 63 sectors/track, 1028 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x5c0894d9

Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1           9       72261    e  W95 FAT16 (LBA)
/dev/sdb2              10         103      755055   83  Linux
[root@host]# 

ดังนั้นโดยทั่วไปแล้วพาร์ติชัน FAT ของฉันอยู่ที่ประมาณ 70 MB, ext2 พาร์ติชันอยู่ที่ประมาณ 740MB และพื้นที่ที่เหลือ (~ 7 GB) ไม่ได้ถูกจัดสรร ตอนนี้เมื่อฉันฮาร์ดไดรฟ์ USB ของฉันผ่าน:

dd if=/dev/sdb of=myimage.img bs=1M

ไฟล์เอาต์พุต (myimage.img) อยู่ที่ประมาณ 8GB ซึ่งเป็นการทำงานปกติของ dd

คำถาม: สิ่งที่ฉันกำลังมองหาคือวิธีการโคลนฮาร์ดไดรฟ์ USB ของฉันโดยตรงโดยไม่ต้องจัดสรรพื้นที่ว่างเพื่อให้ไฟล์ผลลัพธ์ของฉันมีขนาดประมาณ 1 GB ที่ไม่บีบอัดแทนที่จะเป็น 8 GB เหตุผลที่ฉันถามคือเนื่องจากไฟล์ที่ส่งออก (myimage.img) กำลังถูกใช้โดยโปรแกรมจำลองการทำงานเพื่อบูตอิมเมจ เครื่องมือจำลองสามารถจัดการไฟล์ 8 GB ได้ แต่ฉันไม่ต้องการเสียพื้นที่ดิสก์ของฉัน


1
นี่เป็นปัญหาที่คล้ายกันกับโซลูชันที่น่าสนใจ: serverfault.com/q/281628/141604
สัปดาห์

คำตอบ:


11

ถ้าฉันเข้าใจถูกต้องคุณต้องการสร้างภาพจากจุดเริ่มต้นของดิสก์ไปยังจุดสิ้นสุดของพาร์ติชันล่าสุด

พารามิเตอร์สำหรับการที่ไม่นี้คือdd count=พาร์ติชันสุดท้ายของคุณจะสิ้นสุดที่ 103 และการนับจะต้องมี 1 พิเศษ (104) และขนาดหน่วยของคุณคือ 8225280 ไบต์ (ตามfdisk -lผลลัพธ์) ดังนั้นคุณสามารถแก้ไขคำสั่งของคุณด้วยวิธีนี้:

dd if=/dev/sdb of=myimage.img bs=8225280 count=104

อย่างไรก็ตามฉันขอแนะนำให้คุณเรียกใช้fdisk -u -l /dev/sdbแทน กระบอกสูบไม่เกี่ยวข้องกันมากนักในยุคนี้อีกต่อไปดังนั้นคุณจะดีขึ้นถ้าคุณเห็นจำนวนภาคเพื่อหลีกเลี่ยงข้อผิดพลาดในการปัดเศษ จากนั้นคุณจะต้องเรียกใช้:

dd if=/dev/sdb of=myimage.img count=...

โดยที่ count จะถูกตั้งค่าเป็นหมายเลขที่คุณได้รับจากfdisk -u -lตอนท้ายของพาร์ติชันล่าสุดบวกหนึ่งแทนที่สิ่งที่เคยเป็น 104 ขนาดบล็อกเริ่มต้นสำหรับddคือ 512 ไบต์ซึ่งเป็นหน่วยที่fdisk -u -lจะใช้ในการส่งออก

ตารางพาร์ติชั่นสำรองของพาร์ติชั่น GPT จะถูกเก็บไว้ที่ท้ายดิสก์ แต่เนื่องจากคุณไม่ได้ใช้ GPT คุณจะไม่เป็นไร


2

คุณเพียงแค่ต้องบอก DD เพียงอ่านส่วนหนึ่งของไดรฟ์ที่คุณสนใจใน. countพารามิเตอร์ที่คุณกำลังมองหาอยู่

ดังนั้นใช้ขนาดกระบอกสูบของคุณที่ 8,225,280 และคูณจำนวนกระบอกสูบที่ใช้งานอยู่ที่ 103 และคุณจะได้รับ 847,203,840 ไบต์ เนื่องจากคุณใช้ขนาดบล็อกหนึ่งเมกะไบต์ให้แปลงไบต์นั้นเป็นเมกะไบต์ซึ่งคือ 808

ดังนั้นคำสั่งของคุณคือ dd if=... of=... bs=1M count=808

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.