我想知道你们中是否有人可以帮助我了解 SSD TRIM 命令在 Windows 中实际上的作用。据我所知,一旦用户删除文件,Windows 就会获取该文件占用的簇列表并将其从文件分配表中删除。但是,目录条目保持不变(文件名、时间戳等)。
由于闪存单元删除速度较慢,SSD 会首先维护一个可以写入的空闲单元列表,只有当没有空闲单元时,它才会开始删除标记为删除的单元。控制器不知道单元是否填充了零或包含某些内容,输入 TRIM 命令。
如果 TRIM 命令允许操作系统通知控制器有关已准备好删除的单元格,则一旦调用该命令,控制器将不仅“删除”该单元格,还会删除其内容。
如果这是真的,那么 SSD 上的恢复是如何进行的?
谢谢,at0m
答案1
TRIM 在 Windows 中的作用与在其他操作系统中的作用相同。它是对 SSD(或支持它的其他设备)的命令,大多数情况下只是按原样由操作系统传递。
首先,这里有两个重要的闪存属性:
- 读写flash很快,但是擦除很慢。
- 给定的块在磨损之前只能被擦除一定次数。
这与磁性介质非常不同:磁性介质没有擦除的概念(写入实际上会擦除之前的内容),并且无论你重写同一个块多少次都没有关系(事实上,重写一个块,如果它有任何可检测到的效果,就是好的因为它会重新增强磁场)。
使用闪存的最佳方式是使用为其设计的文件系统,例如 jffs2 或 ubifs,利用闪存可以增量写入(但不能增量擦除)的事实,并在整个设备上执行磨损均衡(尝试以大约相等的次数擦除每个块)。
但是 SSD、SD 卡、USB 棒和大多数其他类型的闪存块设备不允许您正确使用这些特定于闪存的文件系统,因为在原始闪存和块设备接口之间存在所谓的闪存转换层。此层无法绕过,并在闪存之上模拟传统(磁性)块设备。它通过将模拟块设备的虚拟块分散到不同的物理位置来实现必要的磨损均衡,每次重写块时的方式都会有所不同。它还允许虚拟块设备具有较小的块大小,类似于传统块设备的块大小(例如 512 字节或 4096 字节),即使物理闪存擦除块的大小要大得多(通常为 128KB)。
最简单的情况下,每次在虚拟块设备上写入一个块时,FTL(闪存转换层)都要做以下工作,假设闪存擦除块大小为 128KB,虚拟块大小为 4KB:
- 读取一个完整的物理块(包含 32 个虚拟块)
- 用新内容替换你正在写的内容,保留其他 31 个内容
- 擦除设备上某处的新闪存块(或取最近已被擦除的闪存块)
- 将这组新的 32 个虚拟块写入其上。
真正的 FTL 会进行大量智能优化,以避免频繁执行这个全面的过程,因此它并没有听起来那么糟糕。但无论如何,FTL 的工作有时会涉及在写入其他块时重写不相关块的新副本。
问题是,这有时是无用功!FTL 不知道哪些块正在使用,哪些块是空闲的。这是位于虚拟块设备之上的文件系统的工作。没有必要重写实际空闲的块的副本,因为没有人会关心这些块的内容是否在 FTL 的重新映射和重写操作过程中发生变化。如果有一种方法可以告诉 FTL 它不必关心保留哪些虚拟块就好了。好吧,这种方法是存在的,它被称为 TRIM。TRIM 将通过允许 FTL 更少地擦除和重写块来节省您的闪存。
现在,有了这个背景知识,我们来回答您的问题:SSD 上的恢复是如何进行的?
嗯,位于 FTL 上方的文件系统不应该对其仍然需要访问的任何块进行 TRIM,所以我真的看不出这个问题的相关性。如果文件系统中有错误,那么,我想,恢复将主要取决于错误的严重程度。但毫无疑问,无论有没有 TRIM,FTL 层的增加的复杂性肯定会使在某些情况下恢复损坏变得更加困难,例如,如果 FTL 的虚拟到物理映射信息损坏。