Linuxでスパースファイルを操作する機能は何ですか? (Cを仮定すると、他のシステムへのコメントは非常に歓迎されています) たとえば、次のようになります。
- ファイル内の一部を削除してファイル内に穴を開けます。
- 別々の連続データチャンクの開始と終了を示すペアシーケンス生成などの構造研究
- ある時点でブロック範囲を再割り当てして(つまり、実際のデータを移動せずに)ファイルを2つの部分に分割します。
- inodeやその他の関連側面を調べますか? (記録中にコピー方式でいくつかのブロックを複数のファイルに割り当てることができますか?)
コンテキスト:
私の心に浮かぶ初期の質問はman rsync
オプションの後ろにあります--sparse
。
rsync
オプション--sparse
が競合する理由は何ですか--inplace
?
APIを呼び出すファイルシステムの制限ですか?
データ構造の観点から、ソーススパースファイルが連続していないデータブロックのシーケンスとして処理される場合、「r」同期はソースに存在しない範囲をターゲットから割り当て解除し、欠落範囲を割り当てることが期待されます。 、残りはそれに応じて更新されます(標準のrsyncローリングハッシュアルゴリズムを使用しても、残りのすべてのシーケンスを1つのシーケンスとして処理するか、各シーケンスで個別に実行)。
引用:
man rsync
-S, --sparse Try to handle sparse files efficiently so they take up less space on the destination. Conflicts with --inplace because it's
希薄な方法でデータを扱うことは不可能です。
答え1
スパースファイルはユーザー空間に透明に設計されています。過去に使用されていなかった領域を見つけ、穴が作成され、ゼロブロックとして読み込まれます。少なくともまだ標準のユーザースペースAPIを使用して検出することはできません。指摘渡すスティーブン・チャジェラス、少なくともSolarisとLinuxのSEEK_DATA
サポートSEEK_HOLE
lseek(2)
ユーザー空間プログラムが脆弱性を発見できるようにするフラグです。POSIXに追加ある時点で。
rsync
これは、'--sparse
とオプションを使用して--inplace
既存のファイルに書き込むときの非互換性を説明します。持ち運べる、既存のデータに脆弱性を生成できません。--sparse
ファイル全体を書き換え、ゼロのシーケンスを(長い)スキップするように動作します。これにより、オペレーティングシステムとそれをサポートするファイルシステムでまれなファイルが発生する可能性があります。
Linuxでは、次のコマンドを使用してファイルのスパース性に関する詳細を取得できます。fiemap
I/W制御とe2fsprogs
'filefrag(8)
;バラよりLinuxの詳細スパースファイル情報。書き込みの面では、次のものを使用できます。fallocate(2)
(便利です。fallocate(1)
ユーティリティ)は、既存のファイルに穴を開け、穴がブロック全体を覆う場合はまれです。サポートはファイルシステムによって異なります。現在、XFS、btrfs、ext4、および tmpfs だけがこれらの操作をサポートしています。最新のカーネル(4.1以降)と非常に最新バージョンは、util-linux
脆弱性をファイルに挿入し、脆弱性の後ろにコンテンツを移動する機能をサポートしています(fallocate -i
2.30で導入され、util-linux
まもなくリリースされる予定です)。
最後の2つの質問はファイルシステム手術に関するものですが、そのようなタスクを実行するために使用できる一般的なシステムコールまたはioctlがあるかどうかはわかりません。reflink
- 互換性のあるファイルシステムを使用すると、ファイルはコンテンツを共有できます。そしてFICLONE
ioctlFICLONERANGE
。