ฉันมีภาพ DD จากการ์ด SD 4GB ที่มีสองพาร์ติชันสองพาร์ติชันเหล่านี้ใช้งานได้ประมาณ 800 MB เท่านั้นและฉันต้องการลดขนาดของ img img
ไม่มีใครรู้วิธีลบ "พื้นที่ว่าง" ออกจากไฟล์ img หรือไม่?
ฉันมีภาพ DD จากการ์ด SD 4GB ที่มีสองพาร์ติชันสองพาร์ติชันเหล่านี้ใช้งานได้ประมาณ 800 MB เท่านั้นและฉันต้องการลดขนาดของ img img
ไม่มีใครรู้วิธีลบ "พื้นที่ว่าง" ออกจากไฟล์ img หรือไม่?
คำตอบ:
ก่อนอื่นตรวจสอบให้แน่ใจว่าพื้นที่ว่างว่างเปล่าจริง ๆ และไม่มีส่วนที่เหลือของไฟล์ที่ถูกลบ วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คือการสร้างไฟล์ขนาดใหญ่บนดิสก์ที่มีเพียง 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
แต่ถ้ามันจะถูกเขียนลงดิสก์จริงอีกครั้งคุณต้องแปลงมันกลับเป็นอิมเมจแบบดิบ
resize2fs
หรือntfsresize
(Linux มีเครื่องมือสำหรับการไม่มีไขมัน) ก่อนที่จะเขียนไปยังอุปกรณ์ที่มีขนาดเล็กหรือโดยการสร้างระบบแฟ้มสดและการคัดลอกไฟล์เพียง
การใช้resize2fs
ง่ายกว่ามาก
resize2fs -M xxx.img
คุณจะถูกขอให้ e2fsck ก่อนดังนั้น:
e2fsck -f -y xxx.img
(ต้องไม่ติดตั้งรูปภาพ!)
หมายเหตุ: มันจะทำงานเฉพาะในกรณีที่ภาพเป็นพาร์ติชันเดียวถ้ามันเป็นอุปกรณ์บล็อกทั้งหมดที่มีพาร์ทิชัน mutiple ดูคำตอบข้างต้น ...
losetup --find --partscan xxx.img
เพื่อตั้งค่าไฟล์รูปภาพเป็นอุปกรณ์ลูป จากนั้นรันlsblk
เพื่อค้นหาพาร์ติชันของอุปกรณ์ลูป
resize2fs
สำหรับextN
พาร์ติชันประเภทเท่านั้น พาร์ติชั่นประเภทอื่นจะต้องใช้เครื่องมืออื่น ๆ
ฉันลองใช้qemu-imgด้วยและมันก็ใช้งานได้เหมือนมีเสน่ห์:
qemu-img resize test.img 2G
เรากำลังปรับขนาดtest.img
เพื่อให้เป็น2G (2GB)
ทำงานไร้ที่ติสำหรับฉัน
df -h
จะแสดงขนาดดั้งเดิม เป็นไปได้อย่างไร?
ฉันใช้วิธี 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 ไฟล์ภาพ