前幾天同窗問我:我用ls -l看目錄大小。怎麼都是4kb? node
如圖 linux
test目錄下面有個空目錄tt,tt的實際大小爲4096。若是我在tt下面建立幾個新的文件,tt的大小結果仍是4096。也就是說,目錄的大小的概念他不是很清楚。 socket
本人以前也未仔細想過這個問題。翻閱《深刻理解linux內核》也未獲得答案。因而尋思半天,給出一個答案,不知是否正確,還請有了解的賜教了。 測試
文件的大小你們都知道,好比一個文件1kb,因爲簇的關係,實際佔用4kb(假設)。若是我要讀取這個文件的所有內容,我是alloc 1kb仍是 4kb的內存呢?想必你們都是清楚的,應該是1kb。 this
目錄在linux下也是至關於一個文件,爲了讀取目錄裏面的目錄項,我就必須讀取它的所有內容。而這個大小就是盤塊大小(或者幾個盤塊大小,視目錄項個數決定)。因爲目錄項並非連續排列的,好比tt目錄裏原先有500個文件,刪了499個文件,剩下的1個目錄項在哪裏?是的,可能在一開始,也可能在最後。爲了獲得裏面的那個目錄項,我只能把盤塊所有讀取出來。在沒有讀取盤塊以前,你是沒有辦法知道里面的目錄項的! spa
因爲目錄的特殊性,目錄的實際大小就是佔用空間的大小(上圖就是4096)。這樣子,可使得讀取目錄和讀取文件同樣,能夠統一塊兒來了。 code
話說的有點囉嗦了,不知道有過一樣疑問的各位是否可以看懂,若是你有本身的想法,也歡迎討論~~~ orm
補充: ip
這是資料截圖。inode 指i_node節點編號,rec_len指離下個目錄項的偏移,後面的看看也知道的吧。因爲name不丁長,因此須要name_lens。因此一個目錄項至少12字節。一個目錄塊4096字節,能夠放多少目錄項呢。答案是2+339 =341 。2指 . 和 .. 兩個目錄項 , 339 爲本身建立的文件的目錄項。經過測試也證實了個人猜想。你若是建立340個文件,那目錄塊就會立馬變大到12kb。(爲何不是8kb,有誰知道?)。 內存
下面的原文如是說:
The directory entries must be aligned on 4 bytes boundaries and there cannot be any directory entry spanning multiple data blocks. If an entry cannot completely fit in one block, it must be pushed to the next data block and the rec_len of the previous entry properly adjusted.(一個放不下,就放到下一個去,前面的目錄項的rec_len字段作相應調整)
事實上,你刪除目錄裏的文件把目錄項刪除後,空餘的盤塊是不會回收的。也就是說,目錄的大小隻增不減。
原文以下:
A directory is a filesystem object and has an inode just like a file. It is a specially formatted file containing records which associate each name with an inode number. Later revisions of the filesystem also encode the type of the object (file, directory, symlink, device, fifo, socket) to avoid the need to check the inode itself for this information.
The inode allocation code should try to assign inodes which are in the same block group as the directory in which they are first created.
The original Ext2 revision used singly-linked list to store the filenames in the directory; newer revisions are able to use hashes and binary trees.
Also note that as directory grows additional blocks are assigned to store the additional file records. When filenames are removed, some implementations do not free these additional blocks.(記住:若是目錄項不少,就會有多個額外的盤塊來保存,但當裏面的文件刪除後,某些實現並不刪除這些多餘的盤塊) 各位能夠在本身的pc上試試。歡迎討論.