固态硬盘/内存单元清除

出自 ArchWiki

有时,用户可能希望将 SSD 完全重置为出厂时的“干净”状态,从而将其恢复到 出厂默认写入性能。众所周知,即使在使用原生 TRIM 支持的 SSD 上,写入性能也会随着时间的推移而降低。TRIM 仅能防止文件删除,而不能防止替换,例如增量保存。

执行安全擦除不会重置 SSD 单元的磨损均衡状态 - 接近寿命末期的驱动器可能会在短时间内变为可写,但经过有限次数的写入后仍会失效。

警告
  • 在继续操作之前,请备份所有重要数据!使用此过程将销毁 SSD 上的所有数据,甚至数据恢复服务也无法恢复!用户必须重新分区设备并在完成此过程后恢复数据!
  • 如果目标驱动器未直接连接到 SATA/NVMe 接口,请继续执行此操作。在通过 USB 或 SAS/RAID 卡连接的驱动器上发出安全擦除/格式化/清理命令可能会导致驱动器变砖!
提示: 清理驱动器后,在对其进行分区之前,检查它是否正在使用最佳逻辑扇区大小。逻辑扇区大小在不丢失数据的情况下无法更改,因此更改它的最佳时机是在驱动器上没有数据时。

SATA 驱动器

ATA 有两个用于擦除驱动器的命令 — SECURITY ERASE UNITENHANCED SECURITY ERASE UNIT[1]

提示: 这些命令也可用于清零硬盘驱动器。

确保驱动器安全模式未被冻结

执行以下命令

# hdparm -I /dev/sdX | grep frozen

在输出的安全部分,应显示 not frozen。如果仅显示 frozen,则无法继续下一步。有关详细信息,请参阅固态硬盘#冻结模式

一个可能的解决方案是简单地挂起(使用 S3 而不是 S0ix)系统。唤醒后,冻结状态很可能会解除。如果未成功,可以尝试热插拔数据线(这可能会导致内核崩溃)。如果热插拔 SATA 数据线导致内核崩溃,请尝试让操作系统完全启动,然后快速热插拔 SATA 电源线和数据线。如果热插拔 SATA 电缆仍然导致内核崩溃,请确保 BIOS 中启用了 AHCI(AHCI 允许热插拔操作而不会崩溃)。如果支持热插拔,则可以使用 USB-to-SATA 适配器。也可以通过 USB 使用 hdparm

戴尔系统

如果命令输出显示“frozen”,您可以通过以下方法解决:

  1. 重启进入戴尔 BIOS,启动时按 F2 键。
  2. 在 BIOS 中设置内部 HDD 密码(注意,键盘布局为 en_US / qwerty)。
  3. 应用更改并重启。
  4. 当戴尔安全管理器提示输入密码时,按 Esc 键而不是输入密码。驱动器将保持锁定但未冻结状态。
  5. 跳过步骤 2,直接转到下面的步骤 3。
注意: 如果您使用的是联想系统并且无法移除“frozen”状态(例如,联想平板电脑在 M.2 接口上使用 SSD),您可以使用专有工具来完成内存单元清除,而不是按照本文操作。另请参阅:https://superuser.com/questions/763642/secure-erase-ssd-on-lenovo-thinkpad-t520-cant-unfreeze-ssd-machine-reboots-on

通过设置用户密码启用安全功能

注意: 设置用户密码后,驱动器将在下次通电循环后被锁定,拒绝正常访问,直到使用正确的密码解锁。
警告: 在此步骤之后不要重启您的计算机,特别是如果您有联想笔记本电脑。某些版本的联想 BIOS 容易使用偏差算法来计算加密密钥。启动后,机器将无法连接 SSD 驱动器。[2]

任何密码都可以,因为这只是临时的。安全擦除后,密码将设置回 NULL。在本例中,密码为 PasSWorD,如下所示

# hdparm --user-master u --security-set-pass PasSWorD /dev/sdX
security_password="PasSWorD"
/dev/sdX:
Issuing SECURITY_SET_PASS command, password="PasSWorD", user=user, mode=high

作为健全性检查,执行以下命令

# hdparm -I /dev/sdX

命令输出应显示“enabled”

Security:
        Master password revision code = 65534
                supported
                enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        Security level high
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.

执行 ATA SECURITY ERASE UNIT 命令

最后一步是执行 ATA SECURITY ERASE UNIT 命令,指示设备的固件擦除其内容。请注意,对于本例中使用的设备,之前的输出说明

2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.

根据 ATA 规范,增强型安全擦除 (--security-erase-enhanced) 执行更精细的擦除。如果两个命令的估计完成时间相同,则表明驱动器制造商对规范进行了简化,并对两者使用了相同的擦除功能。较短的时间(如 2 分钟)反过来表明设备是自加密的,其固件功能将擦除内部加密密钥,而不是覆盖所有数据单元。[3]

警告
  • 再次检查是否使用了正确的驱动器标识符。一旦命令被确认,就没有回头路了。您已被警告。
  • 确保在运行此命令时驱动器未被挂载。如果在设备挂载时发出安全擦除命令,则它将无法正确擦除。
# hdparm --user-master u --security-erase PasSWorD /dev/sdX

等待命令完成。此示例输出显示,Intel X25-M 80GB SSD 大约花费了 40 秒。

security_password="PasSWorD"
/dev/sdX:
Issuing SECURITY_ERASE command, password="PasSWorD", user=user
0.000u 0.000s 0:39.71 0.0%      0+0k 0+0io 0pf+0w

驱动器现在已被擦除。成功擦除后,驱动器安全功能应自动设置为禁用(因此不再需要密码才能访问)。通过运行以下命令来验证这一点

# hdparm -I /dev/sdX

命令输出应显示“not enabled”

Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.

NVMe 驱动器

NVMe 规范定义了格式化 NVMe 驱动器的标准化方法,因为这些驱动器不使用 SATA 接口协议,因此无法像 SATA SSD 那样清除。最初,是 nvme-format(1) 命令(nvme-cli 的一部分)提供了此功能,但虽然它仍然这样做,但 规范 1.3 添加了对专用 nvme-sanitize(1) 命令的支持。正如 NVM Express 联盟所描述的那样

这些命令用于安全地擦除设备上的用户数据。这可以在部署新设备、停用或在设备寿命终止时、将 SSD 用于新应用等情况下使用。清理功能是在 NVMe 1.3 规范中引入的,因此在此之前,NVMe 格式化命令专门用于执行安全擦除。虽然这两个选项都有效,但清理功能更强大,可以确保数据被正确擦除;格式化命令适用于日常使用和测试。

为了验证您的驱动器支持什么功能,请使用 Identify Controller 命令

# nvme id-ctrl /dev/nvme0 -H | grep -E 'Format |Crypto Erase|Sanitize'

示例输出

  [1:1] : 0x1	Format NVM Supported
  [29:29] : 0	No-Deallocate After Sanitize bit in Sanitize command Supported
    [2:2] : 0	Overwrite Sanitize Operation Not Supported
    [1:1] : 0x1	Block Erase Sanitize Operation Supported
    [0:0] : 0x1	Crypto Erase Sanitize Operation Supported
  [2:2] : 0x1	Crypto Erase Supported as part of Secure Erase
  [1:1] : 0	Crypto Erase Applies to Single Namespace(s)
  [0:0] : 0	Format Applies to Single Namespace(s)

然后继续执行格式化清理

格式化命令

格式化命令在概念上更接近 hdparmfdisk 的混合体,因为它允许为驱动器设置底层参数,并且还可以发送安全擦除命令。

nvme-format(1) 给出了关于安全擦除设置 (-s/--ses) 选项的以下详细信息

安全擦除设置:此字段指定是否应将安全擦除作为格式化的一部分执行,以及安全擦除操作的类型。擦除适用于所有用户数据,无论其位置如何(例如,在暴露的 LBA 内、在缓存内、在已释放的 LBA 内等)。默认为 0。

可能的值 

定义
0 未请求安全擦除操作
1 用户数据擦除:应擦除所有用户数据,擦除后用户数据的内容是不确定的(例如,用户数据可能被填充为零、填充为一等)。如果所有用户数据都被加密,则控制器可以在请求用户数据擦除时执行加密擦除。
2 加密擦除:应以加密方式擦除所有用户数据。这是通过删除加密密钥来实现的。

虽然格式化命令接受整个 NVMe 字符设备(例如 /dev/nvme0)或特定的命名空间块设备(例如 /dev/nvme0n1),但在触发它之前,请确保您的驱动器支持此功能。例如,在上面的 Identify Controller 命令的输出中,我们看到 Crypto Erase Applies to Single Namespace(s)Format Applies to Single Namespace(s) 位设置为零,根据规范,这意味着“控制器支持基于每个命名空间的格式化”(请参阅图 249 字节行 524“Format NVM Attributes (FNA)”)。

例如,要使用加密擦除格式化 /dev/nvme0 的命名空间 1

# nvme format /dev/nvme0 -s 2 -n 1

使用 -n 0xffffffff 格式化所有命名空间。

有关设备/命名空间选择的更多信息和重要警告,请参阅 nvme-format(1)

清理命令

创建清理命令是为了“在功能上等同于 SATA 和 SAS 实现中同名的命令”[4]。来自 上述文章

根据 NVMe 1.4 规范,“清理操作会更改 NVM 子系统中所有用户数据,从而无法从任何缓存、非易失性介质或任何控制器内存缓冲区中恢复任何以前的用户数据。”
清理和格式化之间的最大区别在于,清理确保缓存被删除,并且在意外断电后该过程重新开始。清理还支持模式覆盖以进行安全擦除操作,这对 NAND 耐用性来说是可怕的,但可以与其他类型的存储和内存类一起使用,或者为了更确定用户数据无法恢复。

-a/--sanact 选项的用法和可能的值在 nvme-sanitize(1) 中描述。

块擦除和加密擦除之间的区别在于,加密擦除仅擦除加密密钥(如 NVMe 1.4 规范中所定义)

用户数据擦除:应擦除所有用户数据,擦除后用户数据的内容是不确定的(例如,用户数据可能被填充为零、填充为一等)。如果所有用户数据都被加密,则控制器可以在请求用户数据擦除时执行加密擦除。
加密擦除:应以加密方式擦除所有用户数据。这是通过删除加密密钥来实现的。
...
块擦除清理操作使用特定于介质的低级块擦除方法来更改 NVM 子系统中可能存储用户数据的所有位置上的用户数据;
加密擦除清理操作通过更改 NVM 子系统中可能存储用户数据的所有位置上的介质加密密钥来更改用户数据……

您可以获得各种方法在您的驱动器上所需时间的估计值(如果支持)

# nvme sanitize-log /dev/nvme0
...
Estimated Time For Overwrite                   :  4294967295 (No time period reported)
Estimated Time For Block Erase                 :  174
Estimated Time For Crypto Erase                :  34

如果相反,您得到如下结果

# nvme sanitize-log /dev/nvme0
...
Estimated Time For Overwrite                   :  4294967295 (No time period reported)
Estimated Time For Block Erase                 :  4294967295 (No time period reported)
Estimated Time For Crypto Erase                :  4294967295 (No time period reported)

那么请确保该操作需要很长时间才能完成。作为参考,在报告这些结果的 Intel 660p 512GB 上,块擦除大约需要 2-3 小时才能完成。

警告: 一旦开始,此操作是不可中断的 — 即使断电也是如此 — 并且在进程完成之前(可能需要很长时间),驱动器将变得不可用。

要启动加密擦除清理操作

# nvme sanitize device -a start-crypto-erase
注意: device 参数是强制性的 NVMe 字符设备(例如 /dev/nvme0而不是 /dev/nvme0n1),因为该操作必然适用于整个设备

对于块擦除

# nvme sanitize device -a start-block-erase
警告: 即使您的驱动器支持覆盖操作,也请避免使用它,因为它“由于耐用性,对于基于 NAND 的 SSD 来说不是好的或推荐的”。

您可以使用清理日志跟踪进度

# nvme sanitize-log /dev/nvme0

正在进行加密擦除的驱动器的示例输出

Sanitize Progress                      (SPROG) :  655
Sanitize Status                        (SSTAT) :  0x4
Sanitize Command Dword 10 Information (SCDW10) :  0x4
Estimated Time For Overwrite                   :  4294967295 (No time period reported)
Estimated Time For Block Erase                 :  174
Estimated Time For Crypto Erase                :  34
Estimated Time For Overwrite (No-Deallocate)   :  0
Estimated Time For Block Erase (No-Deallocate) :  0
Estimated Time For Crypto Erase (No-Deallocate):  0

当命令成功完成时

Sanitize Progress                      (SPROG) :  65535
Sanitize Status                        (SSTAT) :  0x101
Sanitize Command Dword 10 Information (SCDW10) :  0x4
Estimated Time For Overwrite                   :  4294967295 (No time period reported)
Estimated Time For Block Erase                 :  174
Estimated Time For Crypto Erase                :  34
Estimated Time For Overwrite (No-Deallocate)   :  0
Estimated Time For Block Erase (No-Deallocate) :  0
Estimated Time For Crypto Erase (No-Deallocate):  0

使用 blkdiscard 的通用方法

来自 util-linux 软件包的 blkdiscard(8) 命令提供了一个 --secure 选项,用于“执行安全丢弃。安全丢弃与常规丢弃相同,只是还必须擦除垃圾回收可能创建的丢弃块的所有副本。这需要设备的支持”。

要使用它,请执行

# blkdiscard --secure /dev/device

对于不支持安全擦除的设备,-z/--zeroout 选项会用零填充设备,而不是默认情况下仅丢弃设备上的所有块。

有关 blkdiscard 的一般安全性的讨论,请参阅 [5],有关使用 blkdiscard 擦除卷的说明,请参阅 [6]

故障排除

擦除驱动器后 UEFI 启动项被移除

某些 UEFI 实现会在系统启动时删除引用不存在文件的启动项。如果您计划在内存单元清除后从备份还原系统,请确保还使用 efibootmgr 或重新安装引导加载程序来还原启动项。

参见