快速隨機化 HD 的方法?

快速隨機化 HD 的方法?

我讀過有關如何使硬碟安全加密的信息,其中一個步驟是將隨機位元寫入驅動器,以使加密資料與硬碟上的其他資料無法區分。

dd if=/dev/urandom of=/dev/sda然而,當我過去嘗試使用時,預計到達時間大約是幾天。我看到一些關於使用badblocksurandom 代替的內容,但這似乎沒有多大幫助。我只是想知道是否有任何方法可以幫助我加快速度,例如dd我可能缺少的選項或其他內容,或者速度是否只是高清的限制。

答案1

dd if=/dev/urandom of=/dev/sda, 或者簡單地 cat /dev/urandom >/dev/sda,並不是用隨機資料填滿磁碟的最快方法。 Linux/dev/urandom並不是最快的加密 RNG。/dev/urandom 有替代方案嗎?有一些建議。特別是,OpenSSL 包含更快的加密 PRNG:

openssl rand $(</proc/partitions awk '$4=="sda" {print $3*1024}') >/dev/sda

注意,最終有沒有提升,取決於哪個部分是瓶頸:CPU還是磁碟。

好消息是,用隨機資料填充磁碟幾乎沒有什麼用處。首先,為了消除一個常見的神話,在當今的硬體上用零擦除同樣好。在 20 世紀 80 年代的硬碟技術中,用零覆蓋硬碟會留下少量的剩餘電荷,可以使用稍微昂貴的硬體來恢復;需要用隨機資料進行多次覆蓋(“古特曼擦除”)。如今,即使是用零覆蓋一次,也會留下即使在實驗室條件下也無法實際恢復的資料。

當您加密分割區時,為了加密資料的機密性,不需要用隨機資料填入磁碟。只有當您需要使加密資料使用的空間與未使用的空間無法區分時,它才有用。在非隨機容器之上建立加密磁碟區可以揭示加密磁碟區曾經使用過哪些磁碟區塊。這很好地提示了檔案系統的最大大小(儘管隨著時間的推移,它會變得越來越糟糕),僅此而已。

答案2

您可以使用 OpenSSL/dev/zero使用隨機密碼進行加密,從而非常快速地提供不錯的偽隨機資料(如果您的 CPU 支援加速)。

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero | dd of=/dev/sda

您可以透過管道來pv獲取進度/預計到達時間。我現在正在運行的命令(在 root shell 中)是:

DISK="sda"
DISKSIZE=$(</proc/partitions awk '$4=="'"$DISK"'" {print sprintf("%.0f",$3*1024)}')
apt-get install pv
openssl enc -aes-256-ctr -nosalt \
  -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" \
  < /dev/zero |
  pv --progress --eta --rate --bytes --size "$DISKSIZE" |
  dd of=/dev/"$DISK" bs=2M

我的這個想法來自這個答案,在遇到同樣的問題後非理性的約翰, 世界衛生組織評論了關於吉爾斯上面的回答。這將我的新 RAID 陣列的擦除速度從 11 MB/s 提高到了 300 MB/s 左右,將一周所需時間縮短為 10 個小時。

我要補充的是,您應該能夠使用 而不是上面更複雜的語句,但有一個錯誤,它只允許產生 16 MB 的輸出。 (此錯誤已於 2016 年 1 月提交。)openssl rand #of_bytesopenssl enc ...ssl

並且,根據答案這個問題openssl,並繼續假設 CPU 是瓶頸,透過在單獨的核心上運行多個並行進程並使用 FIFO 將它們組合起來,可以進一步提高速度。

答案3

openssl 似乎不適合我。我遇到了“未知選項”和所提供的解決方案的其他問題。所以我最終選擇了 fio 程序。

fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0

跨 24 個 HDD 儲存 19TB 資料似乎需要 3 個小時。約 1,800 MB/s

smp-016:~ # fdisk -l /dev/md0
Disk /dev/md0: 18890.1 GB, 18890060464128 bytes

smp-016:~ # fio -name="fill" -ioengine=libaio -direct=1 -bs=512m -rw=write -iodepth=4 -size=100% -filename=/dev/md0
fill: (g=0): rw=write, bs=512M-512M/512M-512M/512M-512M, ioengine=libaio, iodepth=4
fio-2.2.10
Starting 1 process
Jobs: 1 (f=1): [W(1)] [2.7% done] [0KB/1536MB/0KB /s] [0/3/0 iops] [eta 03h:01m:11s]

我希望這實際上是隨機數據。手冊頁上寫著 fio“預設:用隨機資料填滿緩衝區。”http://linux.die.net/man/1/fio

我這樣做並不是為了安全/加密的目的,只是想確保我以後讀取的測試是實際資料而不僅僅是 0。同樣的 fio 指令可用於 SSD/NVMe 預處理。因為僅使用 /dev/zero 可能會導致磁碟級壓縮「欺騙」實際寫入的數量。雖然我會-loops=2為其添加一個標誌,但如果它是用於基準測試的新 SSD。

如果您確實希望它是安全的,您可以使用該-randrepeat=bool 選項,因為這將切換“以可預測的方式播種隨機數產生器,以便結果在運行中可重複。預設值:true。”,但我仍然沒有確定那會有多安全。

此外,一些企業級 HDD 具有 SED(自加密磁碟機),可讓您旋轉加密金鑰以立即安全地擦除所有寫入的資料。

最後,我過去使用過DBAN(又名Darik's Boot and Nuke),它具有CD 和USB 可啟動選項,並且「是SourceForge 上託管的開源專案。該程式旨在安全地擦除硬碟,直到其資料被永久刪除”。已刪除且無法再恢復”

答案4

完成 Marco 的答案,您需要的是更快的隨機數產生器。

您使用一個簡單的程序,該程序可以從一個好的庫(例如)中回顯隨機數,boost::random並在dd.

如果你選擇boost,你可以使用例如,experiment根據您的需求變更功能。

相關內容