Próbuję zrozumieć wyjście dd
polecenia. próbowałem
dd if=/dev/zero of=/dev/null bs=512 count=1
i otrzymałem (zgodnie z oczekiwaniami):
1+0 records in
1+0 records out
512 bytes (512 B) copied, 2e-05 seconds, 26 MB/s
Jednak kiedy próbowałem
dd if=/dev/random of=/dev/null bs=512 count=1
mam
0+1 records in
0+1 records out
128 bytes (128 B) copied, 0.00012 seconds, 1.1 MB/s
Dlaczego kopiuje tylko 128 bajtów?
linux
command-line
fo_x86
źródło
źródło
Odpowiedzi:
Musisz użyć
/dev/urandom
losowego źródła „odblokowującego”./dev/random
wykorzystuje rodzaj puli entropii w celu zwiększenia losowości źródła bitów. Ta metoda zwróci tylko tyle losowych bitów / bajtów, ile może zostać zwróconych na podstawie stanu puli entropii w danym momencie, więc jeśli używany jest sprzętowy generator liczb losowych, może to czasem być stałe. Ze strony Linux-a :/dev/urandom
Plik utrzymuje ponowne wewnętrzny basen jak jest do generowania numeru tak długo, jak trzeba. Efektem ubocznym tego jest: nie używaj/dev/urandom
do celów kryptograficznych , ponieważ jest mniej losowy niż bity produkowane przez/dev/random
. Zobacz link do strony powyżej, aby uzyskać szczegółowe informacje.źródło
Ponieważ odczyt
/dev/random
zwraca tylko ilość dostępnych bajtów , musisz określić rozmiar bloku 1 . W twoim przykładzie ustawiłeś rozmiar bloku na 512, co kończy się niepowodzeniem po pierwszym odczycie.Dlatego poprawnymi argumentami, które odczytują dokładnie 512 bajtów, są:
Uwaga: polecenie będzie blokować, dopóki w systemie nie będzie wystarczającej ilości entropii do wygenerowania wszystkich danych. Tak to
/dev/random
działa. Jeśli nie chcesz czekać i masz mniejszą entropię, użyj/dev/urandom
zamiast tego. W zdecydowanej większości przypadków/dev/urandom
preferowane jest używanie .źródło
/dev/random
staje się praktycznie bezużyteczne, ponieważ wykonanie polecenia może zająć wiele minut. Ponadto, nawetbs=512 count=1
jeśli wydaje się, że wywołanie nadal blokuje się, jeśli w ogóle nie ma dostępnych bajtów, prawda? Alternatywą dla przełączaniabs
icount
wartości jest użycieiflag=fullblock
; tjbs=512 count=1 iflag=fullblock
.