我不知道你为什么说 SSD 不正确地执行 ATA Security Erase。现代的使用 SED 实现它(它使用驱动器已知的加密密钥并将所有数据存储在非易失性内存中,允许它简单地擦除密钥以立即使数据不可读),而其他人则将所有扇区标记为 TRIMed ,当垃圾收集器到达它们时,它应该有效地擦除数据。我敢肯定有一些不正确地实现它(这并不是特别罕见),但同样适用于硬盘驱动器。
确实,外部 USB SSD 和 HDD 经常会出现 ATA 安全擦除问题,但这是由于 USB 接口无法很好地与 ATA 标准兼容造成的问题。此外,USB 闪存驱动器(我不会称那些“SSD”)不实施 ATA 安全擦除,因为它具有极其简单的固件和非常低端的微控制器(与具有非常强大的处理器的 SSD 和 HDD 相比,通常双核,有时甚至是四核)。SSD 是连接 FTL 和闪存芯片阵列的完整计算机。闪存驱动器是内置闪存的微控制器。
至于使用用户空间工具进行擦除,这些都不会影响 DCO,也不会直接影响过度配置空间。只有使用 ATA Security Erase 才能擦除所有这些。它旨在擦除重新分配的扇区(只要它们没有受到严重损坏)以及 HPA。DCO 只是配置数据,因此它不会包含任何您从商店获得时不包含的内容。如果您真的想擦除它,可以使用 Linux hdparm 工具将其重置为出厂默认设置,该工具具有恢复 DCO 的命令。
请注意, badblocks -w 写入一个可预测的模式,一些 SSD 会检测到这一点并对其进行压缩,从而导致实际上并未将整个内容写入驱动器。出于数据销毁的目的,这几乎是无用的。您将需要编写一个随机模式来防止这种情况。
只需使用 ATA 安全擦除。如果您知道您的特定 SSD 固件有一个错误的实现,并且您无法升级固件来修复它,那么使用 hdparm 将 TRIM 命令发送到所有扇区,并使用 dd(或类似的命令,如 ddrescue或 dcfldd)将随机数据写入您的驱动器,并多次执行此操作。需要多次这样做不是因为有一种方法可以恢复已删除的数据,而是因为无法一次性写入过度配置空间。
您将无法擦除完全损坏的扇区。如果驱动器检测到某个扇区返回数据的时间比正常时间长,返回的数据与内部校验和不匹配,或者它必须经常重试,那么它会将其移动到已知良好的扇区并标记它一样糟糕。如果一个扇区被简单地写入超过一定次数(因为它们在相当可预测的擦除周期数后失败,通常在 2000 左右),它也会做同样的事情。可以诱使驱动器再次手动将扇区标记为好,以便擦除它或将数据放入其中(ATA Security Erase 可以执行此操作,hdparm 可以执行此操作),但前提是它仅在丢失时被标记为坏健康。如果该扇区被严重损坏以至于无法返回任何数据,并且写入无限期停止/完全失败,那么您或驱动器将无能为力。如果没有您(或高级法医调查员)对其进行物理检查,则无法到达该扇区。您可以使用 smartmontools 包确定是否有损坏的扇区:
# find out how many sectors are reallocated, and how many reallocations occurred
smartctl -a /dev/sda | grep -i reallocated
例如,如果您无法使用 ATA 安全擦除,请/dev/sda尽可能安全地擦除:
# find our max sectors (geometry = 91201/255/63, sectors = 1465149168, start = 0)
hdparm -g /dev/sda
# disable the HPA
hdparm -N p1465149168 /dev/sda
# trim every sector in the drive, from 0 to the max
hdparm --trim-sector-ranges 0:1465149168 /dev/sda
# create a crypt device with a random key, and overwrite it a few times
cryptsetup open -M plain -c aes -d /dev/urandom /dev/sda wipe
for i in {0..6}; do dcfldd bs=256k pattern=0$i of=/dev/mapper/wipe; sync; done
cryptsetup close wipe
# restore DCO to factory defaults (this can mess up the SSD, so do it last)
hdparm --dco-restore /dev/sda
但如果可以的话,我仍然建议您改用 ATA 安全擦除:
# initiate an ATA Security Erase which can't be disabled until it completes
hdparm --security-set-pass NULL /dev/sda
hdparm --security-erase-enhanced NULL /dev/sda
下一次,加密您的数据!