歡迎您光臨本站 註冊首頁

柳大的Linux遊記·基礎篇(2)Linux文件系統的inode

←手機掃碼閱讀     火星人 @ 2014-03-03 , reply:0

柳大的Linux遊記·基礎篇(2)Linux文件系統的inode

柳大的Linux遊記·基礎篇(2)Linux文件系統的inode


《柳大的Linux遊記·基礎篇》來自柳大的CSDN博客,轉載請註明原文鏈接:http://blog.csdn.net/poechant/article/details/7214926



    要想理解Linux文件系統,首先要理解的就是inode。什麼是inode?往下看吧。



1、Linux文件系統的最基本數據結構:inode和block

(1)背景

    由於Linux系統是多用戶多的,所以文件系統類型多樣化是在所難免的。從ext2開始,是將文件屬性和文件內容分開存儲的,分別由inode和block來負責。



(2)inode

    用於存儲文件的各屬性,包括:

    - 所有者信息:文件的owner,group;

    - 許可權信息:read、write和excite;

    - 時間信息:建立或改變時間(ctime)、最後讀取時間(atime)、最後修改時間(mtime);

    - 標誌信息:一些flags;

    - 內容信息:type,size,以及相應的block的位置信息。

    注意:不記錄文件名或目錄名,文件名或目錄名記錄在文件所在目錄對應的block里。



(3)block

    用來存儲文件的內容。



(4)創建目錄或文件

    當創建一個目錄時,文件系統會為該目錄分配一個inode和至少一個block。該inode記錄該目錄的屬性,並指向那塊block。該block記錄該目錄下相關聯的文件或目錄的關聯性和名字。

    當創建一個文件時,文件系統會為該文件分配至少一個inode和與該文件大小相對應的數量的block。該inode記錄該文件的屬性,並指向block。

    如果一個目錄中的文件數太多,以至於1個block容納不下這麼多文件時,Linux的文件系統會為該目錄分配更多的block。

    (各block之間形成鏈表?)



(5)讀取目錄或文件

    當我們告知操作系統一個文件的路徑后,操作系統是如何找到這個文件的呢?首先操作系統會調用文件系統的相應介面,接下來:

    遞歸說法:當讀取一個文件或目錄X時,提供給文件系統的是一個路徑P。文件系統會先讀取X所在的目錄D的inode_d(注意這裡,其實是這一操作的遞歸過程),通過inode_d獲得其對應的block_d,在block_d中通過已知的X的名稱,查詢到X的inode_x。

    迭代說法;如果讀取的是/x1/x2/x3/x4/x5這個文件,則先讀取根目錄的inode_root,然後找到inode_root對應的block_root,在block_root中根據x1這個名字找到x1對應的inode_x1,然後找到inode_x1對應的block_x1,在block_x1中根據x2這個名字找到inode_x2,再找到block_x2,然後根據x3找到inode_x3,再block_x3,根據x4找到inode_x4,再block_x4,再根據x5找到inode_x5,再block_x5,就讀取到我們要的x5的內容了。



2、分區

(1)分區結構

    分區(partition)在被Linux的文件系統(比如ext2)格式化的時候,會分成inode table和block table兩部分,且大小都是固定的。該分區的所有inode都在inode table里,所有block都在block table里。



(2)塊大小

    ext2允許的block size為1024bytes、2048bytes和4096bytes。



(3)inode大小

    ext2一般默認給inode預設的大小為128bytes。



(4)預設分區

    一個T bytes的分區,設定每個block為B bytes,每個inode為I bytes。如果假設平均每個文件佔用兩個block的話,那麼inode的數量就應該設定為T/(B+I)個,即inode table為T*I/(B+I) bytes,block table為T*B/(B+I) bytes。所以一個分區的文件系統所能容納的文件數量,被限制於該分區的文件系統的inode area中的inode數。

    如果一個分區大小為1GB,每個block為4KB,一個inode為128B,並假設平均每個文件佔用2個block。那麼inode的數量為1GB/(8KB+128B)=129055.5,即129055。那麼inode table的大小為129055*128B=15.75MB。所以按照這樣的規劃,如果一個1GB的磁碟,那麼格式化后,就已經有15.75MB被使用了。

    大文件應用場景:block設置的小一些,inode設置的多一些。比如新聞組、BBS等。

    小文件應用場景:block設置的大一些,inode設置的少一些。比如圖片分享網站。



3、查看本機的文件系統信息

    使用dumpe2fs命令可以查看分區的文件系統的相關信息。比如我在我的一台測試機上查看sda1,可以輸入:

dumpe2fs /dev/sda1




    會得到如下內容,一些信息已經標註在註釋里了。



(1)文件系統基本信息



#該分區的文件系統的名稱

Filesystem volumn name: MAIN



#上次的掛載點

Last mounted on:



#文件系統的通用唯一標識符

Filesystem UUID:



#文件系統的

Filesystem magic number: 0xEF53



#修訂版本號

Filesystem revision #: 1 (dynamic)



Filesystem features: has_journal needs_recovery

Filesystem flags: signed_directory_hash

Default mount options: (none)



#文件系統狀態

Filesystem state: clean



#發生錯誤后的行為

Errors behavior: Continue



#操作系統

Filesystem OS type: Linux



(2)結構信息



#Inode總數

Inode count: 1313312



#Block總數

Block count: 1313305



#保留block數

Reserved block count: 65665



#空閑block數

Free blocks: 979164



#空閑inode數

Free inodes: 1298415  



#第一個block的編號

First block: 0



#block的大小

Block size: 4096



#fragment的大小

Fragment size: 4096



#每個group的block數是32K個

Blocks per group: 32768



#每個group的fragment數是32K個

Fragments per group: 32768



#每個group的inode數

Inodes per group: 32032



#每個group的inode blocks

Inode blocks per group: 1001



(3)訪問信息



#上次掛載時間

Last mount time: Wed Jan 25 00:32:14 2012



#上次寫時間

Last write time: Wed Jan 24 00:32:14 2012



#掛載數

Mount count: 11



#最大掛在數

Maximum mount count: 20



#上次檢查文件系統時間

Last checked: Sat Oct 31 22:52:33 2009



#檢查文件系統時間間隔

Check intervalle: 15552000 (6 months)



#下一次檢查文件系統的時間

Next check after: Thu Apr 29 22:52:33 2010



#對保留塊有許可權的用戶ID

Reserved blocks uid: 0 (user root)



#對保留快有許可權的組ID

Reserved blocks gid: 0 (group root)



#第一個inode

First inode: 11



#每個inode大小

Inode size:128



#日誌inode

Journal inode: 8



#日誌大小為32M

Journal size: 32M



(4)group信息

Group 0: (Blocks 0-32767)

  Primary superblock at 0, Group descriptors at 1-1

  Block bitmap at 2 (+2), Inode bitmap at 3 (+3)

  Inode table at 4-1004 (+4)

  0 free blocks, 32019 free inodes, 2 directories

  Free blocks:

  Free inodes: 14-32032

Group 1: (Blocks 32768-65535)

  Backup superblock at 32768, Group descriptors at 32769-32769

  Block bitmap at 32770 (+2), Inode bitmap at 32771 (+3)

  Inode table at 32772-33772 (+4)

  3 free blocks, 32032 free inodes, 0 directories

  Free blocks: 33773-33775

  Free inodes: 32033-64064

Group 2: (Blocks 65536-98303)

  Backup superblock at 65536, Group descriptors at 65537-65537

  Block bitmap at 65538 (+2), Inode bitmap at 65539 (+3)

  Inode table at 65540-66540 (+4)

  3 free blocks, 32032 free inodes, 0 directories

  Free blocks: 66541-66543

  Free inodes: 64065-96096

Group 3: (Blocks 98304-131071)

  Backup superblock at 98304, Group descriptors at 98305-98305

  Block bitmap at 98306 (+2), Inode bitmap at 98307 (+3)

  Inode table at 98308-99308 (+4)

  3 free blocks, 32031 free inodes, 0 directories

  Free blocks: 99309-99311

  Free inodes: 96098-128128

Group 4: (Blocks 131072-163839)

  Backup superblock at 131072, Group descriptors at 131073-131073

  Block bitmap at 131074 (+2), Inode bitmap at 131075 (+3)

  Inode table at 131076-132076 (+4)

  0 free blocks, 32032 free inodes, 0 directories

  Free blocks:

  Free inodes: 128129-160160

...

Group 40: (Blocks 1310720-1313304)

  Backup superblock at 1310720, Group descriptors at 1310721-1310721

  Block bitmap at 1310722 (+2), Inode bitmap at 1310723 (+3)

  Inode table at 1310724-1311724 (+4)

  1580 free blocks, 32032 free inodes, 0 directories

  Free blocks: 1311725-1313304

  Free inodes: 1281281-1313312



    可見,各Group對應的blocks(注意每個block的大小是4096bytes)

    - Group 00:       0(0x000000) -   32767(0x007FFF):    0K =  0 * 32K

    - Group 01:   32768(0x008000) -   65535(0x00FFFF):   32K =  1 * 32K

    - Group 02:   65536(0x010000) -   98303(0x017FFF):   64K =  2 * 32K

    - Group 03:   98304(0x018000) -  131071(0x01FFFF):   96K =  3 * 32K

    - Group 04:  131072(0x020000) -  163839(0x027FFF):  128K =  4 * 32K

    …

    - Group 40: 1310720(0x140000) - 1313304(0x147FFF): 1280K = 40 * 32K



    這40個group一共的大小,是40*32K*4KB = 5GB



4、文件系統結構

    結合上面命令的輸出結果,一個分區一般含有多個block group,比如上面看到的40個。而每個block group都有superblock、group description、block bitmap、inode bitmap、inode table、data blocks,比如上面的Backup Superblock佔用1個block(4KB)、Group descriptors佔用1個block(4KB)、Block bitmap佔用1個block(1KB)、Inode bitmap佔用1個block(1KB)、Inode table佔用1001個block(512.5KB)。

    Superblock記錄整個block和inode的總量,已使用和未使用的inode和block的數量,1個block和1個inode的大小,filesystem的掛載時間/最後寫入時間/最後檢查時間、標示該文件系統是否被掛載的valid bit(0標示未掛載,1標示已掛載)。

    Group descriptors描述由何處開始記錄數據。

    Block bitmap記錄哪個block是空閑的。

    Inode bitmap記錄哪個inode是空閑的。

    Inode table存放inode數據。

    Data blocks存放block數據。

    如下圖:


《解決方案》

謝謝分享

[火星人 ] 柳大的Linux遊記·基礎篇(2)Linux文件系統的inode已經有582次圍觀

http://coctec.com/docs/service/show-post-1047.html