パーティションを効率的に左に拡張できないのはなぜですか?

パーティションを効率的に左に拡張できないのはなぜですか?

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 があります。ATA
インターフェイスでは、LBA は通常、符号なし 48 ビット整数で表されます。

左への拡張は、パーティションを左にコピーし (多くの場合、バイト単位で)、次に右に拡張することによって行われます。

それは正確な説明ではありません
「コピー」パーティションは、セクター/ブロックごとに移動することによって再配置されます(「バイトごとに」)。

パーティション境界を変更し、inode テーブルを移動/更新するだけという単純なことではないでしょうか?

明らかにそうではありません。なぜなら、その操作は提供されていないからです。

パーティションは、ファイルシステム用に定義されたコンテナにすぎません。
パーティションは、開始 LBA、終了 LBA、およびセクター/ブロックの数によって物理的に定義されます。
パーティションのその他の属性は、この説明には関係ありません。

パーティションに定義されたファイルシステムはLBAを使用します相対的パーティションの先頭までです。
ファイルシステムは、HDD/SSD 上のパーティションの位置を気にしたり認識したりしません。
ファイルシステムは、0 (パーティションの先頭) からパーティションの末尾に対応する LBA までの LBA のみを認識します。
相対アドレス指定を使用すると、ファイルシステムはパーティション外のセクター/ブロックにアクセスできなくなります (したがって、アクセスが保証されます)。

もし「パーティション境界の変更」ファイルシステムをパーティションの新しい開始位置に移動せずにパーティションの開始位置を再定義することを意味するため、解決できないシナリオが発生します。

既存の LBA を使用しようとすると、新しいパーティション領域の LBA は 0 未満になり、符号なし整数では表せません。そのため、元のパーティションの「左側」に新しく作成された領域をアドレス指定する方法はありません。

ファイルシステムに格納されているすべての LBA を新しい相対値に再計算しようとすると、ファイルシステム内のすべての LBA を見つけるというほぼ不可能なタスクを解決しようとすることになります。LBA を見落とすと、最終的にはファイルシステムが破損することが確実です。
すべての LBA の更新に成功したとしても、通常は特定のファイルシステム エンティティが特定の (相対) LBA に配置されるため、ファイルシステムが破損しているように見える可能性があります。しかし、「パーティション境界の変更」固定された(パーティションの開始を基準とした)LBA にあるはずのエンティティの位置が変更されました。

つまり、パーティションの開始と、そのパーティション内のファイルシステムの位置は一貫している必要があります。

関連情報