如何安全地擦除/抹掉固态硬盘数据

Limonene Lv1

在出售或丢弃使用过的硬盘时,出于隐私考虑,一般都要彻底清除硬盘上存储的个人数据(如果是游戏盘或者只存储了小姐姐那另当别论)。众所周知,通过「格式化」的方式擦除硬盘数据没有任何安全保证,甚至不需要任何物理措施,仅凭一些简单易用的恢复软件就能从被格式化的硬盘上恢复大量信息。因此,对于机械硬盘而言,通常安全擦除数据的做法是用随机数据或全 0 全 1 反复覆写硬盘的全部扇区,这样不仅可以防止硬盘被数据恢复软件读出,还能防止通过物理开盘的方式恢复数据。

机械硬盘的数据在覆写一次后,仍有可能存在残留的磁性信息,因此一般会覆写多次,并使用随机数据填充。

但是对于固态硬盘而言,反复覆写数据的方式并不合适。一是固态硬盘主控具备平衡磨损的功能,所以一次全盘写入并不能保证真的写入到了每个数据块中。二是固态硬盘的寿命与写入量直接相关,反复全盘覆写会严重折损固态硬盘寿命。

因此,这里介绍一下通过 NVMe 协议与 SATA 协议内置的安全擦除数据指令,交由固态硬盘主控自动擦除数据的办法。关于 NVMe 的部分主要参考以下视频:

关于 SATA 的部分主要参考此文档

警告:下述步骤会不可逆地擦除硬盘数据,请务必确认自己已经做好数据备份!在执行关键命令前,请反复检查至少三次!

在下述内容中,我会介绍 Sanitize 与 Secuire Erase 两种方法。

Secure Erase 与 Sanitize 不同,因为它只会擦除映射表,而不会擦除所有已经写入的块。而 Sanitize 既会擦除映射表,也会擦除所有写入的块。因此,Secure Erase 比 Sanitize 更快。在使用 Secure Erase 或 Sanitize 擦除硬盘数据后,所有的用户数据都会被永久销毁。数据无法恢复。

通常来说,Crypto Erase Sanitize 优于 Block Erase Sanitize 优于 Crypto Secure Erase 优于 Secure Erase。可以根据自己硬盘支持的指令自行选择。

NVMe SSD

安装 nvme-cli 命令行工具

以 Ubuntu/Debian 为例,只需要执行

1
2
sudo apt update
sudo apt install nvme-cli

检查 NVMe 硬盘,及 sanitize 命令支持情况

首先通过

1
sudo nvme list

列出系统上的所有 NVMe 硬盘。务必仔细区分系统盘、要擦除数据的硬盘。然后通过

1
sudo nvme id-ctrl /dev/nvme1n1 -H | grep sanicap -A 5

检查 NVMe 硬盘是否支持 Sanitize 指令(sanicap 指 sanitize capability)。注意,将 nvme1n1 替换为你的目标硬盘。如果支持,你看到的输出应该类似于:

1
2
3
4
5
6
sanicap   : 0x<xxxxxxxx>
[31:30] : 0x1 Media is not additionally modified after sanitize operation completes successfully
[29:29] : 0x1 No-Deallocate After Sanitize bit in Sanitize command Not 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

重点关注

1
2
[1:1] : 0x1   Block Erase Sanitize Operation Supported
[0:0] : 0x1 Crypto Erase Sanitize Operation Supported

两行,前者表明是否支持块擦除,后者表明是否支持密钥擦除。密钥擦除的前提是,全部用户数据都是加密的,此时,只需要擦除硬盘存储密钥的区域,就可以保证用户数据无法恢复。

如果你看到的输出类似于

1
2
3
4
5
6
sanicap   : 0
[31:30] : 0 Additional media modification after sanitize operation completes successfully is not defined
[29:29] : 0 No-Deallocate After Sanitize bit in Sanitize command Supported
[2:2] : 0 Overwrite Sanitize Operation Not Supported
[1:1] : 0 Block Erase Sanitize Operation Not Supported
[0:0] : 0 Crypto Erase Sanitize Operation Not Supported

那很遗憾,你的硬盘(和我的非大厂硬盘一样)不支持 Sanitize 指令,只能通过传统的 Secure Erase 方法擦除数据(见后文)。

使用 Sanitize 指令擦除硬盘数据

使用以下指令调用 Sanitize 擦除硬盘数据。注意,将 nvme1n1 替换为你的目标硬盘。:

警告:下述步骤会不可逆地擦除硬盘数据,请务必确认自己已经做好数据备份!在执行关键命令前,请反复检查至少三次!

1
sudo nvme sanitize -a 2 /dev/nvme1n1

使用 nvme --help sanitize 可以看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-a <action>, --sanact=<action>
Sanitize Action:

┌──────────────────────────┬─────────────────────────────────────────┐
│Value │ Definition │
├──────────────────────────┼─────────────────────────────────────────┤
│0x00 │ Reserved │
├──────────────────────────┼─────────────────────────────────────────┤
│0x01 | exit-failure │ Exit Failure Mode │
├──────────────────────────┼─────────────────────────────────────────┤
│0x02 | start-block-erase │ Start a Block Erase sanitize operation │
├──────────────────────────┼─────────────────────────────────────────┤
│0x03 | start-overwrite │ Start an Overwrite sanitize operation │
├──────────────────────────┼─────────────────────────────────────────┤
│0x04 | start-crypto-erase │ Start a Crypto Erase sanitize operation │
└──────────────────────────┴─────────────────────────────────────────┘

因此, -a 2 对应的是 Block Erase santitize,如果想使用 Crypto Erase sanitize,可以替换为 -a 4

执行上述命令后,Sanitize 就已经开始。可以通过如下命令监看擦除过程:

1
2
sudo nvme sanitize-log -H /dev/nvme1n1
watch -n 0.5 sudo nvme sanitize-log -H /dev/nvme1n1

使用 watch 指令可以自动重复执行 log 命令。

使用 Secure Erase 擦除硬盘数据

如果你的硬盘不支持 Sanitize,可以通过 Secure Erase 擦除硬盘数据。注意,将 nvme1n1 替换为你的目标硬盘。:

警告:下述步骤会不可逆地擦除硬盘数据,请务必确认自己已经做好数据备份!在执行关键命令前,请反复检查至少三次!

1
sudo nvme format -s 1 /dev/nvme1n1

使用 nvme --help format 可以看到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-s <ses>, --ses=<ses>
Secure Erase Settings: This field specifies whether a secure erase should be performed as part of the format and the type of the secure erase
operation. The erase applies to all user data, regardless of location (e.g., within an exposed LBA, within a cache, within deallocated LBAs,
etc). Defaults to 0.

┌──────┬─────────────────────────────────────────────────────┐
│Value │ Definition │
├──────┼─────────────────────────────────────────────────────┤
│0 │ No secure erase operation requested │
├──────┼─────────────────────────────────────────────────────┤
│1 │ User Data Erase: All user data shall be erased, │
│ │ contents of the user data after the erase is │
│ │ indeterminate (e.g., the user data may be zero │
│ │ filled, one filled, etc). The controller may │
│ │ perform a cryptographic erase when a User Data │
│ │ Erase is requested if all user data is encrypted. │
├──────┼─────────────────────────────────────────────────────┤
│2 │ Cryptographic Erase: All user data shall be erased │
│ │ cryptographically. This is accomplished by deleting │
│ │ the encryption key. │
├──────┼─────────────────────────────────────────────────────┤
│3–7 │ Reserved │
└──────┴─────────────────────────────────────────────────────┘

因此, -s 1 对应的是 User Data Erase,如果想使用 Cryptographic Erase,可以替换为 -s 2

SATA SSD

SATA SSD 的整体流程与 NVMe SSD 相似,也分为 Sanitize 与 Secure Erase。

警告:擦除 SATA SSD 数据时,务必保证硬盘通过 SATA 数据线直连主板。如果通过 USB 线连接,可能导致硬盘变砖!

安装 hdparm 命令行工具

以 Ubuntu/Debian 为例,只需要执行

1
2
sudo apt update
sudo apt install hdparm

检查 SATA 硬盘,及 sanitize 命令支持情况

首先通过

1
sudo hdparm -I /dev/sdx | grep "SANITIZE feature set -A 3"

检查 SATA 硬盘是否支持 Sanitize 指令。注意,将 sdx 替换为你的目标硬盘。一个可能的输出是:

1
2
3
4
*    SANITIZE feature set
* BLOCK_ERASE_EXT command
* CRYPTO_SCRAMBLE_EXT command
* OVERWRITE_EXT command

三个 EXT 命令分别代表了 Block Erase、Crypto Scramble 以及 Overwrite。哪个不支持就不会显示哪个。如果不支持 Sanitize ,则不会有任何输出。另外也可以通过

1
hdparm --sanitize-status /dev/sdx

检查 SATA 硬盘是否支持 Sanitize 指令。如果支持,输出类似于:

1
2
3
4
5
/dev/sdx:
Issuing SANITIZE_STATUS command
Sanitize status:
State: SD0 Sanitize Idle
Last Sanitize Operation Completed Without Error

否则,输出类似于:

1
2
/dev/sdx:
SANITIZE feature set is not supported

使用 Sanitize 指令擦除硬盘数据

使用以下指令调用 Sanitize 擦除硬盘数据。注意,将 sdx 替换为你的目标硬盘。:

警告:下述步骤会不可逆地擦除硬盘数据,请务必确认自己已经做好数据备份!在执行关键命令前,请反复检查至少三次!

1
hdparm --yes-i-know-what-i-am-doing --sanitize-block-erase /dev/sdx

如果想使用 Crypto Erase sanitize,可以替换为

1
hdparm --yes-i-know-what-i-am-doing --sanitize-crypto-scramble /dev/sdx

执行上述命令后,Sanitize 就已经开始。可以通过如下命令监看擦除过程:

1
2
sudo hdparm --sanitize-status /dev/sdx
watch -n 0.5 sudo hdparm --sanitize-status /dev/sdx

使用 watch 指令可以自动重复执行 status 命令。

--sanitize-block-erase 执行完毕后,可以通过

1
dd if=/dev/sdx bs=8192 status=progress | hexdump

简单验证效果。其输出应该全部为 0。

使用 Secure Erase 擦除硬盘数据

如果你的硬盘不支持 Sanitize,可以通过 Secure Erase 擦除硬盘数据。SATA 硬盘调用 Secure Erase 相比 NVMe 稍稍麻烦一些。可以自行参考这个页面 。总体而言,首先要通过反复睡眠电脑或设置硬盘密码,使得 hdparm -I /dev/sdx 中出现 not forzen(如果是 frozen 无法继续)。

然后通过

1
sudo hdparm --user-master u --security-erase-enhanced p /dev/sda

1
sudo hdparm --user-master u --security-erase p /dev/sda

安全擦除硬盘数据。其中,--user-master up 分别对应前述步骤中设置的密码。

细节这里就不赘述了,可以按前面提到的页面操作。

  • 标题: 如何安全地擦除/抹掉固态硬盘数据
  • 作者: Limonene
  • 创建于 : 2024-01-10 17:46:16
  • 更新于 : 2024-01-23 19:57:29
  • 链接: https://limonene.top/2024-01-10/如何安全地擦除-抹掉固态硬盘数据/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论