考慮以下兩個命令,它們都創建了一個 1KB 的啞文件
dd if=/dev/urandom of=test.file bs=1024 count=1
dd if=/dev/urandom of=test.file bs=1 count=1024
第一個指令使用 1024 位元組的區塊大小和 1 的區塊計數,第二個指令則相反。
我的猜測是,沒有區別,限制區塊大小是與 RAM 相關的問題:區塊大小不能大於可用記憶體。
當我想要或必須使用第一種情況而不是第二種情況時,是否有任何特殊情況?反之亦然?
答案1
正如您似乎基本上所理解的那樣,第一個版本執行一次1024 位元組的讀取,然後寫入從讀取返回的任意字節,而第二個版本執行1024 次讀取和寫入,每次讀取一個位元組。複製普通檔案時,較大的區塊大小(導致 I/O 數量較少)可能會稍微提高效率。這可能/dev/urandom
也是如此。
dd
但在特殊文件(即設備)上使用時需要小心。例如,
dd 如果=(無論輸入什麼) 的=(磁帶設備) bs=1024 計數=1
將寫入一個 1024 位元組的磁帶區塊;
dd … bs=1 count=1024
將寫入 1024 個區塊,每個區塊一個位元組。這些並不相同;由於記錄之間存在間隙,1024 個小塊將比 1 個大塊佔用更多的磁帶空間,並可能導致磁帶讀取問題。與您的問題更相關的是,如果您if=
從 ()讀取/dev/random
,它將只傳回可用的高熵位元組。因此,在第一個版本中,您獲得的位元組數可能少於 1024。但是,如果您嘗試讀取一個字節,並且熵池為空,則讀取將阻塞(即等待)直到資料可用,因此第二個版本將保證為您獲取 1024 位元組(儘管可能需要任意時間)很長一段時間)。
放大磁帶機的要點:
dd 如果=(適當的輸入) 的=(磁帶設備) bs=512 計數=2
將寫入兩個 512 位元組的磁帶區塊。隨後的
dd 如果=(磁帶設備) 的=(任何) bs=1024 計數=1
可能只讀取第一個區塊;即前 512 位元組。
並且(命名)管道可能會出現相同的問題/dev/random
——大量讀取將僅返回可用的位元組;因此,在第一個版本中,您獲得的位元組數可能會少於 1024 個位元組。但是,如果您嘗試一次讀取一個字節,則讀取將等到資料可用為止,因此第二個版本將保證為您獲取 1024 個位元組(或至少讀取到 EOF)。