Linuxシステムがあり、rawデバイスに書きたいとしましょう。さて、このデバイスの特定のファイルを新しいバージョンに置き換えたいと思います。これは達成できますか? ddを使用すると、古いバージョンのオフセットから始めて新しいファイルを作成できると思います。新しいファイルのサイズが古いファイルと同じか小さい場合、すべてが問題ありません。しかし、新しいファイルが大きくてもディスク自体がいっぱいにならない場合はどうなりますか?他のファイルを上書きしてファイルシステムを破損しますか?それでは、このようなことが発生するのを防ぐことができますか? btrfsなどの圧縮ファイルシステムのファイルも置き換えることができますか?
答え1
ファイルシステムをマウントする必要があります。 「旧バージョンとのオフセット」のようなものはありません。断片化。データを変更するには、すべてのフラグメントのオフセットとサイズを見つける必要があります。新しいバージョンのサイズが異なる場合、状況はさらに悪化します。追加データ用の空き領域がどこにあるかを把握し、新しいブロックの場所を表示するためにディレクトリデータ構造を更新する必要があります。
これを行うには、ファイルシステムデバッガでいくつかのコードを見つけることができますが、安定して使用するのは難しく、通常多くの書き込みをサポートしていません。ファイルシステムのデータを変更するための使いやすく信頼できる唯一のコードは、ファイルシステムをマウントしてアクセスするファイルシステムドライバです。
一部のファイルシステム(zfsやbtrfsのオプション機能など)には、ファイル整合性データもあります。ファイルまたはブロックのチェックサムを維持し、データ破損を検出します。これらのファイルシステムでは、対応する整合性データを変更せずにファイルのデータブロックの内容を変更すると、ファイルが破損するため読み取ることができません。
場合によっては、ファイルサイズを変更せずにドライバをバイパスしてファイルのデータを上書きすることがあります。たとえば、一部のファイルシステムは読み取り専用に設計されています(つまり、ファイルシステムを準備し、それをいくつかのファイルシステムに書き込みます)。フラッシュして更新しないでください)。データが圧縮されている場合、これは次の場合にのみ可能です。圧縮もちろん、サイズは同じままです。しかし、一般的に言えば、インストールは唯一の方法です。