Tôi có dung lượng ổ đĩa trống 200 GB, RAM 16 GB (trong đó ~ 1 GB bị chiếm bởi máy tính để bàn và kernel) và 6 GB trao đổi.
Tôi có ổ SSD ngoài 240 GB, với 70 GB được sử dụng 1 và phần còn lại miễn phí, tôi cần sao lưu vào đĩa của mình.
Thông thường, tôi sẽ dd if=/dev/sdb of=Desktop/disk.img
đĩa trước, sau đó nén nó, nhưng làm cho hình ảnh trước không phải là một tùy chọn vì làm như vậy sẽ cần nhiều không gian đĩa hơn tôi có, mặc dù bước nén sẽ dẫn đến không gian trống bị nén nên lưu trữ cuối cùng có thể dễ dàng phù hợp trên đĩa của tôi.
dd
ghi vào STDOUT theo mặc định và gzip
có thể đọc từ STDIN, vì vậy theo lý thuyết tôi có thể viết dd if=/dev/sdb | gzip -9 -
, nhưng gzip
mất nhiều thời gian hơn để đọc byte hơn là dd
có thể tạo ra chúng.
Từ man pipe
:
Dữ liệu được ghi vào đầu ghi của ống được đệm bởi nhân cho đến khi nó được đọc từ đầu đọc của ống.
Tôi hình dung |
giống như một đường ống thực sự - một ứng dụng đẩy dữ liệu vào và ứng dụng khác lấy dữ liệu ra khỏi hàng đợi của đường ống càng nhanh càng tốt.
Điều gì khi chương trình ở phía bên trái ghi nhiều dữ liệu nhanh hơn phía bên kia của đường ống có thể hy vọng xử lý nó? Nó sẽ gây ra bộ nhớ cực lớn hoặc sử dụng trao đổi, hoặc hạt nhân sẽ cố gắng tạo ra một bộ xếp hình trên đĩa, do đó làm đầy đĩa? Hoặc nó sẽ thất bại SIGPIPE Broken pipe
nếu bộ đệm quá lớn?
Về cơ bản, điều này rút ra hai câu hỏi:
- Ý nghĩa và kết quả của việc đẩy nhiều dữ liệu vào một đường ống hơn là được đọc tại một thời điểm?
- Cách đáng tin cậy để nén một luồng dữ liệu vào đĩa mà không đưa toàn bộ luồng dữ liệu không nén vào đĩa?
Lưu ý 1: Tôi không thể chỉ sao chép chính xác 70 GB đầu tiên được sử dụng và mong muốn có được một hệ thống làm việc hoặc hệ thống tập tin, vì sự phân mảnh và những thứ khác sẽ yêu cầu toàn bộ nội dung.
lzop
thay vì gzip
; nó nén nhanh hơn nhiều chỉ với tỷ lệ nén thấp hơn một chút. Tôi thấy nó lý tưởng cho các hình ảnh đĩa trong đó tốc độ nén có thể là một nút cổ chai thực sự.