固态硬盘/存储单元擦除 - Arch Linux 中文维基

跳转到内容

# 固态硬盘/存储单元擦除

来自 Arch Linux 中文维基
< 固态硬盘

翻译状态：

- 本文（或部分内容）译自 Solid state drive/Memory cell clearing，最近一次同步于 2025-08-09，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

相关文章

- 固态硬盘
- 安全地擦除磁盘

有时，可能希望将固态硬盘完全重置到其出厂时的“干净”状态，这可以将其写入性能恢复到出厂时的水平。即使固态硬盘原生支持TRIM，写入性能也会随着时间的推移而下降，这是由于 TRIM 仅在文件删除时起作用，而对文件替换（例如增量保存）无效。

注意，执行安全擦除不能重置固态硬盘单元的损耗状态。在安全擦除后，一个接近使用寿命的硬盘在短时间内可能可再次写入，但在不久之后仍会失效。

警告：

- 继续操作前请备份所有重要数据！此过程将销毁固态硬盘上的所有数据，即使专业数据恢复服务提供商也无法恢复数据！完成此过程后，需要重新分区设备并将需要的数据重新复制到硬盘上！
- 如果要擦除的硬盘不是直接连接到SATA/NVMe接口，请不要继续。在通过USB或SAS/RAID卡连接的硬盘上执行安全擦除/格式化/净化（Sanitize）命令可能会导致硬盘变砖！

提示：清理硬盘后，在分区之前，应当检查其逻辑扇区大小是否已设置为最佳大小。更改逻辑扇区大小需要清空数据，因此最好在还未存入数据时更改。

## SATA 硬盘

ATA有两个用于擦除硬盘的命令——`SECURITY ERASE UNIT` 和 `ENHANCED SECURITY ERASE UNIT`。[1]

提示：这些命令也可用于将机械硬盘清零。

### 确保硬盘未处于冻结模式

执行以下命令：

    # hdparm -I /dev/sdX | grep frozen

在输出的安全（security）部分，应该显示 `not frozen`。若显示 `frozen`，将无法进行下一步操作。详见固态硬盘#冻结模式。

一个可能的解决方法是，挂起系统（注意要使用 S3 而非 S0ix）。唤醒后，冻结状态很可能会被解除。若不成功，且硬盘通过SATA接口连接，可以尝试热插拔硬盘数据线（注意，这可能会导致内核崩溃）。如果热插拔SATA数据线导致内核崩溃，重启系统，在系统完全启动后，快速地热插拔SATA电源线和数据线。如果热插拔SATA线仍然导致内核崩溃，请确保在BIOS中启用了AHCI（AHCI允许进行热插拔操作，不应引起系统崩溃）。如果有支持热插拔的USB-to-SATA适配器，可尝试通过适配器连接设备。此外，还可通过 USB 使用 hdparm包。

#### Dell 系统

如果命令输出显示"frozen"，或许可以通过以下方式解决：

1. 启动时按 F2，进入 Dell BIOS。
2. 在 BIOS 中设置内置硬盘密码（注意，BIOS中使用的键盘布局是 en_US / qwerty）。
3. 应用更改并重启。
4. 当 Dell Security Manager 提示输入密码时，直接按ESC而不要输入密码。硬盘将保持锁定但非冻结状态。
5. 在下文的步骤中，跳过启用安全功能的部分，直接执行擦除命令。

提示：如果正在使用联想系统，并且无法通过上面提到的方法解除"frozen"状态（例如，联想平板电脑通过M.2接口而不是SATA接口连接固态硬盘），可以使用联想提供的专有工具完成闪存单元清理，而不是遵循本文的步骤。另见[2]

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

提示：设置用户密码后，在下一次重启后，硬盘将被锁定，只有使用正确密码解锁后才能正常访问。
警告：执行此步骤后不要重启计算机，特别是联想笔记本电脑。某些联想 BIOS 版本可能使用一种有偏差的算法来计算加密密钥。重启后，机器可能识别到固态硬盘。[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分钟），表明该设备是自加密的，执行安全擦除操作时，其固件将只擦除内部的加密密钥，而不是覆写所有数据单元。[4]

警告：

- 请再三检查是否使用了正确的硬盘代号。一旦确认命令，将无法挽回。
- 确保执行命令时硬盘未被挂载。如果在设备已挂载时执行安全擦除命令，可能无法正常完成擦除。

    # hdparm --user-master u --security-erase PasSWorD /dev/sdX

等待命令完成。对于在本例中使用的Intel X25-M 80GB固态硬盘，该过程耗时约 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 固态硬盘相同的方式进行清理。NVMe 规范定义了一种标准化的格式化 NVMe 硬盘的方法。最初，可通过nvme-format(1) 命令（nvme-cli包 的一部分）进行格式化。在此基础之上，1.3 版规范增加了专用的 nvme-sanitize(1) 命令。NVM Express 联盟对上述命令的描述如下：

  这些命令用于安全地擦除设备上的用户数据。可在部署新设备、报废旧设备、设备寿命耗尽、将设备用于新应用等场景使用。在 NVMe 1.3 规范中引入净化（Sanitize）之前，NVMe 格式化（Format）专门用于执行安全擦除。虽然格式化与净化都能擦除数据，但净化在确保数据被正确擦除方面更为可靠；格式化则适用于日常使用和测试。

要获取硬盘支持的功能，使用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)

根据设备支持情况，选择使用格式化或净化命令。

### 格式化命令

在概念上，格式化（Format）命令更接近于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)`位被设置为零，根据规范，这意味着“控制器支持基于每个命名空间的格式化”（参见“Non-Volatile Memory Host Controller Interface”文档中，图表82“Identify Controller Data Structure”中对第524字节，“Format NVM Attributes”字段的描述[5]）。

例如，要对`/dev/nvme0`设备命名空间1使用加密擦除方式进行格式化：

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

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

有关设备/命名空间选择的更多信息和注意事项，参见nvme-format(1)。

### 净化命令

净化（Sanitize）命令用于实现“在功能上等同于 SATA 和 SAS 实现中同名的命令”的功能[6]。前述文章中提到：

  根据 NVMe 1.4 规范，“净化操作会改变 NVM 子系统中的所有用户数据，使得不可能从任何缓存、非易失性介质或任何控制器内存缓冲区中恢复任何先前的用户数据。”
  净化和格式化之间的最大区别在于，净化确保缓存被擦除，并且在意外断电后重新启动时，该过程会重新开始。对于安全擦除操作，净化还支持使用特定模式覆写（pattern overwrite）。注意，对于NAND存储设备，使用特定模式覆写将损耗闪存寿命。因此，特定模式覆写一般用于使用其它存储方式的设备，但若要进一步降低用户数据恢复的可能性，也可以用于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

警告：即使硬盘支持，也应当避免使用块擦除（Overwrite）操作，因为“由于将损耗设备寿命，不推荐对基于NAND的固态硬盘进行块擦除操作”。

可以使用净化日志（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的通用方法

blkdiscard(8)命令（util-linux包软件包的一部分）支持`--secure`选项，用于“执行安全discard操作。安全discard操作与常规discard操作相同。只是，对于正在discard的块，其所有副本（可能在垃圾回收过程中创建）也将被擦除。安全discard操作需要设备的支持”。

要执行安全discard操作：

    # blkdiscard --secure /dev/device

对于不支持安全擦除的设备，可使用`-z`/`--zeroout`选项，在discard设备上的所有块的基础上，还会将设备填充为零。

关于`blkdiscard`安全性的讨论，参见[7]。关于使用`blkdiscard`擦除卷的示例，参见[8]。

## 故障排除

### 擦除硬盘后 UEFI 启动项被移除

某些UEFI实现会在系统启动时移除引用了不存在启动文件的启动项。如果计划在擦除设备后从备份中恢复系统，需要使用efibootmgr或通过重新安装引导加载程序的方法恢复启动项。

## 另见

- Secure Erase HDDs/SSDs (SATA/NVMe) using hdparm & nvme-cli on Linux (2019): good tutorial with images
- Verifying SSD Sanitization

分类：​

- 存储

固态硬盘/存储单元擦除
添加话题