Linuxでスパースファイルを操作する機能は何ですか?

Linuxでスパースファイルを操作する機能は何ですか?

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では、次のコマンドを使用してファイルのスパース性に関する詳細を取得できます。fiemapI/W制御e2fsprogs'filefrag(8);バラよりLinuxの詳細スパースファイル情報。書き込みの面では、次のものを使用できます。fallocate(2)(便利です。fallocate(1)ユーティリティ)は、既存のファイルに穴を開け、穴がブロック全体を覆う場合はまれです。サポートはファイルシステムによって異なります。現在、XFS、btrfs、ext4、および tmpfs だけがこれらの操作をサポートしています。最新のカーネル(4.1以降)と非常に最新バージョンは、util-linux脆弱性をファイルに挿入し、脆弱性の後ろにコンテンツを移動する機能をサポートしています(fallocate -i2.30で導入され、util-linuxまもなくリリースされる予定です)。

最後の2つの質問はファイルシステム手術に関するものですが、そのようなタスクを実行するために使用できる一般的なシステムコールまたはioctlがあるかどうかはわかりません。reflink- 互換性のあるファイルシステムを使用すると、ファイルはコンテンツを共有できます。そしてFICLONEioctlFICLONERANGE

おすすめ記事