Hãy xem xét một thiết bị khối thô 100 MB là một ví dụ đơn giản. Đó là 204800 khối 512 byte mỗi khối với tổng số 102760448 byte.
Thách thức là thay đổi 98 MB đầu tiên (200704 khối) để có khoảng cách 2 MB (4096 khối) phía trước nó. Để làm điều này tại chỗ đòi hỏi không có gì được ghi vào một khu vực chưa được đọc. Một cách để đạt được điều này là giới thiệu bộ đệm:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 | dd of=/dev/sdj2 seek=4096
Kỳ vọng là mbuffer
sẽ lưu trữ 4096 khối trước khi chuyển bất cứ thứ gì cho người viết, do đó đảm bảo rằng không có gì được ghi vào một khu vực chưa được đọc và người viết bị trễ người đọc bởi kích thước của bộ đệm. Bộ đệm nên cho phép người đọc và người viết hoạt động nhanh nhất có thể trong các cấu hình đó.
Tuy nhiên, nó dường như không hoạt động đáng tin cậy. Tôi đã thử sử dụng các thiết bị thực nhưng nó không bao giờ hoạt động trên chúng, trong khi các thử nghiệm với tệp hoạt động trên hộp 64 bit của tôi nhưng không hoạt động trên hộp 32 bit của tôi.
Đầu tiên, một số chuẩn bị:
$ dd if=/dev/sdj2 count=200704 | md5sum
0f0727f6644dac7a6ec60ea98ffc6da9
$ dd if=/dev/sdj2 count=200704 of=testfile
Điều này không hoạt động:
$ dd if=/dev/sdj2 count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=/dev/sdj2 seek=4096
summary: 98.0 MiByte in 4.4sec - average of 22.0 MiB/s
md5 hash: 3cbf1ca59a250d19573285458e320ade
Điều này hoạt động trên hệ thống 64 bit nhưng không phải trên hệ thống 32 bit:
$ dd if=testfile count=200704 | mbuffer -s 512 -b 4096 -P 100 -H | dd of=testfile seek=4096 conv=notrunc
summary: 98.0 MiByte in 0.9sec - average of 111 MiB/s
md5 hash: 0f0727f6644dac7a6ec60ea98ffc6da9
Làm thế nào điều này có thể được thực hiện đáng tin cậy?
ghi chú
Tôi đã đọc các câu hỏi khác về bộ đệm và nhìn vào pv
, buffer
và mbuffer
. Tôi chỉ có thể làm cho cái sau hoạt động với kích thước bộ đệm cần thiết.
Sử dụng lưu trữ đối xứng là một giải pháp rõ ràng cho vấn đề luôn hoạt động nhưng không thực tế khi không đủ dung lượng dự phòng.
Kiểm tra nền tảng chạy Arch Linux với mbuffer
phiên bản 20140302.
mbuffer
thực sự buộc thứ hai dd
phải tụt lại phía sau và bạn chỉ cần đủ RAM để đệm kích thước của ca làm việc. Quá tệ dd
không hỗ trợ đọc và viết các khối theo thứ tự ngược vì điều đó sẽ loại bỏ vấn đề!
-H
đối số của nó cho phép tính năng này).
mbuffer
? Tại sao không thay vìdd
đọc toàn bộ nội dung của thiết bị khối trong một lần sử dụngdd bs=102760448
? Tất nhiên, bằng cách này hay cách khác, nó được đệm trong RAM.