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

エッセンス


データを失うことなく、パーティションとファイルシステム(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 

Source: https://habr.com/ru/post/J274451/


All Articles