未分配空间中的 SSD 磨损均衡

未分配空间中的 SSD 磨损均衡

有很多问题与磨损均衡有关。由于我们与机械磁盘驱动器打交道已经很久了,似乎我们中的很多人都无法理解这项新技术。

大家的共识是,自由空间,即未使用的空间,将被用来“平衡”使用情况,这样单个单元就不会像没有这种转移利用率那样快速地掉出来。

我确实找到了一篇文章,其中提到 SSD 损耗均衡功能对分区不感兴趣;它将利用设备上任何可用的单元。但这篇文章含糊不清,未能回答我的问题。

我的问题是,未分配的空间以及任何其他分区是否会被用作磨损均衡功能?

附加信息:留出一些空间的目的是为了在将系统映像还原到较小的驱动器时使用。某些备份软件会忽略可用空间,因此这不会成为问题,但逐位映像除外,因为这些映像包含可用空间,因此还原过程将失败。即时 Windows 设置是 500GB SSD,它仅使用 100GB,因为所有文件都存储在其他地方;换句话说,我的系统驱动器。我更愿意用 240 到 250GB 的驱动器替换,而不必担心可能的大小问题。我使用 Acronis TIH 和 Windows 内置系统映像软件。我没有将 Acronis 设置为逐位,我不确定 Windows 会做什么。

在此先感谢大家的任何评论、建议或明确答案的指示。

答案1

我的问题是,未分配的空间以及任何其他分区是否会被用作磨损均衡功能?

是的。但是你提问的方式意味着对 SSD 操作的理解是错误的。

驱动器固件的工作是管理存储单元,无论其用途如何。这意味着无论驱动器是否分区、是否格式化或是否具有某些专有组织结构。

分区、文件系统和未分配空间等内容由操作系统处理,而不是驱动器的固件。

即使可以编写一个能够读取分区和文件系统的固件,但固件的目的并不是这样做,而且这有点危险。

ATA TRIM 命令是操作系统级别和固件级别之间的一道门。指示不再使用的扇区可让固件有机会在操作系统将来向这些扇区发出写入命令之前删除其内容。

通过很早就将这些扇区通知给固件,对这些扇区的下一个写入命令不需要固件在写入新内容之前删除这些扇区,因为固件之前有时间删除这些扇区。

这样,您可以节省删除扇区所需的时间,这是在扇区上写入新内容的先决条件。

答案2

您说得对,SSD 无法理解分区表 - 对于它们来说,这些都只是字节 - 因此它们无法可靠地判断哪些空间应被视为未使用。一旦某个扇区被写入,SSD 就必须将其视为已使用。

这就是为什么修剪是一个东西。计算机可以发送“修剪”命令将某个区域标记为未使用。这意味着 SSD 对正在使用的扇区的理解不仅仅是知道它们是否属于某个分区。即使是属于某个分区且上面有有效文件系统的区域,也可以修剪以回收现已删除的文件占用的扇区。

您的操作系统很可能会定期修剪驱动器(出于性能原因,它不会立即完成)。

修剪不会立即擦除数据。首先,这通常是不可能的:SSD 上的数据组织成擦除块并且每次更新存储在此类块中的数据都需要重写整个块。因此,必须修剪整个擦除块才能真正被视为未使用。其次,因为 SSD 的使用寿命有限(以写入次数衡量)。主动销毁未使用的数据会不必要地消耗写入周期并缩短驱动器的使用寿命。相反,驱动器只会认为此类块中的数据已过时。它将可用于覆盖以进行磨损均衡,并且不会主动保存数据。

值得注意的是,如果您使用全盘加密,TRIM 可能会带来安全隐患。正确加密的磁盘看起来像是随机的乱码,即使在没有存储数据的区域也是如此。因此,修剪可能会显示空白区域,因为这些乱码可能会变成实际的零,或者可能是其他可识别的模式。这是否是个问题取决于个人的明智判断。


请记住,在较新的 GPT 分区方案中,备份分区表头存储在磁盘末尾。因此,将完整映像写入较小的驱动器会将其切断。使用某些分区工具在恢复后重新创建它可能是一个好主意。

答案3

未分配空间

是否(一系列)逻辑块被标记为已分配在分区表中(或者换句话说,分区的一部分)与其是否被视为“已使用”/“已占用”/“已映射”(到实际存储)没有直接关系。

这很像文件系统级别,分区(或驱动器,如果“无分区”)的每个逻辑块都不是被视为已使用的。然而,文件系统所跟踪/记录的内容与驱动器固件所做的事情也没有直接关系,这就是为什么它需要由操作系统“通知”(通过“TRIM”)以了解哪些逻辑块可以被视为“空闲”(即,它所包含的数据可以被视为“可忘记的”)。

此类通知可以在文件删除时触发(例如discardLinux 中的挂载选项或 Windows 中的删除通知“行为”),根据分区/驱动器上的文件系统中的当前记录定期触发(例如fstrim在 Linux 中),或“忽略文件系统”(即整个分区/驱动器)“TRIM”(例如blkdiscard在 Linux 中)。

如果您对编程有所了解,您还可以将驱动器(如今已不一定是 SSD)上的逻辑块视为指针。TRIM 有点像设置(一堆)指针NULL(这与释放“实际”内存也不完全相同,就像 TRIM 不会立即擦除存储单元一样)。分区只不过是一个收藏逻辑块,这反过来只是一种告诉文件系统可以使用哪些逻辑块以及最多可以使用多少逻辑块的方法。(逻辑块的“位置”或分区中块的连续性并不反映数据在后台的放置位置/方式。)文件系统驱动程序可以告诉操作系统可以将“分配给”文件系统的“指针”中的哪一个设置为NULL,但文件系统本身不负责保存该记录。

在分区表中“分配”空间作为分区只不过是向其中添加一个记录条目,该条目由起始和结束逻辑块的零基地址组成(当然还有一些其他信息)。它不会告诉固件“设置”范围内的所有块“到NULL”。(但是,在 Linux 中,许多mkfs实用程序默认情况下确实如此。不确定 Windows 是否如此,但据我所知,它在形成时不会触发完整分区/驱动器 TRIM。)

PS 对于您的克隆问题,不同的克隆软件可以有不同的克隆方式。如果软件以逐个分区的方式执行(即仅克隆分区表和所有分区,但不克隆“未分配空间”),那么只要“分配”/分区空间不大于目标驱动器,就不会出现驱动器大小问题。但是,它也可以以“分区不感知”(即全驱动器逐块)的方式执行。在这种情况下,如果目标驱动器大小小于源驱动器,就会出现问题。由于这两种方式都会克隆相关的所有逻辑块(即“文件系统不感知”),因此所有相应的块都将被视为由目标驱动器上的固件“占用”,无论它们在源驱动器上是否如此,直到您可能fstrim在目标驱动器上运行。 (您可能已经注意到,没有确切的方法可以“获取”/“读取”某个块是否“已设置为NULL”。即使在特定驱动器上,某个块将“在 TRIM 之后读取零”,但这并不意味着“读取零意味着 TRIM'd”或“写入零等同于 TRIM”。)

相关内容