web-dev-qa-db-ja.com

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

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

更新:このポイントに到達するまでに少し時間がかかり、縮小に備えてかなりの数のデータを移動しましたTB、そして私はを使用して実験してきました以下の回答の情報。私はついに次のコマンドラインを思いつきました。これは、わずかな変更を加えるだけで、同様の状況で他の人に役立つ可能性があります。また、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は、grepが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]}'
6
Rob

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

ただし、これが役立つかどうかはわかりません。あなたがやりたいことは、データのデフラグほどではないようです。 ディスク上のデータを統合します。この2つは一緒に行われることがよくありますが、明らかに異なる操作です。

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

2
a CVn