Làm cách nào để chuyển đổi hình ảnh đĩa Linux thành một tệp thưa thớt?


12

Tôi có một loạt các hình ảnh đĩa, được tạo bằng ddresTHER, trên phân vùng EXT và tôi muốn giảm kích thước của chúng mà không mất dữ liệu, trong khi vẫn có thể gắn kết.

Làm cách nào tôi có thể lấp đầy không gian trống trong hệ thống tệp của hình ảnh bằng các số 0 và sau đó chuyển đổi tệp thành tệp thưa để không gian trống này không thực sự được lưu trữ trên đĩa?

Ví dụ:

> du -s --si --apparent-size Jimage.image 
120G Jimage.image
> du -s --si Jimage.image 
121G Jimage.image

Điều này thực sự chỉ có 50G dữ liệu thực trên đó, do đó, phép đo thứ hai nên nhỏ hơn nhiều.

Điều này được cho là sẽ lấp đầy không gian trống với số không:

cat /dev/zero > zero.file
rm zero.file

Nhưng nếu các tệp thưa thớt được xử lý trong suốt , nó thực sự có thể tạo ra một tệp thưa thớt mà không ghi bất cứ điều gì vào đĩa ảo, trớ trêu thay tôi không thể biến hình ảnh đĩa ảo thành một tệp thưa. :) Phải không?

Lưu ý: Vì một số lý do, sudo dd if=/dev/zero of=./zero.filehoạt động khi catkhông có trên hình ảnh đĩa được gắn.


2
Viết các số 0 vào một tệp sẽ không tạo ra một tệp thưa thớt. Đó là một khái niệm khác. Khi bạn tìm / đọc một tệp thưa thớt khi HĐH phát hiện ra khối dữ liệu không thực sự ở đó (danh sách khối trống đối với dữ liệu trong vùng đó), hệ điều hành sẽ tự động lấp đầy bộ đệm đọc với byte không.
hotei

Lưu ý: sudo cat /dev/zero > zero.filekhông hoạt động vì bash của bạn (chạy như bạn chứ không phải root) thực hiện chuyển hướng trước khi thực hiện sudolệnh. Xem unix.stackexchange.com/questions/1416/ Kẻ
Fritz

Câu trả lời:


19

Trước hết, các tệp thưa thớt chỉ được xử lý trong suốt nếu bạn tìm kiếm, không phải nếu bạn viết số không.

Để làm cho nó rõ ràng hơn, ví dụ từ Wikipedia

dd if=/dev/zero of=sparse-file bs=1k count=0 seek=5120

không không viết bất kỳ zero, nó sẽ mở file đầu ra, tìm kiếm (nhảy qua) 5MB và sau đó viết zero zero (tức là không có gì cả). Lệnh này ( không phải từ Wikipedia)

dd if=/dev/zero of=sparse-file bs=1k count=5120

sẽ ghi 5MB số 0 và sẽ không tạo tệp thưa!

Kết quả là, một tệp đã không còn thưa thớt sẽ không trở nên thưa thớt một cách kỳ diệu sau này.

Thứ hai, để tạo một tệp có nhiều số 0 thưa thớt, bạn phải cp

cp --sparse=always original sparsefile

hoặc bạn có thể sử dụng tar 's hoặc rsync tùy chọn --sparse' s là tốt.


1
Theo Wikipedia, viết số không bằng dd sẽ tạo ra một tệp thưa thớt. Bạn có thể giải thích "tìm kiếm" nghĩa là gì không?
endolith

1
Thế còn mèo thì sao? Không có gì trong trang man về các tệp thưa thớt, vì vậy tôi cho rằng cat /dev/zero > zero.filehoàn toàn ổn để lấp đầy không gian trống bằng số không?
Ludwig Weinzierl

2
@endolith: Cập nhật câu trả lời của tôi để làm rõ sự khác biệt được sử dụng ddđể viết số không hoặc để tìm kiếm.
mihi

2
@Ludwig Weinzierl: Có, catlệnh đó sẽ lấp đầy toàn bộ đĩa của bạn (hoặc ít nhất là số tiền không dành cho root hoặc theo hạn ngạch) bằng các số 0 "thực" và không tạo tệp thưa.
mihi

1
@endolith bạn sẽ cần thêm dung lượng, vâng. nhưng vì bạn có thể nén tarball, bạn sẽ chỉ cần không gian cho tệp gốc và phiên bản nén của tệp thưa.
mihi

12

Có lẽ cách dễ nhất để khai thác một tập tin tại chỗ sẽ là sử dụng fallocatetiện ích như sau:

fallocate -v --dig-holes {file_name}

fallocate (1) được cung cấp bởi gói linux-linux trên Debian .


1
Vì một số lý do, fallocate --dig-holeskết quả là tệp 103GiB từ bản gốc 299GiB, trong khi cp --sparse=alwaysđưa cho tôi 93GiB - tất cả đều có cùng tổng SHA1 (kích thước được kiểm tra qua du -B1Gvs du --apparent-size -B1G). Vì vậy, fallocatedường như cho kết quả kém hơn.
Ruslan

3

Chỉnh sửa câu trả lời của tôi cho đầy đủ:

  1. Bong bóng không gian FS trống bằng số không (CẢNH BÁO: điều này thay đổi hình ảnh đĩa của bạn):

losetup --partscan --find --show disk.img

Giả sử nó cho / dev / loop1 là đĩa và chỉ có một phân vùng, nếu không chúng ta cần lặp lại điều này cho mọi phân vùng có FS gắn kết trong đó (bỏ qua phân vùng trao đổi, v.v.).

mkdir -p /mnt/tmp mount /dev/loop1p1 /mnt/tmp dd if=/dev/zero of=/mnt/tmp/tempfile

Hãy để nó kết thúc với thất bại với ENOSPC.

/bin/rm -f /mnt/tmp/tempfile umount /mnt/tmp losetup -d /dev/loop1

  1. Sao chép vào một hình ảnh thưa thớt:

'dd' có một tùy chọn để chuyển đổi một tệp có số 0 thành tệp thưa:

dd if=disk.img of=disk-sparse.img conv=sparse



1
Có, tùy chọn này không có từ thời điểm OP yêu cầu. Đây là nhiều hơn "để lại một mẩu bánh mì cho những người tìm kiếm khác" ... :-)
Lam Das

1
tùy thuộc vào loại hệ thống tệp, zerofreecó thể nhanh hơn việc gắn và ghi các số 0 vào hệ thống tệp và làm cho hình ảnh đĩa phát triển ít hơn nếu nó đã chứa nhiều số không.
mihi

2

Bạn có nghĩa là hình ảnh được tạo ra của bạn là 50 GB và trong thực tế, một cái gì đó ít hơn sẽ đủ?

Nếu đó là trường hợp, trước tiên bạn không thể tạo một hình ảnh mới với dd:

dd if=/dev/zero of=some_image.img bs=1M count=20000

và sau đó tạo một hệ thống tập tin trong đó:

mkfsofyourchoice some_image.img

Sau đó chỉ cần gắn hình ảnh, và sao chép mọi thứ từ hình ảnh cũ sang hình ảnh mới? bạn có muốn công việc kia?


2

PartImage có thể tạo hình ảnh đĩa chỉ lưu trữ các khối được sử dụng của hệ thống tệp, do đó giảm đáng kể dung lượng cần thiết bằng cách bỏ qua khối không sử dụng. Tôi không nghĩ rằng bạn có thể trực tiếp gắn kết quả hình ảnh, nhưng sẽ:

image -> partimage -> image -> cp --sparse=alway

Nên tạo ra những gì bạn muốn (thậm chí có thể có thể thực hiện bước cuối cùng, chưa thử).


1
Thật không may, hình ảnh được tạo bởi partimage không thể gắn kết mà không mở rộng chúng ra một lần nữa, làm cho chúng chỉ phù hợp cho mục đích lưu trữ.
Perkins

0

Bây giờ có một công cụ gọi là virt-sparsify sẽ làm điều này. Nó lấp đầy không gian trống bằng số không và sau đó sao chép hình ảnh vào một tệp thưa thớt. Nó đòi hỏi phải cài đặt rất nhiều phụ thuộc, mặc dù.


-2

Tôi nghi ngờ bạn sẽ yêu cầu một chương trình tùy chỉnh được viết cho thông số đó nếu đó là THỰC SỰ những gì bạn muốn làm. Nhưng nó là...?

Nếu bạn thực sự có nhiều khu vực hoàn toàn bằng không thì bất kỳ công cụ nén tốt nào cũng sẽ làm giảm đáng kể. Và cố gắng viết các tệp thưa thớt sẽ không hoạt động trong mọi trường hợp. Nếu tôi nhớ lại một cách chính xác, ngay cả các tệp thưa thớt chiếm tối thiểu 1 khối lưu trữ đầu ra trong đó khối đầu vào chứa BẤT K bit bit nào khác không. Chẳng hạn - giả sử bạn có một tệp có trung bình 1 bit khác không trên mỗi khối 512 byte - nó không thể được viết "thưa thớt". Nhân tiện, bạn sẽ không mất dữ liệu nếu bạn nén tệp bằng zip, bzip, bzip2 hoặc p7zip. Chúng không giống như nén mpeg hoặc jpeg bị mất.

Mặt khác, nếu bạn cần tìm kiếm ngẫu nhiên các lần đọc vào tệp thì việc nén có thể gặp nhiều rắc rối hơn giá trị của nó và bạn sẽ quay trở lại việc viết thưa thớt. Một lập trình viên C hoặc C ++ có năng lực sẽ có thể viết một cái gì đó tương tự trong một giờ hoặc ít hơn.


Thú vị - một downvote nhưng tôi nhận thấy không có phản bác về những gì tôi đã viết. Nếu nó chính xác nhưng không có ích thì đó không phải là lý do để hạ bệ. Nếu nó không chính xác và không hữu ích thì nó xứng đáng.
hotei

Tôi thấy ở nơi khác rằng OP có một câu hỏi liên quan đến việc gắn hình ảnh nén. Tôi cho rằng đây là sự tiếp nối của chủ đề đó. Biết rằng bây giờ tôi có thể thấy lý do tại sao đề xuất nén của tôi không được chấp nhận. Một chương trình C đơn giản vẫn là một cách dễ dàng để tạo các tệp thưa thớt. NHƯNG - hệ điều hành (không xác định) sẽ cho phép bạn lắp ISO thưa thớt. Kén chọn như công cụ tìm kiếm ISO của Ubuntu là tôi không chắc chắn 100% rằng nó sẽ hoạt động ... nhưng may mắn nhất trong mọi trường hợp.
hotei

4
Tại sao phải phát minh lại bánh xe? cp --sparse=alwayshoạt động tốt
mihi

@mihi: Đó là một ý kiến ​​hay. Tôi không biết về tùy chọn thưa thớt vì nó không có sẵn trong các hương vị BSD ( freebsd.org/cgi/iêu ) và tôi chưa bao giờ có yêu cầu xem trang man Linux cho cp (cho đến ngày hôm nay).
hotei

Một cách để có hình ảnh nén của bạn và gắn kết chúng là chỉ cần lưu trữ chúng trên một hệ thống tập tin hỗ trợ nén nguyên gốc. Làm cho việc khôi phục dữ liệu trở nên tồi tệ nếu bạn gặp sự cố ổ đĩa, nhưng đó là những gì sao lưu dự phòng, phải không?
Perkins
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.