データ損失なしのパーティション拡張

エッセンス



データを失うことなく、パーティションとファイルシステム(xfs、ext3,4)を簡単に拡張するプログラムを開発しました。 github.com/rekby/fsextender/releases/latest



元の問題



Linuxファミリで仮想マシンのディスクを展開した後、その中のデータセクションを展開します。



ファイルシステムは、パーティションテーブルなしでディスク全体を占有します



最も単純なケース(パーティションなしのディスク全体に1つのファイルシステム)では、xfs_growfsまたはresize2fsを呼び出すだけで十分です。



LVMボリューム上のファイルシステム



ファイルシステムがLVMの上で実行される場合、拡張機能は少し複雑ですが、それでも安全です。新しいパーティションを追加し、そこに物理LVMボリュームを作成し、それをLVMグループに追加し、論理ボリュームを拡張してからファイルシステムを拡張します。 ここでの副作用は、場所が数回徐々に追加される場合のパーティションと物理ボリュームのヒープになります。 少しずつ。 また、msdos-partitionテーブルを使用する場合、拡張パーティションの使用について覚えておく必要があります。そうしないと、拡張パーティションの数が4個に制限され、シャーマンとパーティションテーブルの書き換えが必要になります。



通常のパーティション内のファイルシステム



手動で実行するための最も危険なオプション:パーティションを手動で削除して再作成し、前のパーティションと同じ場所で開始し、ディスクの最後の空きセクターで終了するようにする必要があります。

これには注意と精度を高める必要があります-数字に誤りがあると、すべてのデータを簡単に失う可能性があります。 さらに、副作用として、GPTパーティションのGUIDが変更されており、システム設定に何らかのバインドが存在する可能性があります。



解決方法



すべての場合において、可能であれば、パーティションテーブルを書き換えることにしました。 自動モードでは、これは手動ほど危険ではありません(msdosテーブルではテーブル全体が1つのセクターに収まり、セクターレコードはアトミックであり、GPTテーブルには最初のテーブルが破損した場合のチェックサムとバックアップコピーがあります)。



実装言語はゴー 出力は、外部依存関係なしで静的バイナリを取得するのが非常に簡単です。これは重要です。 テンプレートが更新されると、centos 5.4 x86から​​最新のubuntu 14.04 x64まで、OSの異なるバージョンで同じバイナリを実行する必要があります。



まとめ



パーティションテーブルを直接操作するための2つのライブラリが作成されました: github.com/rekby/mbr-msdosパーティションテーブルを操作するため(外部インターフェイスはあまり良くありませんが、適切に動作します)、 github.com / rekby / gpt -GPTテーブルを操作するため。



パーティションとファイルシステムの拡張が書かれています。 彼ができること:

1.データ、フラグ、識別子などを失うことなく、msdosテーブルのメイン(プライマリ、非論理)セクションとGPTセクションを適切に展開します。 (カーネルがサポートしている場合、再起動せずに-たとえばubuntu 14.04のように)。

2. LVM-PVの下のパーティションを拡張できる場合は、データを損失することなく、LVM物理ボリューム(LVM-PV)を拡張します。

2. LVM拡張用の新しいパーティションを作成します(誤解を避けるため、パーティションは、準備済みのパーティションテーブルが既に存在するディスク上にのみ作成されます)。

3.ディスクをフィルター処理して新しいパーティションを作成します(デフォルトでは、新しいパーティションはこのLVMグループが既に配置されているディスクにのみ作成され、フィルターを無効にできます)。

4.ファイルシステムext3、ext4、xfsを拡張します。

5.マシンは、パーティションテーブルを上書きした後、再起動が必要かどうかを判断します。



パーティションテーブルは、ディスクのサービスエリアのデータによって直接上書きされます。 これは、partedなどのツールを使用するよりも安全です。 パーティションテーブルの整合性違反時間は短くなり、場合によっては完全になくなります。

LVMでの作業とファイルシステムの拡張は、対応するコマンド(pvcreate、xfs_growfsなど)への外部呼び出しによって行われるため、これらのコマンドはインストールされ、PATHに存在する必要があります。 名前だけで呼び出すことができます。 ほとんどの場合、この条件は自然に満たされます。



その結果、ファイルシステムの拡張子とその下にあるパーティションは次のようになります。

fsextender /home --do
      
      







または:

 fsextender /dev/sda2 --do
      
      







または:

 fsextender /dev/lvm-group/lvm-volume --do
      
      






All Articles