如何从SSD驱动器安全擦除文件?

在尝试安全擦除SSD时,我们遇到了几个问题:

  • 在有限的擦除周期后,SSD会磨损
  • SSD有一个控制器,可以动态地将LBA(系统用来访问磁盘的逻辑块地址)映射到NVRAM单元(实际的闪存单元)以平衡磨损,这意味着告诉磁盘覆盖以前存储的特定块文件可能会导致覆盖任何其他备用块。
  • 固态硬盘具有显着的备用容量百分比,用于补偿垂死的存储单元并减少磨损。 它们对系统不可见,并且可能包含旧数据片段。

现在我们从Ubuntu内部有什么选择来安全地擦除SSD?

我听说一些较新的SSD应该能够安全擦拭自己,但是我怎么知道我的SSD是否具有这种function以及如何触发它?
还应该有ATA安全擦除命令,如何确定是否支持该命令以及如何触发?

是否还有方法可以安全地仅擦除给定文件或仅使用未使用的空间?
我想对所有分区进行备份,安全地擦除整个磁盘,然后恢复备份是可能的,但听起来太复杂,实际上需要很长时间。 还有其他选择吗? 如果没有,我可以使用哪些工具来备份分区而不备份已删除的文件?

当然,对于上述要点,诸如shredwipe的标准工具在这里是不可用的。 它们只是覆盖一个文件(通过覆盖其绑定到LBA的文件系统簇,由于磨损均衡控制器,LBA不会一直指向相同的闪存单元)。

目前,如果不擦除整个驱动器的内容或访问SSD固件,就无法安全擦除SSD上的文件。

  • 无法知道SSD可以存储逻辑块的先前副本的位置。

  • 更糟糕的是,由于文件系统的日志记录和写时复制机制,可能无法知道哪些逻辑块可能保存特定文件的先前副本。

防止已删除文件泄漏给直接访问驱动器的人的唯一方法是首先加密它们并保持加密密钥不被窥探。

附录:

我做了一些研究,发现如果你设法学习文件系统的所有未占用扇区,你可以排序删除所有以前删除的文件,这通常是可能的,并由一些文件系统工具提供(例如对于ext * family ),然后丢弃它们(例如,使用blkdiscard(8) ,如链接问题的答案中所述 ),它返回垃圾收集块,直到它们再次被使用并在此过程中被覆盖。

这对于无法直接访问闪存单元的每个人都是安全的,所以每个人都是

  • 没有合适的闪光灯读取装置和
  • 不能说驱动器固件显示未分配块的内容(在大多数情况下需要对固件进行有意义的修改以及自定义ATA命令,因为没有标准化的方法)。