Làm cách nào để thay đổi kích thước tập tin img được tạo bằng dd?


19

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?


bạn có thể muốn thêm kết quả mong muốn là gì. tức là: hình ảnh trở lại thẻ, để lưu trữ trên CD.
Wayne

Câu trả lời:


8

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ư gziphoặ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ô.


1
Làm thế nào bạn có thể chắc chắn rằng tất cả các tệp hiện đang được lưu trữ trên các phân vùng không nằm rải rác trên đĩa?
Valerio Santinelli

bởi vì tôi cho rằng các tệp không được ghi tuần tự trên đĩa và nếu một tệp ở cuối bộ lưu trữ, khi tôi giảm kích thước xuống, tôi sẽ mất nội dung của tệp đó.
Valerio Santinelli

Bởi vì OP đang hỏi làm thế nào để thu nhỏ hình ảnh đĩa mà không mất dữ liệu. Nếu bạn cắt một hình ảnh ở một kích thước nhất định, bạn không thể chắc chắn dữ liệu sẽ được lưu giữ.
Valerio Santinelli

@ValerioSantinelli: Chính xác thì tôi đề nghị cắt bớt hình ảnh ở đâu?
dùng1686

1
@ValerioSantinelli: Bằng cách sử dụng công cụ thay đổi kích thước hệ thống tập tin phù hợp cho hệ thống tập tin của bạn, ví dụ resize2fshoặ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.
dùng1686

22

Sử dụng resize2fsdễ 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 ...


Chỉ cần một lưu ý: đối với nhiều phân vùng, sử dụng 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.
Yihui Xiong

Có vẻ như nó không hoạt động đối với hình ảnh ISO có chứa hệ điều hành. Sau khi thay đổi kích thước hệ thống không khởi động.
SR

@SR Linux hệ điều hành?
Rolf

1
Đây là một câu trả lời rất hay, nhưng resize2fschỉ dành cho extNphâ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.
Rolf

2

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.


1
Tuyệt vời, làm việc hoàn hảo cho tôi quá, nén một hình ảnh Raspbian. làm việc đầy đủ
ffleandro

Vâng, mọi thứ đều hoạt động, tuy nhiên sau khi khởi động, chạy df -hcho thấy kích thước ban đầu. Sao có thể như thế được?
ffleandro

Rõ ràng, qemu-img không phải là bảng phân vùng, vậy làm thế nào để nó nén .img?
ffleandro

Tôi có thể thay đổi kích thước đĩa .img thành 1M, điều này chắc chắn phá vỡ hình ảnh đĩa. Bất kỳ ý tưởng để làm cho thay đổi kích thước an toàn hơn?
lesca

1

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]count=[EndBlockNumberOfLastLoopPartition+1]và bạn sẽ có một thu hẹp và tập tin ảnh rightsized.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.