Linux下操作稀疏檔的函數有哪些?

Linux下操作稀疏檔的函數有哪些?

Linux下操作稀疏檔的函數有哪些? (假設用 C 語言,非常歡迎其他系統的註釋)例如:

  • 透過刪除檔案內部的一部分來在檔案內部打孔
  • 研究結構,例如產生表示分離的連續資料塊的開始和結束的對序列
  • 透過重新分配區塊範圍(即不移動實際資料),在某個時刻將檔案分成兩部分
  • 調查索引節點和其他相關方面? (也許可以以寫入時複製的方式將一些區塊分配給多個檔案?)

情境:

我想到的最初問題是在man rsync選項--sparse之後:

為什麼rsync選項--sparse與 衝突--inplace

是檔案系統呼叫api的限制嗎?

從資料結構的角度來看,如果來源稀疏檔案被視為非連續資料區塊的序列,那麼我期望「r」同步在目標上取消那些分配來源中不存在的範圍,分配遺失的範圍,其餘相應地更新(即使使用標準rsync 滾動哈希演算法,將所有剩餘序列視為一個序列,或在每個序列上單獨運行)。

參考:

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_DATASEEK_HOLE lseek(2)允許使用者空間程式查找漏洞的標誌,這些標誌可能是新增到 POSIX在某一點。

rsync這解釋了'--sparse--inplaceoptions: 寫入現有文件時的不相容性便攜式的,無法在現有資料中建立漏洞。--sparse其工作原理是重寫整個文件,跳過(長)零序列,這會導致作業系統和支援它們的文件系統上出現稀疏文件。

在 Linux 上,您可以使用以下命令檢索文件稀疏性的詳細信息fiemap讀寫控制, 和e2fsprogs'filefrag(8);看Linux 上詳細的稀疏文件信息。在寫作方面,您可以使用fallocate(2)(以及方便的fallocate(1)實用程式)在現有文件中打孔,如果孔覆蓋整個塊,則使其稀疏。支援取決於檔案系統 - 目前僅 XFS、btrfs、ext4 和 tmpfs 支援這些操作。最近的內核(自 4.1 起)和非常最近的版本util-linux支援在文件中插入漏洞,將內容轉移到漏洞之後(fallocate -i在 2.30 中引入util-linux,應該很快就會發布)。

您的最後兩個問題是檔案系統手術,我不確定是否有任何通用系統呼叫或 ioctl 可用於執行此類操作。reflink- 相容的檔案系統允許檔案共享其內容;這可以透過使用來實現和ioctlFICLONEFICLONERANGE

相關內容