我有一个旧的 mSATA SSD(型号名称:Plextor PX-128M6M),它安装到带有 ASM1153E 控制器的 mSATA 转 USB 外壳中。
我想要(逻辑上,在SSD控制器级别)删除其所有数据。
然而,似乎:
blkdiscard
命令实际上并没有擦除所有请求的数据区域,只是实际擦除了开头的 2GiB 减去 32KiB 的数据。hdparm --trim-sector-ranges-stdin
看起来工作正常,但是 SSD 控制器(具体来说,这个型号的SSD,另一个型号似乎没有这样的行为)似乎是在保护前 8 个扇区(4KiB 数据)不被TRIM
命令擦除。
我的尝试和实验如下:
我是在 Ubuntu 23.04 下做的。
感谢 Arch Wiki 的指导,我发现我必须设置
/sys/block/sdX/device/scsi_disk/*/provisioning_mode
为unmap
第一个。最初是这样full
。之后,我认为系统就可以将SCSIUNMAP
命令(通过UASP,TRIM
由控制器转换为命令)发送到旧SSD。然后我对整个驱动器执行了此操作:(
blkdiscard -f -v /dev/sdX
是sdX
实际的设备名称),然后它报告所有字节(与磁盘容量匹配)都被丢弃(擦除),但是我发现主 GPT 和备份 GPT 都在磁盘空间的开头/结尾仍未被删除。我创建了一个大小为 2GiB 的分区,然后用从
/dev/urandom
.blkdiscard -f -v /dev/sdX
对整个驱动器进行了操作,hexdump
然后显示第一个分区的最后 1MiB + 32KiB 未被擦除(分区从 LBA 2048 开始,扇区大小为 512 字节)。blkdiscard -f -v /dev/sdX1
在新分区而不是整个驱动器上重新执行后,hexdump
显示该分区的最后 32KiB 未被删除。然后我尝试
hdparm --trim-sector-ranges-stdin
使用从标准输入提供的整个驱动器的所有扇区的列表。这次主GPT仍然存在,但所有剩余数据都被擦除为零。我用数据填充了前 2048 个扇区
/dev/urandom
。然后hdparm --trim-sector-ranges-stdin
似乎删除了除前 8 个扇区(4KiB 数据)之外的所有数据。
要确认前 8 个扇区未被擦除的行为是由 SSD 控制器而不是 mSATA-to-USB 芯片强制执行的:
然后我安装了这个旧的 Plextor SSD 作为内部 mSATA 驱动器,没有 USB 外壳。之后,前8个扇区仍然幸存
hdparm --trim-sector-ranges-stdin
。我还有另一块较新的金士顿品牌 mSATA SSD。我用 进行了测试
hdparm --trim-sector-ranges-stdin
,但所有扇区都为零,无一例外,无论它是 USB 封装还是直接作为内部驱动器安装。