dd 的命令選項 bs=1024 count=1 和 bs=1 count=1024 有什麼差別

dd 的命令選項 bs=1024 count=1 和 bs=1 count=1024 有什麼差別

考慮以下兩個命令,它們都創建了一個 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)。

相關內容