为什么不能在运行时调整已安装(非逻辑)分区的大小/移动它们?

为什么不能在运行时调整已安装(非逻辑)分区的大小/移动它们?

在搜索为什么无法调整已安装分区的大小时,我发现的答案大多是这样的:

  • 它依赖于文件系统和分区,不同的文件系统和分区将使用不同的方法。-作者:哈维尔·里维拉

  • 首先你必须扩展底层块设备。如果您在单个硬盘上使用常规分区,这是不可能的。 LVM 和 mdadm 可以扩展块设备,然后您可以运行 resize2fs 来扩展 fs(假设它是 ext[234] )。 -来自 psui

  • 这实际上取决于您使用的文件系统 [...] 但强烈建议不要调整已安装的可用分区的大小。 -作者 Luis Alvarado

没有解释为什么这是不可能的(因为没有人问),只提到,这取决于文件系统,或者如果分区不是逻辑卷,则根本是不可能的。


我完全不了解操作系统的挂载过程和分区/文件系统处理的内部工作原理,但我问自己为什么分区程序不能提示用户关闭所有进程在那之后将剩余进程及其所需数据的副本保存在 RAM 中并卸载分区以调整其大小。

答案1

文件系统实现了一些内核 API。因此,它们需要提供按名称打开文件、写入文件、读取文件以及再次关闭文件的函数(只需坚持这些基本操作)。

内核提供了读取扇区和写入扇区的函数。

中间的魔法是由文件系统“驱动程序”完成的。因此,如果程序想要打开文件,内核会将该请求传递给文件系统驱动程序。然后,驱动程序读取文件系统元数据并找到该文件的条目。该条目包含文件系统信息,如用户和组所有权、权限、访问时间等,当然还有有关文件在磁盘上所处扇区的信息(这里我们先忽略碎片)。

因此,如果您将整个分区移到磁盘上的另一个位置,所有存储的扇区号现在都有一个偏移量,但文件系统不知道这个偏移量。因此,如果程序随后尝试打开文件,文件系统将使用存储在文件系统元数据中的扇区号来读取文件内容。但是,由于整个文件系统移动了几个扇区,读取的数据将与文件内容不符,文件已损坏。文件系统中的其他所有内容也是如此。

内核对此一无所知。驱动程序要求读取一个扇区。内核不知道扇区号是否应该有偏移量。因此,这是必须在所有文件系统驱动程序中实现的功能。

现在想象一个使用 16 位来寻址扇区的(传统)文件系统。假设一个扇区为 512 字节。因此,文件系统的最大大小可以是 32 MiB。如果要进一步扩展文件系统,则必须将可寻址扇区的大小从 512 字节更改为 1024 字节。但即使现在,文件系统也已满,因为所有扇区号都已使用。因此,文件系统扩展程序需要扫描所有文件,并将两个大小为 1024 字节但仅使用 512 字节的扇区复制到一个扇区中,以便一个扇区(再次)已满,另一个扇区可以释放。

现在想象一下,这必须在文件系统已安装且程序正在顺利地从磁盘读取和写入时完成。这给文件系统驱动程序增加了相当多的复杂性,而这仅在这种特殊用例中才需要。因此,在文件系统未安装时仅调整文件系统的大小会更容易。

此外,还有更多的魔法。例如,您可以创建一个文件,打开它并删除它。该文件在文件系统中不再有表示(它没有文件名),但由于打开的描述符仍然存在,因此仍然可以读取和写入该文件。如果持有描述符的程序为forks,那么即使是子程序也可以访问该文件,因为它们继承了描述符。一旦该文件的所有打开的描述符都被close删除,文件系统就会将这些扇区标记为未使用,准备用于新文件。

所以如果你unmount再次访问文件系统mount,这些文件就会消失。程序会卡住。

答案2

事实上,它可以在挂载时调整许多现代文件系统的大小(尽管通常仅在增加其大小时才这样做)。例如:

  • 来自man resize2fs:“resize2fs 程序……可用于放大或缩小未挂载的文件系统……如果文件系统已挂载,则可以使用它来扩展已挂载文件系统的大小……”
  • 来自man xfs_growfs:“必须安装文件系统才能增大。”
  • 来自man mount:“jfs 的挂载选项...resize=价值... 调整卷大小至价值块。JFS 仅支持增大卷,而不支持缩小卷。”
  • BTRFS 趣味:“是的,这是一个在线调整大小的过程,无需卸载/缩小/安装。因此没有停机时间!”

据我所知,ReiserFS 在安装后无法调整大小。

无需卸载即可调整卷大小的能力对于任务关键型服务器等而言极其重要 - 例如,Web 托管提供商无法承受在向 RAID 阵列添加新磁盘后将文件系统脱机以调整其大小所需的停机时间。这就是为什么许多现代文件系统都支持此功能的原因。

话虽如此,GParted 无法在不卸载分区的情况下调整分区大小。我不确定,但我怀疑这与分区方面的关系比与文件系统方面的关系更大;或者可能是 GParted 开发人员比较保守,设置了最低标准要求(即针对 ReiserFS)。

当文件系统存储在 LVM 设置中时,处理文件系统的大小调整绝对更容易。这种配置意味着您永远不必移动文件系统的起点,因此您可以将逻辑卷及其包含的文件系统扩大数十倍,如果需要,甚至可以扩展到曾经存在但已被删除的文件系统占用的空间。LVM 的设计还考虑了对逻辑卷的动态更改,而内核对分区的处理则更加静态。如果您经常调整文件系统,那么您一定要研究一下 LVM。LVM 的学习曲线有点陡,但对于任何进行高级或频繁文件系统操作的人来说,这都是值得的。

相关内容