固态硬盘/内存单元清除
有时,用户可能希望将 SSD 完全重置为出厂时的“干净”状态,从而将其恢复到 出厂默认写入性能。众所周知,即使在使用原生 TRIM 支持的 SSD 上,写入性能也会随着时间的推移而降低。TRIM 仅能防止文件删除,而不能防止替换,例如增量保存。
执行安全擦除不会重置 SSD 单元的磨损均衡状态 - 接近寿命末期的驱动器可能会在短时间内变为可写,但经过有限次数的写入后仍会失效。
- 在继续操作之前,请备份所有重要数据!使用此过程将销毁 SSD 上的所有数据,甚至数据恢复服务也无法恢复!用户必须重新分区设备并在完成此过程后恢复数据!
- 如果目标驱动器未直接连接到 SATA/NVMe 接口,请勿继续执行此操作。在通过 USB 或 SAS/RAID 卡连接的驱动器上发出安全擦除/格式化/清理命令可能会导致驱动器变砖!
SATA 驱动器
ATA 有两个用于擦除驱动器的命令 — SECURITY ERASE UNIT
和 ENHANCED 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”,您可以通过以下方法解决:
- 重启进入戴尔 BIOS,启动时按 F2 键。
- 在 BIOS 中设置内部 HDD 密码(注意,键盘布局为 en_US / qwerty)。
- 应用更改并重启。
- 当戴尔安全管理器提示输入密码时,按 Esc 键而不是输入密码。驱动器将保持锁定但未冻结状态。
- 跳过步骤 2,直接转到下面的步骤 3。
通过设置用户密码启用安全功能
任何密码都可以,因为这只是临时的。安全擦除后,密码将设置回 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)
格式化命令
格式化命令在概念上更接近 hdparm 和 fdisk 的混合体,因为它允许为驱动器设置底层参数,并且还可以发送安全擦除命令。
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
您可以使用清理日志跟踪进度
# 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 或重新安装引导加载程序来还原启动项。
参见
- 在 Linux 上使用 hdparm 和 nvme-cli 安全擦除 HDD/SSD (SATA/NVMe) (2019):带有图片的优秀教程
- 验证 SSD 清理