Từ thông số kỹ thuật :
- Nếu
bs=
expr
toán hạng được chỉ định và không có chuyển đổi nào ngoài sync
, noerror
hoặc notrunc
được yêu cầu, dữ liệu được trả về từ mỗi khối đầu vào sẽ được ghi dưới dạng một khối đầu ra riêng biệt; nếu read()
trả về ít hơn một khối đầy đủ và sync
chuyển đổi không được chỉ định, khối đầu ra kết quả sẽ có cùng kích thước với khối đầu vào.
Vì vậy, đây có lẽ là những gì gây ra sự nhầm lẫn của bạn. Có, vì dd
được thiết kế để chặn, theo mặc định, một phần read()
s sẽ được ánh xạ 1: 1 thành một phần write()
, hoặc nếu không thì sync
xuất hiện trên phần đệm đuôi NUL hoặc ký tự khoảng trắng theo bs=
kích thước khi conv=sync
được chỉ định.
Điều này có nghĩa dd
là an toàn để sử dụng để sao chép dữ liệu (không có rủi ro tham nhũng do đọc hoặc ghi một phần) trong mọi trường hợp, nhưng một trường hợp bị giới hạn tùy ý bởi một count=
đối số, vì nếu không thì dd
sẽ vui lòng write()
đầu ra của nó trong các khối có kích thước giống hệt nhau cho những người mà đầu vào của nó là read()
cho đến khi nó read()
hoàn toàn thông qua nó. Và thậm chí báo trước đây là chỉ đúng khi bs=
được quy định hoặc obs=
được không chỉ định, như câu hôm sau tại các tiểu bang spec:
- Nếu
bs=
expr
toán hạng không được xác định, hoặc chuyển đổi khác hơn sync
, noerror
hoặc notrunc
được yêu cầu, đầu vào sẽ được xử lý và thu thập thành các khối lượng cỡ lớn cho đến khi kết thúc đầu vào là đạt.
Không có ibs=
và / hoặc obs=
đối số điều này không thể quan trọng - bởi vì ibs
và obs
cả hai đều có cùng kích thước theo mặc định. Tuy nhiên, bạn có thể nhận được rõ ràng về bộ đệm đầu vào bằng cách chỉ định các kích thước khác nhau cho một trong hai và không chỉ định bs=
(vì nó được ưu tiên) .
Ví dụ: nếu bạn làm:
IN| dd ibs=1| OUT
... Sau đó, một POSIX dd
sẽ có write()
khối lượng 512 byte bằng cách thu thập từng read()
byte đơn lẻ vào một khối đầu ra duy nhất.
Mặt khác, nếu bạn làm ...
IN| dd obs=1kx1k| OUT
... một POSIX dd
sẽ có read()
tối đa 512 byte mỗi lần, nhưng write()
mỗi khối đầu ra có kích thước megabyte (hạt nhân cho phép và ngoại trừ có thể là cuối cùng - bởi vì đó là EOF) đầy đủ bằng cách thu thập đầu vào thành các khối đầu ra có kích thước đầy đủ .
Cũng từ thông số kỹ thuật, mặc dù:
count=n
- Chỉ sao chép n khối đầu vào.
count=
ánh xạ tới i?bs=
các khối và do đó, để xử lý giới hạn tùy ý trên một cách hợp lý, count=
bạn sẽ cần hai dd
s. Cách thực tế nhất để làm điều đó với hai dd
s là bằng cách đưa đầu ra của một vào đầu vào của một cái khác, điều này chắc chắn đưa chúng ta vào thế giới đọc / ghi một tệp đặc biệt bất kể loại đầu vào ban đầu.
Một ống IPC có nghĩa là khi chỉ định lập [io]bs=
luận rằng, để làm như vậy một cách an toàn, bạn phải giữ các giá trị đó trong PIPE_BUF
giới hạn xác định của hệ thống . POSIX nói rằng hạt nhân hệ thống chỉ phải đảm bảo read()
s và s nguyên tử write()
trong giới hạn PIPE_BUF
như được định nghĩa trong limits.h
. POSIX đảm bảo rằng PIPE_BUF
có ít nhất ...
{_POSIX_PIPE_BUF}
- Số byte tối đa được đảm bảo là nguyên tử khi ghi vào đường ống.
- Giá trị: 512
... (cũng có thể là dd
kích thước khối i / o mặc định ) , nhưng giá trị thực tế thường ít nhất là 4k. Trên một hệ thống linux cập nhật, theo mặc định, nó là 64k.
Vì vậy, khi bạn thiết lập các dd
quy trình của mình, bạn nên thực hiện theo yếu tố khối dựa trên ba giá trị:
- bs = (obs =
PIPE_BUF
hoặc ít hơn)
- n = tổng số byte mong muốn được đọc
- đếm = n / bs
Như:
yes | dd obs=1k | dd bs=1k count=10k of=/dev/null
10240+0 records in
10240+0 records out
10485760 bytes (10 MB) copied, 0.1143 s, 91.7 MB/s
Bạn phải đồng bộ hóa i / ow / dd
để xử lý các đầu vào không thể tìm kiếm. Nói cách khác, làm cho bộ đệm ống rõ ràng và chúng không còn là vấn đề nữa. Đó là những gì dd
dành cho. Số lượng không xác định ở đây là yes
kích thước bộ đệm - nhưng nếu bạn chặn số lượng đó với một số lượng đã biếtdd
thì phép nhân được thông báo một chút có thể dd
an toàn để sử dụng để sao chép dữ liệu (không có rủi ro tham nhũng do đọc hoặc ghi một phần) ngay cả khi tùy ý giới hạn đầu vào w / count=
w / bất kỳ loại đầu vào tùy ý nào trên bất kỳ hệ thống POSIX nào và không thiếu một byte nào.
Đây là một đoạn trích từ thông số POSIX :
ibs=
expr
- Chỉ định kích thước khối đầu vào, tính bằng byte, theo (mặc định là 512) .
expr
obs=
expr
- Chỉ định kích thước khối đầu ra, tính bằng byte, theo (mặc định là 512) .
expr
bs=
expr
- Đặt cả kích thước khối đầu vào và đầu ra thành
expr
byte, thay thế ibs=
và obs=
. Nếu không chuyển đổi khác hơn sync
, noerror
và notrunc
được chỉ định, mỗi khối đầu vào sẽ được sao chép vào đầu ra như một khối duy nhất mà không tập hợp khối ngắn.
Bạn cũng sẽ tìm thấy một số điều này giải thích tốt hơn ở đây .