ext4 ファイルシステムの縮小時間の短縮

ext4 ファイルシステムの縮小時間の短縮

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

修正する: この時点に到達するのに時間がかかり、縮小に備えてかなりのテラバイトのデータを移動し、以下の回答の情報を活用しようとしました。私はいくつかの修正を加えると、似たような状況で他の人に役立つかもしれない次のコマンドラインを思いつきました。また、filefrag および e4defrag コマンドが正常に機能するには、root として実行する必要があります。これはファイルの所有権には影響しません。複数のハードリンクを持つファイルでもうまく機能します。ハードリンクがたくさんあります。

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 は、filefrag 出力に残っている他のすべてのゴミ 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年末から)〜Linux 2.6.28 以降で実行する場合 e2fsprogs 1.42 以降 e4defragディレクトリまたはファイルシステムの状態を照会し、少なくとも個々のファイルの最適化を実行できます。e2fsprogs現在のバージョンは1.42.8です。

しかし、やりたいことがあまりないようで、これが役に立つかもしれません。デフラグデータは統合するディスクのデータ。どちらも一緒に行われることがよくありますが、別々の作業です。

データを統合する簡単な方法可能適切な空き領域があると仮定すると、タスクは各ファイルを同じファイルシステムの他のロジックにコピーし、mvを使用してinodeが指すデータを新しいコピーに置き換えることです。これは、ext4アロケータが正確にどのように機能するかによって大きく異なりますが、試してみる価値がある可能性があり、スクリプトを書くのはかなり簡単です。複数の場所でハードリンクされたファイルを注意深く見てください(このようなシナリオで最も簡単な方法は、おそらくリンク数が1より大きいファイルを無視してresizefsにそれを処理させることです)。

おすすめ記事