
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_DATA
和SEEK_HOLE
lseek(2)
允許使用者空間程式查找漏洞的標誌,這些標誌可能是新增到 POSIX在某一點。
rsync
這解釋了'--sparse
和--inplace
options: 寫入現有文件時的不相容性便攜式的,無法在現有資料中建立漏洞。--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
- 相容的檔案系統允許檔案共享其內容;這可以透過使用來實現和ioctlFICLONE
FICLONERANGE
。