现代文件系统(例如 ext4 和 btrfs)支持调整大小。即使是本质上不支持调整大小的文件系统(例如 FAT),也有第三方工具支持调整大小。但它们始终支持向右扩展,而不是直接向左扩展。
向左扩展是通过复制分区左侧(很多情况下是逐字节复制)然后向右扩展来完成的。How do I extend a partition to the left
我见过的所有答案都是backup, delete partition, make a new partition
。
这难道不像改变分区边界,然后移动/更新 inode 表那么简单吗?
答案1
但他们始终支持向右延伸,而不是直接向左延伸。
假设您指的是使用线性扇区或逻辑块阵列的 HDD/SSD 表示。
最左侧的扇区/块将具有 (绝对) 逻辑块地址 (LBA) 0。
最右侧的扇区/块将是驱动器的末尾,并具有最大的 LBA。
请注意,LBA 通常由 ATA 接口中的无符号 48 位整数表示。
向左扩展是通过复制分区左侧(很多情况下是逐字节复制)然后向右扩展来完成的。
这不是一个准确的描述。
而不是“复制”分区,则通过逐扇区/块逐扇区/块地移动分区来重新定位分区(不“逐字节”)。
这难道不像改变分区边界,然后移动/更新 inode 表那么简单吗?
显然不是,因为从来没有提供过这种操作。
分区只是文件系统的定义容器。
分区的物理定义包括起始 LBA、结束 LBA 以及扇区/块的数量。
分区的其他属性与本讨论无关。
为分区定义的文件系统将使用 LBA相对的到分区的开始。
文件系统不关心也不知道其分区在 HDD/SSD 上的位置。
文件系统只知道从 0(其分区的开始)开始到对应于分区末尾的 LBA 的 LBA。
通过使用相对寻址,文件系统被禁止(因此保证)访问其分区之外的任何扇区/块。
如果“更改分区边界”意味着重新定义分区的起点而不将文件系统移动到分区的新起点,这将产生无法解决的情况。
如果您尝试使用现有的 LBA,那么新分区区域的 LBA 将小于零,无法用无符号整数表示。因此,无法将新创建的区域定位到原始分区的“左侧”。
如果您尝试将文件系统中存储的每个 LBA 重新计算为其新的相对值,那么您就是在尝试解决一个几乎不可能完成的任务,即找到文件系统中的每个 LBA。忽略任何 LBA,您最终都会损坏文件系统。
即使您成功更新了每个 LBA,文件系统也可能看起来已损坏,因为通常有特定的文件系统实体需要位于特定的(相对)LBA。但“改变分区边界”已经改变了那些应该位于固定(相对于分区起始点)LBA 的实体的位置。
底线是,分区的开始和该分区内的文件系统的位置必须保持一致。