为什么 blkdiscard 没有擦除整个驱动器的所有数据?

为什么 blkdiscard 没有擦除整个驱动器的所有数据?

我有一个旧的 mSATA SSD(型号名称:Plextor PX-128M6M),它安装到带有 ASM1153E 控制器的 mSATA 转 USB 外壳中。

我想要(逻辑上,在SSD控制器级别)删除其所有数据。

然而,似乎:

  1. blkdiscard命令实际上并没有擦除所有请求的数据区域,只是实际擦除了开头的 2GiB 减去 32KiB 的数据。

  2. hdparm --trim-sector-ranges-stdin看起来工作正常,但是 SSD 控制器(具体来说,这个型号的SSD,另一个型号似乎没有这样的行为)似乎是在保护前 8 个扇区(4KiB 数据)不被TRIM命令擦除。


我的尝试和实验如下:

  1. 我是在 Ubuntu 23.04 下做的。

  2. 感谢 Arch Wiki 的指导,我发现我必须设置/sys/block/sdX/device/scsi_disk/*/provisioning_modeunmap第一个。最初是这样full。之后,我认为系统就可以将SCSIUNMAP命令(通过UASP,TRIM由控制器转换为命令)发送到旧SSD。

  3. 然后我对整个驱动器执行了此操作:(blkdiscard -f -v /dev/sdXsdX实际的设备名称),然后它报告所有字节(与磁盘容量匹配)都被丢弃(擦除),但是我发现主 GPT 和备份 GPT 都在磁盘空间的开头/结尾仍未被删除。

  4. 我创建了一个大小为 2GiB 的分区,然后用从/dev/urandom.

  5. blkdiscard -f -v /dev/sdX对整个驱动器进行了操作,hexdump然后显示第一个分区的最后 1MiB + 32KiB 未被擦除(分区从 LBA 2048 开始,扇区大小为 512 字节)。

  6. blkdiscard -f -v /dev/sdX1在新分区而不是整个驱动器上重新执行后,hexdump显示该分区的最后 32KiB 未被删除。

  7. 然后我尝试hdparm --trim-sector-ranges-stdin使用从标准输入提供的整个驱动器的所有扇区的列表。这次主GPT仍然存在,但所有剩余数据都被擦除为零。

  8. 我用数据填充了前 2048 个扇区/dev/urandom。然后hdparm --trim-sector-ranges-stdin似乎删除了除前 8 个扇区(4KiB 数据)之外的所有数据。


要确认前 8 个扇区未被擦除的行为是由 SSD 控制器而不是 mSATA-to-USB 芯片强制执行的:

  1. 然后我安装了这个旧的 Plextor SSD 作为内部 mSATA 驱动器,没有 USB 外壳。之后,前8个扇区仍然幸存hdparm --trim-sector-ranges-stdin

  2. 我还有另一块较新的金士顿品牌 mSATA SSD。我用 进行了测试hdparm --trim-sector-ranges-stdin,但所有扇区都为零,无一例外,无论它是 USB 封装还是直接作为内部驱动器安装。

相关内容