linux空洞目录,学习笔记:linux之文件空洞
文件空洞linux
咱們知道lseek()系統調用能夠改變文件的偏移量,但若是程序調用使得文件偏移量跨越了文件結尾,而后再執行I/O操做,將會發生什么狀況? read()調用將會返回0,表示文件結尾。使人驚訝的是,write()函數能夠在文件結尾后的任意位置寫入數據。在這種狀況下,對該文件的下一次寫將延長該文件,并在文件中構成一個空洞,這一點是容許的。從原來的文件結尾到新寫入數據間的這段空間被成為文件空洞。調用write后文件結尾的位置已經發生變化。網絡
在Linux系統之中,文件結束符EOF根本不是一個字符,而是當系統讀取到文件結尾,所返回的一個信號值(也就是-1),至于系統怎么知道文件的結尾,資料上說是經過比較文件的長度。dom
文件空洞占用任何磁盤空間,直到后續某個時點,在文件空洞中寫入了數據,文件系統才會為之分配磁盤塊。空洞的存在乎味著一個文件名義上的大小可能要比其占用的磁盤存儲總量要大(有時大出許多)。向文件空洞中寫入字節,內核須要為其分配存儲單元,即便文件大小不變,系統的可用磁盤空間也將減小。這種狀況并不常見,但也須要了解。函數
下面看一個例子:(轉自http://blog.csdn.net/wangxiaoqin00007/article/details/6617801)測試
ls -l file ? ? ? ?查看文件邏輯大小spa
du -c file???? 查看文件實際占用的存儲塊多少.net
od -c file ? ? 查看文件存儲的內容blog
空洞文件就是有空洞的文件,在平常的常識中,咱們使用的文件存放在硬盤分區上的時候,有多大的內容就會占用多大的空間,好比這個文本文件里面寫有1000個asc字符,那么就會占用磁盤上1000B的存儲空間,為了便于管理文件,文件系統都是按塊大小來分配給文件的,假如這個文件系統一個塊是4096的話,那么這個文件就會占用一個塊的,不管實際的內容是1B仍是4000B.若是咱們有一個4MB的文件,那么它會在分區中占用:4MB/4096B=1000個塊.索引
如今咱們先作一個實際的無空洞文件來看看:虛擬機
#dd if=/dev/urandom of=testfile1 bs=4096 count=1000
這個命令會從/dev/urandom文件復制1000個塊,每塊大小4096,到testfile1文件去.
好了,咱們已經有了testfile1這么一個4M的文件了,里面填充了一些隨機的內容,你能夠more一下.
而后用ls -l查看這個文件的大小是4096000,用du -h testfile1來查看的話,文件占用的磁盤大小是4M,二者是同樣的.
下來是咱們的重點,空洞文件,假如咱們有一個文件,它有4M的大小,可是它里邊很大一部分都是沒有存放數據的,這樣可不能夠呢?試一下:
#dd if=/dev/urandom of=testfile2 bs=4096 seek=999 count=1
這個命令跟前一個命令類似,不一樣的是,它其實復制了1個塊的內容,前面的999個塊都跳過了.
咱們ls -l一下,發現文件的大小仍是4096000,用du -h testfile2查看,占用的塊大小是4K
咱們發現,雖然文件是4M,可是實際在磁盤上只占用了4K的大小,這就是空洞文件的神奇之處.
實際中的空洞文件會在哪里用到呢?常見的場景有兩個:
一是在下載電影的時候,發現剛開始下載,文件的大小就已經到幾百M了.
二是在建立虛擬機的磁盤鏡像的時候,你建立了一個100G的磁盤鏡像,可是其實裝起來系統以后,開始也不過只占用了3,4G的磁盤空間,若是一開始把100G都分配出去的話,無疑是很大的浪費.
而后講一下底層的實現吧,其實這個功能關鍵得文件系統支持,貌似FAT就不能夠吧,linux下一直都很好的支持這一特性,咱們舉個最簡單的ext的例子吧,ext中記錄文件實際內容的對應信息的東東是一個叫索引表的東西,里面有十幾個條目,每一個條目存放對應文件內容塊的塊號,這樣就能夠順序找到對應的文件內容了,你們可能說,幾M的一個文件,十幾個項哪夠啊,沒必要擔憂,通常索引表前面幾個項目是直接指向文件內容的,若是這幾個不夠的話,日后的第一個項目不會指向文件內容塊,而會指向一個存放項目的塊,這樣一下多出N個項目來,若是這樣還不夠,下面的那個是存放指向指向的項目,很差意思,我也繞暈了,總之,前面的是直接指向,下面這個是二級指向,再下面的是二級指向,以此類推,這樣,文件系統就能夠處理T數量級別的文件,看下圖:
到了空洞文件這里呢,咱們只須要把指向沒有文件內容部分的索引項目置NULL就行了,這樣就不會指向實際的數據塊了,也不會占用磁盤空間了,就這么easy~
至于btrfs這些新一代文件系統呢,在空洞文件這里的原理跟ext仍是相似的.
最后介紹一下linux對空洞文件的處理,通過我最近的一些測試所得:
在同一文件系統ext4下,cat一個空洞文件到新文件,新文件再也不是空洞文件,cp一個空洞文件到新文件,新文件仍然是空洞文件.
在btrfs跟ext4之間作的結果同上面是一致的,可是在不一樣文件系統之間cp,由于不一樣文件系統分配的最小單元不一樣,因此du結果會不一樣.
在nfs的客戶端下,在nfs目錄下去cp,新文件仍然是空洞文件!!!可是cp會逐個的去比較文件的內容,因此,受網絡情況搞得影響,過程有時候會很慢.
總結
以上是生活随笔為你收集整理的linux空洞目录,学习笔记:linux之文件空洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 双网卡浮动ip,Linux
- 下一篇: linux 卸载 openssl,请教L