在一个 SSD 上的两个驱动器之间移动文件 - 它会被复制吗?

在一个 SSD 上的两个驱动器之间移动文件 - 它会被复制吗?

在一个驱动器内移动文件时,文件不会被复制和删除。引用文件的表只是更新。据我所知,HDD 上的 2 个驱动器并非如此。但 SSD 不同,没有专用于每个驱动器的物理空间。(来源

所以我的问题是,当将文件从同一个 SSD 上的一个驱动器移动到另一个驱动器时会发生什么,是复制字节并删除原始字节,还是更新某些表,从而减少对 SSD 的干扰?

已经有一个重复的问题这里。但两个答案都声称:

每个分区都有自己的驱动器物理区域

对硬盘进行分区实际上会为每个分区指定物理区域。[并在评论中:] SSD 仍然是硬盘,只是没有磁盘。

据我所知,这是错误的。参见这里

那么,有谁能更了解 SSD 吗?请告诉我,尽管他们犯了错误,但他们的评估是否正确?

答案1

据我所知这是错误的

引用的描述一半正确,一半错误。但对于硬盘来说,也是一半错误。

对驱动器进行分区指定逻辑每个分区的区域。操作系统根本不关心物理位置——它只是要求驱动器“读取逻辑块#31415926” 并且驱动器本身决定数据位于何处。这对于磁性存储器和闪存的工作方式相同。

事实上相同就像过去 20-25 年的 HDD 一样:尽管早期的操作系统使用物理柱面/磁头/扇区位置,但现在已经不复存在了。您不知道 LBA #1234 保存在哪个盘片上的确切位置。HDD 甚至会自动重新映射坏的物理扇区,因此可以突然从完全不同的物理区域读取相同的 LBA - 就像 SSD 一样。

因此,无论是 HDD 还是 SSD,操作系统都只有一系列 LBA(例如 0-999999)来读取和写入数据。分区的目的是在其中分配子范围 - 例如分区 A 分配 10-499999,分区 B 分配 500000-999999。每个分区都有一个独立的文件系统,每个分区内都有文件系统无法引用外部数据– 它们不能跨越分区边界。(例如,分区 A不能有一个文件,其数据保存在扇区#600000 中。)

因此,从一个地方移动到另一个地方的所有文件都必须完整复制。

(尽管如此,理论上操作系统可能能够磁盘本身将数据从一个区域复制到另一个区域(例如“将 LBA #1234 复制到 #567890”),而不必将其复制到主内存然后再复制回来,当然这将完全绕过分区边界。例如,这可以利用 SSD 的“闪存转换层”。但实际上,据我所知,这并没有做到。)

答案2

当数据写入固态硬盘时会发生什么值得几篇文章(很好的总结这里),因为它非常复杂,并且取决于底层技术。简而言之,SSD 通常无法将零位写入内存。相反,它们必须将整个内存部分清零(擦除),然后只需将 1 写入其中即可存储数据。如今,它们通常将 1 写入内存。512字节,但擦除8 个块,也就是 4096。这一点,以及每次写入/擦除循环都会导致内存出现一些物理磨损,而内存最终会磨损的事实,使得 SSD 与旋转磁性 HDD 有很大不同。

除此之外,SATA 驱动器(以及据我所知 SAS 驱动器)没有实现将数据从一个扇区复制到另一个扇区的本机命令。(或者至少 SATA 或 SAS 规范中没有任何内容要求它们这样做,因此操作系统不能指望这样的命令可用。)因此,跨分区的文件复制将涉及将数据从一个驱动器扇区读入主机内存,然后将其写回到驱动器的另一个扇区。

这是因为对于操作系统而言,驱动器是一组编号的逻辑扇区,它所能做的就是从扇区读取数据和向扇区写入数据。操作系统无法告诉驱动器重新映射扇区。

此外,文件系统(HFS+、NTFS、ext3 等)是一组数据结构,用于对一组逻辑块进行排序。这些数据结构实现了“文件”、“文件名”、“目录”、“权限”等。因此,当您将文件从一个目录移动到另一个目录时,它不会被复制;只有指示文件所在的目录的文件系统数据会更新。

一个概念分割是驱动器上的一组逻辑扇区,由单个文件系统声明。其必然结果是文件系统不能访问其分区之外的扇区。这在很大程度上是一种安全特性,但也源于这样一个事实:文件系统的数据结构都是围绕着文件系统所有权下的驱动器的每个扇区而构建的,向这些结构中添加或删除扇区并非易事。这就是为什么您必须运行特殊例程来调整分区的大小,也是为什么文件系统坚持在连续的扇区集上运行。

因此,将文件复制实现为将扇区从一个文件系统转移到另一个文件系统是不切实际且危险的。在旋转磁盘驱动器上,这也将是一场性能噩梦,因为尽管驱动器会对坏扇区做出例外处理,但通常它会以优化连续编号扇区的读写速度的方式安排扇区的物理位置。

此外,两个文件系统在磁盘上存储文件数据的方式可能不同,这意味着即使可行,交换扇区也行不通。即使它们是完全相同的文件系统类型(例如 NTFS),一个也可能使用加密或压缩,而另一个则不使用,或者两者都可能加密数据,但使用不同的密钥。文件中的数据并不要求与磁盘上存储的数据完全相同,只需存储数据的可逆转换,这样文件系统就可以通过对磁盘上的数据进行某些操作来获取文件的数据。因此,除非两个文件系统都使用完全相同的转换,否则简单地交换扇区无法实现传输文件数据的目标。

出于所有这些原因,对于操作系统编写者和文件系统编写者来说,实现一项优化 SSD 跨分区移动的功能实在是太费力了,而且收获甚微。因此,任何跨分区移动都将是一次读取和一次写入。

在 SSD 内部,情况略有不同。尽管操作系统没有告诉驱动器它正在将数据从一个地方复制到另一个地方,但写入 SSD 的成本非常高(而且很复杂),因此 SSD 控制器需要做大量工作来尽量减少写入。有些 SSD 甚至会尝试检测写入存储的扇区是否与已存储的扇区匹配,并将该物理内存标记为现在映射到 2 个不同的逻辑扇区,而不是复制它,从而在内部驱动器级别完成操作系统无法完成的工作。

但不要指望它。

相关内容