為什麼 dd 在 8 GB 驅動器上永遠執行
我有一個由 ZFS 處理的文件系統,大約 8 GB。
我試圖通過執行將文件系統歸零:
dd if=/dev/zero of=/EMPTY bs=1M | true rm -f /EMPTY
通常在 ext4 文件系統上,它會在幾秒鐘內完成。
但這一次,它一直在繼續。
我能夠啟動第二個終端並查看它的大小
/EMPTY
。執行後ll -h
,它說/EMPTY
是800 GB!顯然 800 GB 不適合 8 GB。此外,通過執行
df -h
,它表明文件系統沒有被填滿。但是 dd 消耗了 50% 的 CPU .. 等等,加熱了我的筆記型電腦。我假設它做了很多工作,但一無所獲。
那麼為什麼 dd 永遠執行創建一個不佔用任何大小的文件呢?在 ext4 上,它意味著完成並給我一個錯誤,以便我可以繼續。
您遇到了 ZFS 的壓縮。如果您試圖清除文件系統,那麼您不能在 ZFS 中這樣做。如果您試圖清除底層磁碟,最好的辦法是在 zfs 池上使用“zpool destroy”,然後在物理設備本身上使用 dd。(“dd if=/dev/zero of=/dev/….”)。完成後,只需使用 zpool create 重新創建池。
我不知道你想要實現什麼,所以我只能描述你的命令實際上在做什麼。
dd if=/dev/zero
您正在從返回無限數量的零(或 NUL)字節的特殊設備中讀取數據。
of=/EMPTY
您正在使用上述(無限)輸入創建一個新文件。
bs=1M
您以兆字節塊為單位讀取和寫入無限數據流。您永遠不應該做這樣的事情,因為您可能會填滿文件系統,而許多工具無法應對這種情況。當ext4文件系統被有效地填滿並且命令結束時,壓縮文件系統能夠積極地壓縮零字節流。
| true
這是胡說八道,因為
dd
withof=
沒有任何輸出。您可能打算|| true
取消的狀態程式碼,dd
但這無論如何都不是很有用,因為單個命令失敗不會殺死整個腳本。的一種典型用途
dd if=/dev/zero
是將整個設備歸零,例如/dev/sdb
. 如另一個答案中所述,您可能希望shred
改用。在這兩種情況下,您都希望將系統中呈現的整個系統分區稱為塊設備,而不是單個文件(可能不再存在)。有很多關於 linux 塊設備和手冊頁的書籍和線上資源,shred
也dd
非常有用。刪除文件時,其塊立即可用。你不需要執行任何黑魔法。如果您想清除文件的內容以防止取證技術,只需使用
schred --delete
刪除文件而不是正常刪除。清除已刪除文件的塊並不容易,您不能簡單地依賴創建一個大的空文件。您將需要一個專門的文件系統特定工具來安全地執行此操作。