Hard-Disk

為什麼 dd 在 8 GB 驅動器上永遠執行

  • July 9, 2014

我有一個由 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

這是胡說八道,因為ddwithof=沒有任何輸出。您可能打算|| true取消的狀態程式碼,dd但這無論如何都不是很有用,因為單個命令失敗不會殺死整個腳本。

的一種典型用途dd if=/dev/zero是將整個設備歸零,例如/dev/sdb. 如另一個答案中所述,您可能希望shred改用。在這兩種情況下,您都希望將系統中呈現的整個系統分區稱為塊設備,而不是單個文件(可能不再存在)。有很多關於 linux 塊設備和手冊頁的書籍和線上資源,shreddd非常有用。

刪除文件時,其塊立即可用。你不需要執行任何黑魔法。如果您想清除文件的內容以防止取證技術,只需使用schred --delete刪除文件而不是正常刪除。清除已刪除文件的塊並不容易,您不能簡單地依賴創建一個大的空文件。您將需要一個專門的文件系統特定工具來安全地執行此操作。

引用自:https://unix.stackexchange.com/questions/141072