Linux

Linux下操作稀疏文件的函式有哪些?

  • March 20, 2020

Linux下操作稀疏文件的函式有哪些?(比方說在 C 中,非常歡迎關於其他系統的註釋)例如:

  • 通過去除文件內部的一部分在文件內部打孔
  • 研究結構,例如生成表示分離的連續數據塊的開始和結束的對序列
  • 通過重新分配塊的範圍(即不移動實際數據),在某個時候將文件分成兩部分
  • 調查 inode 和其他相關方面?(也許可以以寫時複製的方式將一些塊分配給多個文件?)

語境:

我想到的原始問題是我man rsync--sparse選擇之後:

為什麼rsync’s --sparseoption 與--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

不可能以稀疏的方式覆蓋數據。

稀疏文件被設計為對使用者空間透明:通過尋找過去未使用的區域來創建空洞,並作為零塊讀取。使用標準使用者空間 API 無法檢測到它們,至少目前還沒有——正如Stéphane Chazelas所指出的,至少 Solaris 和 Linux 支持允許使用者空間程序找到漏洞的 and 標誌,並且這些標誌可能會在某些時候添加到 POSIX觀點。SEEK_DATA``SEEK_HOLE lseek(2)

這解釋了rsync--sparse和options 之間的不兼容:當可移植--inplace地寫入現有文件時,無法在現有數據中創建孔。通過重寫整個文件,跳過(長)零序列來工作,這會導致作業系統和支持它們的文件系統上的文件稀疏。--sparse

在 Linux 上,您可以使用fiemapioctle2fsprogs‘檢索文件稀疏度filefrag(8)的詳細資訊 請參閱Linux 上的詳細稀疏文件資訊。在寫作方面,您可以使用fallocate(2)(和方便的fallocate(1)實用程序)在現有文件中打孔,如果孔覆蓋整個塊,則使其稀疏。支持取決於文件​​系統——目前只有 XFS、btrfs、ext4 和 tmpfs 支持這些操作。最近的核心(從 4.1 開始)和最近版本util-linux支持在文件中插入孔,在孔之後移動內容(fallocate -i,在util-linux2.30 中引入,應該很快就會發布)。

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

引用自:https://unix.stackexchange.com/questions/366373