ext4ファイルシステムを縮小する時間を短縮

ext4ファイルシステムを縮小する時間を短縮

大きな ext4 ボリュームを縮小する必要があり、ダウンタイムをできるだけ少なくしたいと思っています。これまでに行ったテストでは、サイズ変更のために最大 1 週間アンマウントする必要があるようです。resizefs で多数のブロックを移動しなくても済むように、事前にオンラインでファイルシステムをデフラグする方法はありますか?

アップデート: ここまで来るのに時間がかかり、縮小の準備として数テラバイトのデータを移動し、以下の回答の情報を使って実験してきました。最終的に、わずかな変更を加えるだけで同様の状況にある他の人に役立つ可能性がある次のコマンド ラインを思いつきました。また、filefrag コマンドと e4defrag コマンドが適切に機能するには、ルートとして実行する必要があることに注意してください。ファイルの所有権には影響しません。複数のハード リンクを持つファイルでも適切に機能しますが、私はそのようなファイルをたくさん持っています。

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}' | xargs -n 1 -d '\n' e4defrag

他のユーザーが変更/使用しやすくするための簡単な説明:

最初の「find」コマンドは、作業するファイルのリストを作成します。現在は冗長になっているか、もっと良い方法で実行できるかもしれませんが、テスト中に他のフィルターがそこにあったため、コマンドの残りの範囲を変更するのに便利な場所として残しておきました。

次に、各ファイルを 'filefrag -v' に渡して、各ファイルで使用されるすべての物理ブロックのリストを取得します。

grep は、各ファイルで使用されている最後のブロック ('eof' で終わる行) を検索します。このブロックは、3 または 4 で始まる 10 桁の数字です。私の場合、新しいファイルシステムのサイズは 2980024320 ブロック長になるので、削除するディスク領域にあるファイルのみを処理するのに十分な機能を果たします。grep に次の行 ('-A 1') も含めるようにすると、次のセクションの出力にファイル名も含まれます。これを実行する他のユーザーは、ファイルシステムのサイズに応じてコマンドを変更する必要があります。おそらく、もっと良い方法で実行することもできますが、これは今のところ私の場合うまくいっているし、私は怠け者です。

awk は、grep がファイルフラグ出力に残した他のすべてのゴミからファイル名だけを抽出します。

そして最後に e4defrag が呼び出されます。実際のフラグメント数は気にしませんが、物理ブロックを移動するという副作用があり (できればドライブの早い部分に)、追加の労力をかけずに複数のハードリンクを持つファイルに対して機能します。

実際にデータを移動せずに、どのファイルがデフラグされるかだけを知りたい場合は、コマンドの最後の部分を省略します。

find -type f -print0 | xargs -0 filefrag -v | grep '\.\.[34][0-9]\{9\}.*eof' -A 1 | awk '/extents found/ {match($0, /^(.*): [0-9]+ extents found/, res); print res[1]}'

答え1

私の知る限りでは、ext4fsはオンラインデフラグをサポート(「完了」の下にリストされていますが、ステータス フィールドは空です。オリジナルパッチ2006年後半からe2fsprogs 1.42 以降の e4defrag は Linux 2.6.28 以降で実行する場合ディレクトリまたはファイルシステムの状態を照会し、少なくとも個々のファイルを最適化することができます。e2fsprogs今日現在、バージョンは 1.42.8 です。

しかし、これがあなたにとって役立つかどうかはわかりません。あなたがやりたいことはそれほど重要ではないようです。デフラグデータは統合するディスク上のデータ。この 2 つは一緒に実行されることが多いですが、明確に異なる操作です。

データを統合する簡単な方法は、かもしれない十分な空き容量があると仮定すると、各ファイルを同じファイル システム上の別の論理論理にコピーし、mv を使用して inode が指すデータを新しいコピーに置き換えるという作業になります。ext4 アロケータが詳細にどのように動作するかに大きく依存しますが、試してみる価値はあるかもしれませんし、スクリプト化もかなり簡単でしょう。複数の場所からハードリンクされているファイルに注意してください (このようなスキームでは、リンク数が 1 を超えるファイルを単に無視し、resizefs で処理するのが最も簡単かもしれません)。

関連情報