วิธีการปรับขนาดไฟล์ img ที่สร้างด้วย dd


19

ฉันมีภาพ DD จากการ์ด SD 4GB ที่มีสองพาร์ติชันสองพาร์ติชันเหล่านี้ใช้งานได้ประมาณ 800 MB เท่านั้นและฉันต้องการลดขนาดของ img img

ไม่มีใครรู้วิธีลบ "พื้นที่ว่าง" ออกจากไฟล์ img หรือไม่?


คุณอาจต้องการเพิ่มสิ่งที่ผลลัพธ์ที่ต้องการคือ เช่น: ภาพกลับไปที่การ์ดเพื่อจัดเก็บในแผ่นซีดี
Wayne

คำตอบ:


8

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

# losetup --find --partscan foo.img
# lsblk
NAME      MAJ:MIN RM    SIZE RO TYPE MOUNTPOINT
loop0       7:0    0   4096M  0 loop 
├─loop0p1 259:0    0   2048M  0 loop 
└─loop0p2 259:1    0   2048M  0 loop 
# for part in /dev/loop0p*; do
    mount $part /mnt
    dd if=/dev/zero of=/mnt/filler conv=fsync bs=1M
    rm /mnt/filler
    umount /mnt
  done
dd: error writing ‘/mnt/filler’: No space left on device
dd: error writing ‘/mnt/filler’: No space left on device
# losetup --detach /dev/loop0

จากนั้นบีบอัดมันด้วยเครื่องมือเหมือนหรือgzip xzแม้ที่ระดับการบีบอัดที่ต่ำที่สุดค่าศูนย์แบบยาวก็จะบีบอัดได้ดี:

# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz

โปรดทราบว่าคุณต้องคลายการบีบอัดภาพเมื่อเขียนลงดิสก์ วิธีนี้จะคลายการบีบอัดเป็น 'สด':

# cat foo.img.gz | gunzip | dd of=/dev/sda

โปรดทราบว่าอุปกรณ์ส่งออก (sda) จะต้องมีขนาดเพียงพอเพื่อให้พอดีกับภาพต้นฉบับมิฉะนั้นข้อมูลจะสูญหายหรือเสียหาย


อีกทางเลือกหนึ่งหากคุณต้องการใช้ภาพต่อไปเช่นเครื่องเสมือน - เป็นการแปลงภาพดิบเป็นหนึ่งในรูปแบบภาพที่ใช้โดยซอฟต์แวร์การจำลองเสมือน เช่น qcow2 สำหรับ Qemu, VDI สำหรับ VirtualBox หรือ VMDK สำหรับ VMware

โปรดทราบว่าสิ่งนี้ยังต้องการให้คุณเตรียมภาพโดยการทำความสะอาดพื้นที่ว่างโดยใช้วิธีการด้านบน

# qemu-img convert -f raw -O qcow2 foo.img foo.qcow

# qemu-img convert -f raw -O vmdk foo.img foo.vmdk

แต่ถ้ามันจะถูกเขียนลงดิสก์จริงอีกครั้งคุณต้องแปลงมันกลับเป็นอิมเมจแบบดิบ


1
คุณจะมั่นใจได้อย่างไรว่าไฟล์ทั้งหมดที่จัดเก็บอยู่ในพาร์ติชั่นนั้นไม่ได้กระจัดกระจายอยู่รอบ ๆ ดิสก์
Valerio Santinelli

เพราะฉันคิดว่าไฟล์ไม่ได้เขียนเรียงตามลำดับบนดิสก์และหากไฟล์อยู่ที่ส่วนท้ายของพื้นที่จัดเก็บเมื่อฉันลดขนาดลงฉันจะสูญเสียเนื้อหาของไฟล์นั้น
Valerio Santinelli

เนื่องจาก OP กำลังถามวิธีย่อขนาดอิมเมจของดิสก์โดยไม่ทำให้ข้อมูลสูญหาย หากคุณตัดภาพในขนาดที่แน่นอนคุณจะไม่สามารถมั่นใจได้ว่าข้อมูลจะถูกเก็บรักษาไว้
Valerio Santinelli

@ValerioSantinelli: ฉันจะแนะนำให้ตัดภาพอย่างไร
user1686

1
@ValerioSantinelli: โดยการใช้เครื่องมือระบบแฟ้มปรับขนาด apropriate สำหรับระบบแฟ้มของคุณเช่นresize2fsหรือntfsresize(Linux มีเครื่องมือสำหรับการไม่มีไขมัน) ก่อนที่จะเขียนไปยังอุปกรณ์ที่มีขนาดเล็กหรือโดยการสร้างระบบแฟ้มสดและการคัดลอกไฟล์เพียง
user1686

22

การใช้resize2fsง่ายกว่ามาก

resize2fs -M xxx.img

คุณจะถูกขอให้ e2fsck ก่อนดังนั้น:

e2fsck -f -y xxx.img

(ต้องไม่ติดตั้งรูปภาพ!)

หมายเหตุ: มันจะทำงานเฉพาะในกรณีที่ภาพเป็นพาร์ติชันเดียวถ้ามันเป็นอุปกรณ์บล็อกทั้งหมดที่มีพาร์ทิชัน mutiple ดูคำตอบข้างต้น ...


ข้อควรทราบ: สำหรับพาร์ติชันหลายพาร์ติชันใช้losetup --find --partscan xxx.imgเพื่อตั้งค่าไฟล์รูปภาพเป็นอุปกรณ์ลูป จากนั้นรันlsblkเพื่อค้นหาพาร์ติชันของอุปกรณ์ลูป
Yihui Xiong

ดูเหมือนว่าจะไม่สามารถใช้งานได้กับอิมเมจ ISO ที่มีระบบปฏิบัติการ หลังจากปรับขนาดระบบ dosen't boot
SR

ระบบปฏิบัติการ @SR Linux
Rolf

1
นี่เป็นคำตอบที่ดีมาก แต่resize2fsสำหรับextNพาร์ติชันประเภทเท่านั้น พาร์ติชั่นประเภทอื่นจะต้องใช้เครื่องมืออื่น ๆ
Rolf

2

ฉันลองใช้qemu-imgด้วยและมันก็ใช้งานได้เหมือนมีเสน่ห์:

qemu-img resize test.img 2G

เรากำลังปรับขนาดtest.imgเพื่อให้เป็น2G (2GB)

ทำงานไร้ที่ติสำหรับฉัน


1
ยอดเยี่ยมทำงานไร้ที่ติสำหรับฉันด้วยการบีบอัดภาพ Raspbian ทำงานเต็มที่!
ffleandro

ทุกอย่างทำงานได้ดี แต่หลังจากบูทเครื่องแล้วการวิ่งdf -hจะแสดงขนาดดั้งเดิม เป็นไปได้อย่างไร?
ffleandro

เห็นได้ชัดว่า qemu-img ไม่ได้เป็นตารางพาร์ทิชันดังนั้นมันบีบอัด. img ได้อย่างไร?
ffleandro

ฉันสามารถปรับขนาดดิสก์. img เป็น 1M ซึ่งทำลายภาพดิสก์อย่างแน่นอน ความคิดใดที่จะทำให้การปรับขนาดปลอดภัยยิ่งขึ้น?
lesca

1

ฉันใช้วิธี gparted กับคอมพิวเตอร์ Ubuntu 16.10 ของฉัน:

1) แมปไฟล์ img ไปยังพาร์ติชันวนซ้ำถัดไปที่มีอยู่losetupตามที่อธิบายไว้ในโพสต์ก่อนหน้าดังที่กล่าวไว้ข้างต้น

2) ตรวจสอบlsblkว่าไฟล์รูปภาพของคุณถูกแมปไว้ที่ใด/dev/loop0

3) ดำเนินการ sudo gparted /dev/loop0

4) ลดขนาดพาร์ติชั่นวนรอบตามที่เห็นสมควร; โปรดตรวจสอบให้แน่ใจว่าได้ถอดพาร์ติชันเหล่านี้แล้ว

5) ดำเนินการfdisk /dev/loop0แล้วpกดปุ่มนี้จะแสดงขนาดบล็อกและหมายเลขบล็อกสิ้นสุดของพาร์ติชันต่างๆ

6) ดำเนินการdd if=/dev/loop0 of=shrunk_image_file.imgนำไปใช้กับคำสั่งที่ตัวเลือกbs=[BlockSize]และcount=[EndBlockNumberOfLastLoopPartition+1]และคุณจะต้องหดและ rightsized ไฟล์ภาพ

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