我最近一直在研究虚拟机和移植操作系统,并注意到一些我已经知道的事情:操作系统写入的数据似乎是随机分配的,并分布在整个卷中。下面是我所指的一个例子:
相比之下,这个相同卷的分区映像如下所示(仅保留了数据):
所以我想知道:
- 数据分离这么大有什么好处呢?
- 计算机/操作系统如何决定一组文件将会存放到哪里?
- 将数据紧密地塞入每个“扇区”是件坏事吗?
我首先想到的是,#1 是为更改留出空间,以便相关数据紧密相连(我想这对 HDD 来说比 NAND 更重要)。#2 除了 MBR 和类似标准之外,我不知道其他的。#3 我不确定……到目前为止没有问题(虚拟驱动器似乎默认这样做)。很想听到更多关于这个话题的内容,并知道为什么它像物理驱动器上的图像 1。
答案1
相比之下,这个相同卷的分区映像如下所示(仅保留了数据):
即使对于分区映像而言,这看起来也很不寻常。它确实看起来像是过度热心的“碎片整理”工具的结果,但与映像或 VM 无关。
(我希望即使只保留数据的成像工具也会创建一个“稀疏”图像,其中数据仍然保留在原来的位置 - 磁盘映像格式已经支持有效地在任何位置存储间隙/孔洞,在成像之前打包所有这样的文件似乎没有任何优势。)
数据分离这么大有什么好处呢?
减少碎片。如果文件需要增大,并且所有扩展都紧密地挤在一起,则额外的数据必须移到其他地方 - 您很快就会得到高度碎片化的文件(由许多小扩展组成),这对于非零寻道时间的机械磁盘的性能非常不利。
计算机/操作系统如何决定一组文件的存放位置?
分区表(例如 MBR 或 GPT,或者有时更复杂,例如 LVM)用于将磁盘划分为固定大小的区域(分区),并且除此之外实际上没有任何作用。
这文件系统(如 NTFS 或 ext4)控制数据在给定分区中的存储方式。文件系统的工作是跟踪元数据(文件树)和数据分配。
每个文件系统都有自己的数据结构格式(例如,以区段、簇链和间接块的形式存储文件数据),以及选择新块分配位置的逻辑。例如,Linux ext4 文件系统使用所谓的Orlov分配器算法。
大多数文件系统都会就地更新现有文件,而有些总是即使覆盖现有区域,也会分配新块(写时复制分配)。大多数文件系统直接以群集粒度工作(即磁盘扇区的 2 的幂,例如 4 kB 或 16 kB),但 Btrfs 文件系统以 1 GB“块”分配磁盘空间,并且文件数据仅放置在已分配的块内。
该机制甚至可能在实现之间有所不同,例如,尽管 NTFS 文件系统在 Windows 和 Linux 中显然使用相同的数据结构(例如 MFT 和可用空间位图),因为这就是定义“NTFS”的内容,但分配新扇区的逻辑在 Windows ntfs.sys 驱动程序和 Linux ntfs-3g 驱动程序之间会有所不同。
将数据紧密地塞入每个“扇区”是件坏事吗?
对于静态文件来说,不是,但可能也不会给你带来很大的优势。
(但是,并非所有文件系统都支持将多个文件的数据打包在同一个“扇区”中。您看到的数据很可能不是 100% 打包的 - 每个文件之后都可能存在小的子簇间隙,而这些子簇的簇数不是整数 - 这就是图形条不总是到达顶部的原因。)