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