<ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>


      筆者在前文《Linux EXT2 文件系統(tǒng)中 <https://www.cnblogs.com/sparkdev/p/11212734.html>》中介紹了
      EXT2 文件系統(tǒng)中的基本概念,本文繼續(xù)以 EXT2 文件系統(tǒng)為例介紹文件系統(tǒng)是如何管理文件存儲的。

      inode

      在前文介紹文件系統(tǒng)時我們提到了 inode 和 data block。在 EXT2 文件系統(tǒng)中,inode 用來存放文件的元信息,data block
      用來存放文件的內(nèi)容。inode 包含的文件元信息有:

      * 該文件的讀寫權(quán)限(rwx)
      * 該文件的擁有者和所屬組(owner/group)
      * 該文件的大小
      * 該文件的 ctime(創(chuàng)建時間)
      * 該文件的 atime(最近一次的讀取時間)
      * 該文件的 mtime(最近修改的時間)
      * 該文件的特殊標(biāo)識,比如 SetUID 等
      * 該文件真正內(nèi)容的指向(文件 data block 的位置)
      總之,除了文件名之外的所有文件信息都存在 inode 中。我們可以使用 stat 命令來查看文件的 inode 信息:
      $ stat test.txt


      inode 的大小
      inode 本身是會消耗磁盤空間的,我們可以通過下面的方式查看 inode 的大?。?br>$ sudo dumpe2fs -h /dev/sdd1 | grep "Inode size"
      在筆者的機器上,輸出的結(jié)果如下:
      dumpe2fs 1.42.13 (17-May-2015) Inode size: 256
      也就是說一個 inode 占用 256 個字節(jié)的磁盤空間。

      inode 耗盡問題
      因為每個文件需要占用一個 inode,所以生產(chǎn)中會碰到 inode 耗盡導(dǎo)致無法創(chuàng)建新文件的問題。我們可以通過 df 命令 的 -i 選項查看文件系統(tǒng)中
      inode 的使用情況:
      $ df -i


      文件

      每個文件都會占用一個 inode,inode 內(nèi)則有文件數(shù)據(jù)放置的 block 號碼。當(dāng)我們在 Linux 下的 ext2
      文件系統(tǒng)中創(chuàng)建一個一般文件時,ext2 文件系統(tǒng)會分配一個 inode 與相對于該文件大小的 data block(一個或多個) 給該文件。inode
      記錄該文件的權(quán)限與屬性,并記錄分配到的 data block 號碼。例如:假設(shè)一個 data block 的大小為 4 KBytes,而要創(chuàng)建一個 100
      Kbytes 的文件,linux 就會分配一個 inode 與 25 個data block 來儲存該文件!
      單個文件,inode 和 data block 的示意圖(可以簡單的理解為下圖的樣子):



      這種數(shù)據(jù)存取的方法我們稱為索引式文件系統(tǒng)(indexed allocation)。

      雖然從實現(xiàn)的層面上來看,可以直接從 inode 找到其對應(yīng)的 data block,但是我們卻不能通過 inode
      直接訪問文件,因為這會破壞通過權(quán)限進(jìn)行的訪問控制。例如,如果沒有遍歷目錄的權(quán)限,那么無論文件上的權(quán)限是什么,都不能訪問該目錄中的任何文件。如果可以通過inode訪問文件,就可以繞過目錄權(quán)限。

      目錄

      注意,inode 本身并不記錄文件名,文件名的記錄是在目錄的 data block 當(dāng)中。
      目錄本質(zhì)上也是一個文件,所以當(dāng)我們在 ext2 文件系統(tǒng)中創(chuàng)建一個目錄時,文件系統(tǒng)會分配一個 inode 和至少一塊 data block
      給這個目錄。其中,inode 記錄該目錄相關(guān)的權(quán)限與屬性,并記錄分配到的 data block 號碼。而 data block
      中則記錄著在這個目錄下的文件名(目錄也是文件)與該文件名的 inode 號碼。也就是說目錄所占用的 data block 的內(nèi)容記錄著類似下面的信息:



      目錄項
      文件名及其對應(yīng)的 inode 被稱為目錄項。其實,目錄項是內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),所以實際情況是文件名對應(yīng)的是指向 inode
      的指針。我們可以通過下面的示意圖來理解 inode、目錄、文件以及目錄項之間的關(guān)系:



      從磁盤讀取一個文件的過程

      由于目錄樹是由根目錄開始讀起,因此通過文件系統(tǒng)的掛載信息可以找到掛載點的 inode 號,此時就能夠得到根目錄的 inode 內(nèi)容,并通過這個 inode
      讀取根目錄的 data block 中的文件名稱,再一層一層的往下查找,直到讀到正確的文件名。下面讓我們通過讀取 /etc/passwd
      文件來理解文件的讀取過程。



      上面的 ls 命令使用 i 選項輸出了 /、 /etc、 /etc/passwd 的 inode 分別為 2、4325377、4329700。
      我們通過當(dāng)前用戶 nick 讀取 /etc/passwd 文件的內(nèi)容,其過程如下:

      * / 的 inode 號為 2,權(quán)限信息允許我們讀取 data block 中的內(nèi)容(有 r 與 x)
      * / 的 data block 中記錄的 etc/ 目錄的 inode 號為 4325377
      * etc/ 的 inode 中權(quán)限信息包含 rx,因此用戶 nick 可以讀取 etc/ data block 的內(nèi)容
      * etc/ 的 data block 中記錄的 passwd 文件的 inode 號為 4329700
      * 文件 passwd 的 inode 中權(quán)限信息包含 r,因此用戶 nick 可以讀取 passwd data block 的內(nèi)容
      * passwd 的 data block 中的內(nèi)容被讀取出來
      參考:
      鳥哥的私房菜
      理解inode <http://www.ruanyifeng.com/blog/2011/12/inode.html>
      Linux inode 詳解 <https://blog.51cto.com/tengq/1878165>
      關(guān)于 inode
      <https://www.ibm.com/developerworks/cn/aix/library/au-speakingunix14/index.html>
      目錄項對象 <http://guojing.me/linux-kernel-architecture/posts/dentry-object/>

      友情鏈接
      ioDraw流程圖
      API參考文檔
      OK工具箱
      云服務(wù)器優(yōu)惠
      阿里云優(yōu)惠券
      騰訊云優(yōu)惠券
      京東云優(yōu)惠券
      站點信息
      問題反饋
      郵箱:[email protected]
      QQ群:637538335
      關(guān)注微信

        <ul id="qxxfc"><fieldset id="qxxfc"><tr id="qxxfc"></tr></fieldset></ul>
          水蜜桃AV无码专区亚洲AV麻豆 | 日韩免费在线 | 国产精品成人自产拍在线观看 | 男女69式互吃动态图在线观看 | 揉我胸啊嗯~出水l | 中国明星裸体无遮挡 | 欲妇放荡叫床很浪欠c | 久久久少妇高潮久久久久 | 好叼操 | 娇妻虐乳扩张穿环 |