ext4 ファイルシステムとその基礎となる RAID5 アレイを安全な方法で縮小することは可能ですか?
ext4 ファイルシステムを含む 15 TB / 6 ドライブ RAID アレイを縮小したいと思います。
実稼働システムでそれを実行する前に、テスト環境で試してみることにしました。RAID+ファイルシステムのライフサイクルをシミュレートするスクリプト (assemble、mkfs、resize2fs、shrink など) を作成しましたが、場合によってはファイルシステムが破損します。スクリプトは 2 つの異なるディストリビューションで実行されました (そのうちの 1 つは Centos-8)。
私は失敗の原因を理解しようとしましたが、何かを見落としていない限り、RAID 縮小プロセス (mdadm --grow) 中の mdadm は ext4 ファイルシステムについて何も認識せず、このツールが適切に動作するようにすることはできないようです。
私のシナリオでは、プロセスをシミュレートするスクリプトは次のようになります。
- ランダムな数字を選択するデバイス数(5から10の間)が選択され、テストアレイ内のデバイスの数を決定します
- ランダムな数字を選択するデバイスサイズ(300~350) - 単一デバイスのサイズ (MiB 単位)
- 作成して組み立てる/dev/md0- RAID 5アレイ(私の場合は0.90メタデータでした) - アレイのサイズは配列サイズ=($num_devices-1)*$device_size
- ext4ファイルシステムを作成します/dev/md0そしてそれをマウントする/分
- 参照ファイルをコピーします(私の場合は、/boot のカーネル イメージの 1 つでした)$num_devices倍に/分(ファイルシステムの整合性を検証するためのデータを取得するため) - ファイルシステムには利用可能な空き領域が約80%あります
ファイルシステムはアンマウントされ、fscked (
e2fsck -f
) され、その後縮小され (resize2fs -M
最小サイズまたはreisze2fs /dev/md0 {calculated_size}
)、再度fscked される。スクリプトは、mdadm 再構築プロセスが完了するまで待機します (/proc/mdstat を参照)
- 新しい配列のサイズが計算されます:新しい配列サイズ=($num_devices-2)*$device_size
- ハードディスクの故障は
mdadm --manage /dev/md0 --fail /dev/loop3
次のよう にシミュレートされます。mdadm --manage /dev/md0 --remove /dev/loop3
- 再形成プロセスが完了するまで待機します
再形成プロセスが完了すると、/dev/loop3 は削除済みとしてマークされ、別のループ デバイス (例: /dev/loop2) はスペアとしてマークされます。
- プロセスはスペアを決定し、それをアレイに再追加します(
mdadm --manage /dev/md0 --remove /dev/loop2
その後に続くmdadm --manage /dev/md0 --add /dev/loop2
) - スクリプトは RAID の再構築が完了するまで待機します (/proc/mdstat を監視)
この瞬間に不正行為が発生します:
- ファイルシステムは/mntに再度マウントされます
- 参照ファイルと縮小されたファイルシステム上のコピー間の md5 チェックサムの比較は、1 ~ 2 個のファイルで成功または失敗します。
- ファイルシステムはアンマウントされ、fsckされ(
e2fsck -f
)、最大サイズまで拡大され(resize2fs)、再度fsckされる - 腐敗は依然として存在する
私が何か間違っているのでしょうか、それとも RAID5 の縮小プロセスは本当にサポートされていないのでしょうか? あるいは 0.90 のメタデータが原因でしょうか?