固态硬盘/内存单元清除
有时,用户可能希望将 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-SATA 适配器支持热插拔,则可以使用它。也可以通过 USB 使用 hdparm。
Dell 系统
如果命令输出显示“frozen”,您可以通过以下方法解决它:
- 在启动时按 F2 重启进入 Dell BIOS。
- 在 BIOS 中设置内部 HDD 密码(注意,键盘布局是 en_US / qwerty)。
- 应用更改并重启。
- 当 Dell Security Manager 提示输入密码时,按 Escape 而不是输入密码。驱动器将保持锁定但未冻结状态。
- 跳过步骤 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 驱动器不使用 SATA 接口协议,因此无法像 SATA SSD 一样清除,NVMe 规范定义了一种格式化 NVMe 驱动器的标准化方法。最初,提供此功能的是 nvme-format(1) 命令(nvme-cli 的一部分),但虽然它仍然可以,Specification 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
您可以使用 Sanitize Log 跟踪进度
# 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 清理