快速随机化 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

我的这个想法来自这个答案,在遇到同样的问题后非理性的约翰, WHO评论了关于吉尔斯上面的回答。这将我的新 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 的 Boot 和 Nuke),它具有 CD 和 USB 可启动选项,并且“是 SourceForge 上托管的一个开源项目。该程序旨在安全地擦除硬盘,直到其数据被永久删除”。已删除且无法再恢复”

答案4

完成 Marco 的答案,您需要的是更快的随机数生成器。

您使用一个简单的程序来回显来自良好库(如 )的随机数boost::random,并在dd.

如果你选择boost,你可以使用例如,experiment根据您的需要更改功能。

相关内容