Tại sao dd chỉ sao chép 128 byte từ / dev / ngẫu nhiên khi tôi yêu cầu thêm?


10

Tôi đang cố gắng để hiểu đầu ra của ddlệnh. Tôi đã thử

dd if=/dev/zero of=/dev/null bs=512 count=1

và đã nhận (như mong đợi):

 1+0 records in
 1+0 records out
 512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s

Tuy nhiên khi tôi đã cố gắng

dd if=/dev/random of=/dev/null bs=512 count=1

tôi đã nhận

 0+1 records in
 0+1 records out
 128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s

Tại sao nó chỉ sao chép 128 byte?


Xem superuser.com/questions / 359599 / Cho một cuộc thảo luận đầy đủ hơn về / dev / ngẫu nhiên và urandom
BobT

Câu trả lời:


8

Bạn cần sử dụng /dev/urandomhoặc nguồn ngẫu nhiên "bỏ chặn".

/dev/randomsử dụng một loại nhóm entropy để tăng tính ngẫu nhiên của nguồn bit. Phương thức này sẽ chỉ trả về số bit / byte ngẫu nhiên có thể được trả về dựa trên trạng thái của nhóm entropy tại thời điểm đó, vì vậy nếu sử dụng trình tạo số ngẫu nhiên phần cứng, đôi khi điều này có thể là hằng số. Từ trang web Linux :

Trình tạo cũng giữ một ước tính về số lượng bit của tiếng ồn trong nhóm entropy. Từ số ngẫu nhiên nhóm entropy này được tạo ra.

Các /dev/urandomtập tin tiếp tục sử dụng lại nhóm nội bộ như là để tạo ra một số miễn là bạn cần. Tác dụng phụ của việc này là: không sử dụng /dev/urandomcho mục đích mã hóa , vì nó ít ngẫu nhiên hơn các bit được tạo ra bởi /dev/random. Xem liên kết trang trên để biết chi tiết.



3

Vì việc đọc /dev/randomchỉ trả về số lượng byte có sẵn, bạn phải chỉ định kích thước khối 1 . Trong ví dụ của bạn, bạn đặt kích thước khối thành 512, thất bại sau lần đọc đầu tiên.

Do đó, các đối số chính xác đọc chính xác 512 byte là:

dd if=/dev/random of=filename bs=1 count=512

Lưu ý lệnh sẽ chặn cho đến khi có đủ entropy trong hệ thống để tạo tất cả dữ liệu. Đó là cách làm /dev/randomviệc. Nếu bạn không muốn chờ đợi và bạn vẫn ổn với ít entropy hơn, hãy sử dụng /dev/urandomthay thế. Trong phần lớn các trường hợp sử dụng /dev/urandomđược ưa thích.


+1 cho lời giải thích, mặc dù cần phải nói rằng với số byte cao tới 512, việc sử dụng /dev/randomtrở nên hầu như không sử dụng được, bởi vì lệnh có thể mất nhiều phút để hoàn thành. Ngoài ra, ngay cả khi có bs=512 count=1vẻ như cuộc gọi vẫn chặn nếu không có byte nào cả, đúng không? Một cách khác để chuyển đổi bscountgiá trị là sử dụngiflag=fullblock ; ví dụ bs=512 count=1 iflag=fullblock.
mkuity0

IMHO, câu trả lời này nên được hợp nhất thành câu trả lời của @ Đột phá. (Đó là câu trả lời cho vấn đề của tôi trong khi Đột phá thì không).
superbob
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.