より大きなブロックデバイス用の書き込みキャッシュループデバイスの作成

より大きなブロックデバイス用の書き込みキャッシュループデバイスの作成

簡単に言えば、長い話です。 *HPコントローラを含む5.5TB RAID5アレイがあります。 * HPは非常に痛みを伴うRAID5アルゴリズムを使用しています(参照:遅延パリティ)*要求を作成した新しいブロックデバイス、HPアレイの古いディスクに変換する新しいブロックドライバを作成しました。 - 変換は一方向です(読み取り専用)。

したがって、よくマウントされているように見える5.5TBの「配列」があり、EXT4ファイルシステムモジュールはログが100%ではなく、エラーのために複数のディレクトリを読み取ることができないと文句を言いますが、残りのデータは信頼できるほど破損していないようです。私の塊ドライバーが正しいことをしています。

しかし、私は非常に慎重です。読み取り専用モードをオンにしてファイルシステムでfsckを実行しましたが、私が考慮していない問題のためにシステムが完全に中断されたことを発見したくありません。

私が望むのは、ブロックデバイスをブロックレベルのループデバイスにマッピングしてfsckを実行できるようにし(書き込みはループデバイスにキャッシュされます)、読み取りがマージされます(そのセクタに対して書き込みが書き込まれていない場合)。 - ブロックデバイスまたはループデバイス(存在する場合)を読みます。

問題は、このように構成しても、書き込みキャッシュとして機能する5.5TBファイルを作成するのに十分なディスク容量がなく、書き込み容量がわずか数GBであるため、時間の無駄のように見えることです。 -maxはfsckが操作を完了するときに使用されます。

質問:ブロックデバイスを本質的にサイズが0で、書き込み操作に応じて大きくなるファイルにループ/ユニオンする方法はありますか?

よろしくお願いします。

答え1

Copy-On-Write モードで dm-snapshot または NBD を使用できます。

dm-snapshotソリューションはここにあります(繰り返していないので申し訳ありません)。

https://raid.wiki.kernel.org/index.php/Recovering_a_failed_software_RAID#Making_the_harddisks_read-only_using_an_overlay_file

NBDの場合は、次のようにインストールしてnbd-server使用nbd-clientできます。

mount /mnt/storage # something with some free space
losetup --read-only /dev/sda1 /dev/loop0 # to ensure it's readonly
ln -s /dev/loop0 /mnt/storage/loop0
nbd-server 127.0.0.1@4242 /mnt/storage/loop0 -c

nbd-serverは、自分が提供するファイルと同じ場所に一時書き込みキャッシュファイルを保存する必要があるため、シンボリックリンクが必要です。したがって、リンクがないと/dev/まったく役に立たなくなります。

最後にクライアントに接続します。

nbd-client 127.0.0.1 4242 /dev/nbd0

このNBDソリューションの唯一の問題は、一時ストレージが利用可能かどうかにかかわらず(デバイスのサイズに応じて)多くのRAMを使用することです。それ自体でも時々メモリを多く消費するためfsck、多くインストールしないとメモリが不足することがあります。

関連情報