スパースファイルはアプリケーションにどのくらい透明ですか?

スパースファイルはアプリケーションにどのくらい透明ですか?

スパースファイルの概念を理解してください。私もcp注文を知っています--sparse=...

しかし、実際のアプリケーションを検索するときに、一般的なOSファイルI / O APIを使用してファイルを読み書きするアプリケーションの透明性レベルについてのあいまいな説明が見つかりました。 (非常に低いレベルではなく、fopen()、fclose()のみを意味します。など)

ブログを読んだときはきれいではなく、説明では、アプリケーション(テストエディタなど)が明示的にゼロを書き込んでスパースファイルを「破損」させる方法について説明します。スパースファイルがあり、アプリケーションがゼロを書き込むと、ファイルが物理的に保存されないことが重要であると思います。アプリケーションはこれを知ったり、スペースなどの問題を処理する必要はありません。これはファイルシステムの責任です。

質問

まれなファイルがあるとします。完全になります透明適用する?最初のバイトがゼロではなく、他のすべてのバイトが0の1Gスパースファイルがあるとします。 「一般」アプリケーションがファイルを開くと、ファイルを開いて長さが1Gであることを確認し、中間(0.5G)を見つけることができます。なぜなら、リーンなしで真ん中にゼロ以外のバイトを書くことができるからです。 、閉じてください。ファイルシステムが不足しているままです。そうですか?

ファイルが「自動的に」まれになりますか?私の言うことは、アプリケーションがファイルを生成し、ゼロをいくつか書いてから書き込むということです。まれですか?そうでない場合、アプリケーションはファイルをスパースファイルとして生成する方法を教えてください。

ベストアンサー1

ほとんどの場合、スパースファイルはプログラムに透過的であり、プログラムは処理中のファイルがスパースファイルかどうかを気にする必要はありません。

まれなファイルはゼロを書くのではなく、ブロックをスキップし、ファイルに穴を作成して作成されます。プログラムの場合ファイル終了後の場所の検索すると、ファイルサイズが更新されます(より多くのデータを記録して)。または「切り取り」ファイル含まれているデータより長い場合、結果ファイルはスパースファイルになります(デフォルトのファイルシステムがスパースファイルをサポートしている場合)。

希少ファイルは読み取ると透明ですが(穴はゼロで読み取られます)、書き込むときは透明ではありません。ブロックにデータを書き込むと割り当てが強制され、最終的に書き込みになります。特に、デフォルトのファイルシステムがいっぱいになると、ファイルの長さを変更せずにファイルに書き込むことが失敗する可能性があります。これいいえこれは、コード作成ファイルがスパースファイルの特別なケースを持たなければならないことを意味します。これは、期待どおりにすべての書き込みでエラーを処理する必要があることを意味します。

Linuxの実装lseekファイルの脆弱性を分析するための拡張機能が提供されています。

ファイルは自動的にリーンになりません。これがGNUオプションが存在する理由ですcp。このオプションは、ゼロ実行を検出してターゲットに書き込むのではなく、ターゲットに穴を作成するように設定されてい--sparseます。cpファイルが自動的にリーンになったら、これを行う必要はありません。

あなたのシナリオでは、最初に1バイトのデータを持つ1Gファイルには、対応するバイトを含むディスクブロックがあり、その後にブロックに合ったゼロが表示されます。ファイルの残りの部分は大きな穴になります。ファイルの途中にゼロを書き込むと、ブロックが割り当てられ、ゼロで埋められます。その後、ファイルにはブロック、ほぼ0.5Gの穴、別のブロック、および別の穴が含まれます。

おすすめ記事