Linux下操作稀疏文件的函式有哪些?
Linux下操作稀疏文件的函式有哪些?(比方說在 C 中,非常歡迎關於其他系統的註釋)例如:
- 通過去除文件內部的一部分在文件內部打孔
- 研究結構,例如生成表示分離的連續數據塊的開始和結束的對序列
- 通過重新分配塊的範圍(即不移動實際數據),在某個時候將文件分成兩部分
- 調查 inode 和其他相關方面?(也許可以以寫時複製的方式將一些塊分配給多個文件?)
語境:
我想到的原始問題是我
man rsync
的--sparse
選擇之後:為什麼
rsync
’s--sparse
option 與--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 上,您可以使用
fiemap
ioctl和e2fsprogs
‘檢索文件稀疏度filefrag(8)
的詳細資訊 請參閱Linux 上的詳細稀疏文件資訊。在寫作方面,您可以使用fallocate(2)
(和方便的fallocate(1)
實用程序)在現有文件中打孔,如果孔覆蓋整個塊,則使其稀疏。支持取決於文件系統——目前只有 XFS、btrfs、ext4 和 tmpfs 支持這些操作。最近的核心(從 4.1 開始)和最近的版本util-linux
支持在文件中插入孔,在孔之後移動內容(fallocate -i
,在util-linux
2.30 中引入,應該很快就會發布)。您的最後兩個問題是文件系統手術,我不確定是否有任何通用系統呼叫或 ioctl 可用於執行此類操作。
reflink
- 兼容的文件系統允許文件共享其內容;這可以使用和FICLONE
ioctlsFICLONERANGE
來實現。