在一个SSD上的两个驱动器之间移动文件-是否将其复制?


18

在一个驱动器中移动文件时,不会复制和删除文件。引用文件的表刚刚更新。据我所知,HDD上的2个驱动器不是这种情况。但是SSD有所不同,每个驱动器都没有专用的物理空间。(来源

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

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

每个分区将拥有其自身的驱动器物理区域

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

据我所知那是错误的。看这里

因此,是否会有更多了解SSD的人告诉我,即使他们错了,他们的评估是否正确?


14
正确的答案是正确的:每个分区都有自己的独立文件系统。每个文件系统自行决定如何利用分配给它的块。要完成您建议的SSD固件,文件系统和Linux等用户平台工具,mv就必须配合使用,从而极大地混合了抽象层。
卡米尔Maciorowski

2
@Kamil:我怀疑,如果操作系统实现了它,mv实际上将需要做的事情比现在。(也就是说,操作系统只需要确保跨文件系统的rename()成功,而不是像当前那样失败。)
grawity

16
“ [[SSD / HDD]上有2个驱动器””-我想您的意思是说一个SSD / HDD上有2个文件系统或2个分区。请记住,两个首字母缩写词中的最后一个“ D”都是“ Drive”,因此您在1个驱动器中说2个驱动器,这没有任何意义。
JoL

1
以“磁盘管理”对话框为例。它是Change Drive Letter and Paths指分区/卷时的内容。
ispiro '18

4
@ispiro在Windows上是吗?似乎是一种使用户困惑的可怕方法。我只能猜测,他们在实现驱动器分区之前提出了“驱动器号”一词,然后他们最终将驱动器分区表示为独立的“驱动器”。因此,现在您可以拥有多个Windows“驱动器”,它们代表一个硬件驱动器的分区...
JoL

Answers:


38

据我所知那是错误的

引用的描述是半正确,半错误的。但这对于HDD也是错误的。

对驱动器进行分区会为每个分区指定逻辑区域。操作系统根本不在乎物理位置,它只是要求驱动器“读取逻辑块#31415926”,而驱动器本身会决定数据的位置。磁性和闪存的工作方式相同。

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

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

结果,从一个文件移到另一个文件的所有文件都必须完整复制。

(也就是说,从理论上讲,操作系统可以要求磁盘本身将数据从一个区域复制到另一个区域(例如,“将LBA#1234复制到#567890”),而不必先将其复制到主存储器,然后再复制回去,当然,这将完全绕开分区边界。例如,可以利用SSD的“闪存转换层”。但是据我所知,实际上并没有这样做。)


我认为你是对的。但是,请注意,有另一种选择。驱动器可以确定驱动器#1上的扇区#001现在将与驱动器#2中的扇区#123进行切换(即,驱动器#1上的扇区#001现在将引用以前在其中称为扇区#123的物理数据)。驱动器2),从而无需复制字节即可移动文件。因此,移动数据的TB 可以在原则上是近乎瞬时的。
ispiro

15
驱动器不了解文件或文件系统,因此无法自行做出此类决定。它需要从OS接收请求,以实现此目的。就像我在上一段中已经提到的那样,从技术上讲当然是可行的,但是操作系统通常不会为跨文件系统副本而烦恼,而且我怀疑它们是否也会为相同文件系统副本使用(更常见的是在FS级别完成)。
grawity

6
某些SSD确实实现了块级重复数据删除。例如,Sandforce(en.wikipedia.org/wiki/SandForce#Technology)是率先实施此功能的公司之一,其控制器已进入多个SSD制造商的产品。Sandforce控制器的“写放大”因子小于1,这意味着与操作系统发送到驱动器的数据相比,它们向闪存存储写入的数据更少。作为比较,SSD通常具有大于1的写安培系数。
hojusaram

2
@hojusaram:的确如此,但是它仍然是事实后重复数据删除–减少了闪存写入,但是仍然可以读取数据,将数据从磁盘复制到OS内存,然后再返回到磁盘控制器。我认为ispiro的意思是SSD可以等同于“ reflink”或“写入时复制”(例如cp --reflink),操作系统可以明确要求磁盘自行执行。
grawity

1
发现APFS如何处理此问题将很有趣,因为分区边界不再固定,因此无需用户干预即可更改。
Tetsujin

9

数据写到固态磁盘时会发生什么,值得写几篇文章在这里很好总结),因为它非常复杂并且取决于底层技术。简而言之,SSD通常无法将零位写入内存。取而代之的是,他们必须将整个内存区域清零(擦除),然后再通过将其写入数据来存储数据。通常这些天来,他们写入512字节的,但擦除一页的8个块,即4096。这以及每个写入/擦除周期都会导致内存的物理磨损,并且内存最终磨损的事实,使SSD变得非常不同比旋转磁性硬盘要好。

暂且不说,SATA驱动器(和AFAIK SAS驱动器)没有实现将数据从一个扇区复制到另一个扇区的本机命令。(或者至少在SATA或SAS规范中没有任何要求,因此操作系统无法依靠此命令可用。)因此,跨分区的文件复制将涉及将数据从一个驱动器扇区读入主机内存,然后写入它返回到不同部门的驱动器。

这是因为就操作系统而言,驱动器是一组编号的逻辑扇区,并且它所能做的就是从扇区中读取并写入扇区。操作系统无法告知驱动器重新映射扇区。

此外,文件系统(HFS +,NTFS,ext3等)是一组数据结构,这些数据结构对一组逻辑块施加了顺序。这些数据结构实现“文件”,“文件名”,“目录”,“权限”等。因此,是的,当您将文件从一个目录移动到另一个目录时,不会复制该文件。仅指示文件所在目录的文件系统数据会更新。

分区的概念是,它是单个文件系统要求的驱动器上的一组逻辑扇区。结果是,文件系统可能无法访问其分区之外的扇区。这在很大程度上是一项安全功能,但是它也来自以下事实:文件系统的数据结构都是围绕文件系统所有权下驱动器的每个扇区进行核算而建立的,添加或删除扇区并非易事那些结构。这就是为什么您必须运行特殊的例程来调整分区的大小的原因,也是文件系统坚持在一组连续的扇区上运行的原因。

因此,仅将扇区从一个文件系统传输到另一个文件系统来实现文件副本是不切实际且危险的。在旋转的磁驱动器上,这也将是性能的噩梦,因为尽管该驱动器会出现坏扇区的情况,但总的来说,它会安排扇区在物理上的位置,以优化连续编号的读写速度部门。

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

由于所有这些原因,对于OS编写器和文件系统编写器而言,要实现针对SSD的跨分区移动进行优化的功能,实在是太费功夫了。因此,任何跨分区移动都将是读取和写入。

在SSD内部,情况略有不同。尽管操作系统没有告诉驱动器它正在将数据从一个地方复制到另一个地方,但是对SSD的写入非常昂贵(而且非常复杂),以至于SSD控制器为减少写入而进行了大量工作。某些SSD甚至试图检测何时要写入存储的扇区与已存储的扇区匹配,并将该物理内存标记为现在映射到2个不同的逻辑扇区,而不是对其进行复制,从而在内部驱动器级别执行操作系统无法。

但是不要指望它。


1
您的最后一段不是暗示文件系统必须相同吗?我假设SSD不知道哪个文件系统在上面运行。例如,如果一个分区使用压缩而另一分区未使用压缩,则SSD进行的复制可能会损坏文件。
blablabla

@blablabla最后一段假定两个文件系统都将实际文件内容存储在磁盘上,而无需更改。我现在明确指出了。
老职业
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.