数据写到固态磁盘时会发生什么,值得写几篇文章(在这里很好总结),因为它非常复杂并且取决于底层技术。简而言之,SSD通常无法将零位写入内存。取而代之的是,他们必须将整个内存区域清零(擦除),然后再通过将其写入数据来存储数据。通常这些天来,他们写入512字节的块,但擦除一页的8个块,即4096。这以及每个写入/擦除周期都会导致内存的物理磨损,并且内存最终磨损的事实,使SSD变得非常不同比旋转磁性硬盘要好。
暂且不说,SATA驱动器(和AFAIK SAS驱动器)没有实现将数据从一个扇区复制到另一个扇区的本机命令。(或者至少在SATA或SAS规范中没有任何要求,因此操作系统无法依靠此命令可用。)因此,跨分区的文件复制将涉及将数据从一个驱动器扇区读入主机内存,然后写入它返回到不同部门的驱动器。
这是因为就操作系统而言,驱动器是一组编号的逻辑扇区,并且它所能做的就是从扇区中读取并写入扇区。操作系统无法告知驱动器重新映射扇区。
此外,文件系统(HFS +,NTFS,ext3等)是一组数据结构,这些数据结构对一组逻辑块施加了顺序。这些数据结构实现“文件”,“文件名”,“目录”,“权限”等。因此,是的,当您将文件从一个目录移动到另一个目录时,不会复制该文件。仅指示文件所在目录的文件系统数据会更新。
分区的概念是,它是单个文件系统要求的驱动器上的一组逻辑扇区。结果是,文件系统可能无法访问其分区之外的扇区。这在很大程度上是一项安全功能,但是它也来自以下事实:文件系统的数据结构都是围绕文件系统所有权下驱动器的每个扇区进行核算而建立的,添加或删除扇区并非易事那些结构。这就是为什么您必须运行特殊的例程来调整分区的大小的原因,也是文件系统坚持在一组连续的扇区上运行的原因。
因此,仅将扇区从一个文件系统传输到另一个文件系统来实现文件副本是不切实际且危险的。在旋转的磁驱动器上,这也将是性能的噩梦,因为尽管该驱动器会出现坏扇区的情况,但总的来说,它会安排扇区在物理上的位置,以优化连续编号的读写速度部门。
此外,两个文件系统可能无法以相同的方式在磁盘上存储文件数据,这意味着即使可行,交换扇区也无法正常工作。即使它们是完全相同的文件系统类型(例如NTFS),一种可能正在使用加密或压缩,而另一种则没有,或者两种都可以使用不同的密钥来加密数据。不需要文件中的数据与磁盘上存储的数据完全相同,只需存储数据的可逆转换即可,这样文件系统就可以通过执行以下操作来获取文件数据:磁盘上的数据。因此,除非两个文件系统都使用完全相同的转换,否则简单地交换扇区将无法实现传输文件数据的目标。
由于所有这些原因,对于OS编写器和文件系统编写器而言,要实现针对SSD的跨分区移动进行优化的功能,实在是太费功夫了。因此,任何跨分区移动都将是读取和写入。
在SSD内部,情况略有不同。尽管操作系统没有告诉驱动器它正在将数据从一个地方复制到另一个地方,但是对SSD的写入非常昂贵(而且非常复杂),以至于SSD控制器为减少写入而进行了大量工作。某些SSD甚至试图检测何时要写入存储的扇区与已存储的扇区匹配,并将该物理内存标记为现在映射到2个不同的逻辑扇区,而不是对其进行复制,从而在内部驱动器级别执行操作系统无法。
但是不要指望它。
mv
就必须配合使用,从而极大地混合了抽象层。