- 5 NTFS 稀疏
- 6 在 Unix 和類似系統上處理稀疏文件
- ? 生成稀疏文件
- ? 識別稀疏文件
- ? 應用實例
- 7 在 Microsoft Windows 上處理稀疏文件
- ? 生成稀疏文件
- ? 識別稀疏文件
稀疏文件
編輯一個稀疏文件,表示一個文件可以緊湊地存儲在文件系統中,因為它包含的數據少于指定的文件大小 - 所以它包含部分內容不確定。 在一個稀疏文件中,已經包含數據的區域與尚未寫入的區域交替出現。 這些未寫入的區域不需要在文件系統中分配空間。
基礎知識
編輯對于包含具有不確定內容的(大)區域的文件,它是一種節省空間的存儲形式。 這種類型的存儲來自基于 inode 的文件系統。 通常,文件系統指定這些不確定區域在讀取訪問期間顯示為零字符序列。 類 Unix 操作系統、NTFS 和 APFS 的現代文件系統支持此選項。
對于一個稀疏文件,只有那些部分存儲在后臺內存中,其中數據實際上已被寫入。 當塊在文件內的不同位置寫入文件時,可能會產生此類文件,從而使這些塊不連續。 這會在文件中創建沒有定義內容的區域。 所以例如 例如,標稱長度為 100 GiB 的文件實際上只包含文件系統中的一個邏輯塊,例如,如果數據僅寫入文件中的一個點。
并非所有文件和操作系統都支持末尾有未定義區域的稀疏文件。
這種存儲形式對于某些形式的二進制數據庫以及將分區映射到文件(例如在虛擬化中)非常有用。
打孔
編輯雖然最初不可能在空間被占用后重新獲得空間,但 Linux 內核 2.6.38 和更高版本可以選擇使用 fallocate 系統調用在文件中打孔。 在支持的文件系統上,整個數據塊在數據載體上的打孔區域中再次釋放。 從內核版本 3.2 開始,相應的數據塊也已使用 TRIM 命令在數據存儲本身上釋放,如果支持的話 - 許多基于閃存的存儲介質都是這種情況,例如 SSD。
使用問題
編輯稀疏文件復制時可能會導致問題:當復制到另一個不支持稀疏文件的文件系統時,目標文件無法以壓縮形式創建。 因此,源文件的未定義區域在目標文件中被寫入為空字符。 這提供了一個明顯更大的目標文件。 目標文件系統必須有足夠的容量。 此外,目標的復制或備份程序和操作系統都必須支持稀疏文件并能夠識別它們。
要保存的文件通常不會由操作系統自動創建為稀疏文件,但是創建/使用文件的應用程序必須為此使用單獨的操作系統例程 - 大多數操作系統不會“自動”創建稀疏文件。
在經典的可直接尋址數據存儲設備(例如硬盤)上,由于其固有的碎片,稀疏文件會導致線性讀取訪問期間的速度損失。 但是,對于基于閃存的存儲介質(例如 SSD),情況并非如此。
NTFS 稀疏
編輯與第 3 版的基于 Unix 的文件系統相比,Windows 文件系統 NTFS 具有特殊的文件屬性,該屬性導致 Windows 文件系統的輸入/輸出子系統不會為文件的連續區域占用數據介質上的任何內存僅包含零值。
正常數據和壓縮數據都可以被 NTFS 視為稀疏文件。 在 Windows Server 2003 和 Windows XP 下,一旦文件被聲明為稀疏文件,NTFS 就不能再將其轉換為普通文件。 對于更高版本的 Windows,這只有在不再有任何漏洞時才有可能。
基于 Unix 的文件系統所提到的問題原則上以與 NTFS 相同的方式存在,盡管文件屬性確保至少根據通用編程指南編寫的程序可以透明地復制稀疏文件 en 而不會丟失稀疏屬性。
在 Unix 和類似系統上處理稀疏文件
編輯生成稀疏文件
可以使用 Unix 命令 dd 創建稀疏文件
此示例命令通過查找指向位置 9999999 的寫指針然后寫入一個字節來創建一個 10 兆字節的稀疏文件。
他以“洞”結尾的稀疏文件的證據只能通過某些 dd 實現間接實現。 為此,必須首先創建一個以寫入數據結尾的文件,如上例所示。 然后可以使用 truncate() 或 ftruncate() 系統調用刪除文件的最后數據部分。 例如,這適用于 Solaris。 對于 Linux,設置 count=0 就足以防止在“洞”之后寫入數據。 在 Linux 上,如果設置了 count=0,則只執行 ftruncate() 而沒有寫操作,這會創建一個稀疏文件,其中沒有非零字節字符。
識別稀疏文件
對于稀疏文件,邏輯和物理文件大小不同。 雖然邏輯文件大小也包括零字節,但物理文件大小表示文件在文件系統中實際需要的空間。
Unix ls 命令的 -s 選項也顯示物理文件大小,但以塊為單位。 使用 -k 邏輯大小也以塊顯示,使用 -h 兩者都以人類可讀的格式顯示:
ls -lhs 稀疏文件 ls -lks 稀疏文件
或者,可以使用 Unix 命令 du 顯示邏輯文件大小,但最初也是以塊為單位。 --block-size 1 選項以字節為單位顯示物理大小,而 --bytes 以字節為單位顯示邏輯大小:
du --block-size 1 稀疏文件 du --bytes 稀疏文件
應用實例
下面生成一個10MB的稀疏文件。 與一個 3MB 的文件進行比較時,僅通過簡單的 du 調用就可以看出它是一個稀疏文件,只需要占用 10 個硬盤塊。
在 Microsoft Windows 上處理稀疏文件
編輯生成稀疏文件
可以使用 Windows 命令 fsutil 將文件標記為稀疏文件:
fsutil sparse setflag ;
結果,在以后的寫入操作中,文件的未寫入區域不會分配給數據介質。 該命令還可用于釋放標記為稀疏文件的文件的現有區域:
fsutil sparse setrange ; <字節長度>
這將取消分配指定的范圍。 請注意,只有長度是 64KiB 的倍數且起始位置是 64KiB 的倍數的完整塊才能被釋放。
要以編程方式執行這些操作,DeviceIoControl 內核函數可以與 FSCTL_SET_SPARSE 和 FSCTL_SET_ZERO_DATA 控制代碼一起使用。 后一種代碼也適用于非稀疏文件的文件,但數據區域未被釋放,而是填充了零字節。
識別稀疏文件
一個文件是否是一個稀疏文件也可以用 fsutil 命令來判斷:
fsutil sparse queryflag ;
要列出實際分配的區域,調用命令如下:
fsutil sparse queryrange ;
使用 MSSQL 創建稀疏文件
從 2005 版開始,MSSQL 創建的稀疏文件可以作為數據庫快照。 以下 SQL 語句創建一個大小為 2 GB 的稀疏文件。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/358184/