Tôi có hình ảnh DD từ thẻ SD 4GB có hai phân vùng, hai phân vùng này chỉ sử dụng tối đa khoảng 800 MB và do đó tôi muốn giảm kích thước của img fie.
Có ai biết cách xóa "dung lượng trống" khỏi tệp img không?
Tôi có hình ảnh DD từ thẻ SD 4GB có hai phân vùng, hai phân vùng này chỉ sử dụng tối đa khoảng 800 MB và do đó tôi muốn giảm kích thước của img fie.
Có ai biết cách xóa "dung lượng trống" khỏi tệp img không?
Câu trả lời:
Trước tiên, hãy đảm bảo không gian trống thực sự trống và không chứa phần còn lại của các tệp đã xóa. Cách dễ nhất để đạt được điều này là tạo một tệp khổng lồ trên đĩa, chỉ chứa các byte rỗng, sau đó xóa nó.
# 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
Sau đó nén nó bằng một công cụ như gzip
hoặc xz
. Ngay cả ở mức nén thấp nhất, một chuỗi số không dài sẽ nén tốt:
# ls -s
4096M foo.img
# gzip foo.img
# ls -s
11M foo.img.gz
Lưu ý rằng bạn phải giải nén hình ảnh khi ghi nó trở lại đĩa. Điều này sẽ giải nén nó 'sống':
# cat foo.img.gz | gunzip | dd of=/dev/sda
Lưu ý rằng thiết bị đầu ra (sda) phải có kích thước đủ để vừa với ảnh gốc , nếu không dữ liệu sẽ bị mất hoặc bị hỏng.
Một phương pháp khác, nếu bạn muốn tiếp tục sử dụng hình ảnh - ví dụ như với máy ảo - là chuyển đổi hình ảnh thô thành một trong các định dạng hình ảnh được sử dụng bởi phần mềm ảo hóa; ví dụ: qcow2 cho Qemu, VDI cho VirtualBox hoặc VMDK cho VMware.
Lưu ý rằng điều này vẫn yêu cầu bạn chuẩn bị hình ảnh bằng cách làm sạch không gian trống bằng phương pháp trên.
# qemu-img convert -f raw -O qcow2 foo.img foo.qcow
# qemu-img convert -f raw -O vmdk foo.img foo.vmdk
Nhưng nếu nó sẽ được ghi vào đĩa thực một lần nữa, bạn phải chuyển đổi nó trở lại thành một hình ảnh thô.
resize2fs
hoặc ntfsresize
(Linux không có công cụ cho FAT), trước khi ghi nó vào thiết bị nhỏ hơn hoặc bằng cách tạo một hệ thống tệp mới và sao chép chỉ các tệp.
Sử dụng resize2fs
dễ dàng hơn nhiều
resize2fs -M xxx.img
bạn sẽ được yêu cầu e2fsck trước - vì vậy:
e2fsck -f -y xxx.img
(hình ảnh KHÔNG được gắn kết!)
Lưu ý: điều này sẽ chỉ hoạt động nếu hình ảnh là của một phân vùng duy nhất, nếu đó là toàn bộ thiết bị khối với phân vùng đa dạng xem câu trả lời ở trên ...
losetup --find --partscan xxx.img
để thiết lập tệp hình ảnh như một thiết bị lặp. sau đó chạy lsblk
để tìm phân vùng của thiết bị vòng lặp.
resize2fs
chỉ dành cho extN
phân vùng kiểu. Các loại phân vùng khác sẽ yêu cầu các công cụ khác.
Tôi cũng đã thử nó với qemu-img và nó hoạt động như một cơ duyên:
qemu-img resize test.img 2G
Chúng tôi đang thay đổi kích thước test.img
để làm cho nó 2G (2GB).
Làm việc hoàn hảo cho tôi.
df -h
cho thấy kích thước ban đầu. Sao có thể như thế được?
Tôi đã sử dụng phương pháp gparted với máy tính Ubuntu 16.10 của mình:
1) Ánh xạ tệp img vào phân vùng vòng lặp có sẵn tiếp theo với losetup
, như được mô tả trong các bài viết trước như trên
2) Kiểm tra lsblk
ổ đĩa mà tệp hình ảnh của bạn được ánh xạ tới, vd/dev/loop0
3) Thực thi sudo gparted /dev/loop0
4) Thu nhỏ (các) phân vùng vòng lặp nếu thấy phù hợp; vui lòng đảm bảo có các phân vùng này chưa được đếm.
5) Thực thi fdisk /dev/loop0
, sau đó nhập p
, điều này sẽ cho bạn thấy kích thước khối và số khối kết thúc của các phân vùng khác nhau.
6) Thực hiện dd if=/dev/loop0 of=shrunk_image_file.img
, áp dụng đối với lệnh rằng các tùy chọn bs=[BlockSize]
và count=[EndBlockNumberOfLastLoopPartition+1]
và bạn sẽ có một thu hẹp và tập tin ảnh rightsized.