柳大的Linux講義·基礎篇(2)Linux檔案系統的inode

鍾超發表於2012-01-25

《柳大的Linux講義·基礎篇》來自柳大的CSDN部落格,轉載請註明原文連結:http://blog.csdn.net/poechant/article/details/7214926


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


1Linux檔案系統的最基本資料結構:inodeblock

1)背景

由於Linux系統是多使用者多的,所以檔案系統型別多樣化是在所難免的。從ext2開始,是將檔案屬性和檔案內容分開儲存的,分別由inodeblock來負責。


2inode

用於儲存檔案的各屬性,包括:

- 所有者資訊:檔案的ownergroup

- 許可權資訊:readwriteexcite

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

- 標誌資訊:一些flags

- 內容資訊:typesize,以及相應的block的位置資訊。

注意:不記錄檔名或目錄名,檔名或目錄名記錄在檔案所在目錄對應的block裡。


3block

用來儲存檔案的內容。


4)建立目錄或檔案

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

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

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

(各block之間形成連結串列?)


5)讀取目錄或檔案

當我們告知作業系統一個檔案的路徑後,作業系統是如何找到這個檔案的呢?首先作業系統會呼叫檔案系統的相應介面,接下來:

遞迴說法:當讀取一個檔案或目錄X時,提供給檔案系統的是一個路徑P。檔案系統會先讀取X所在的目錄Dinode_d(注意這裡,其實是這一操作的遞迴過程),通過inode_d獲得其對應的block_d,在block_d中通過已知的X的名稱,查詢到Xinode_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 tableblock table兩部分,且大小都是固定的。該分割槽的所有inode都在inode table裡,所有block都在block table裡。


2)塊大小

ext2允許的block size1024bytes2048bytes4096bytes


3inode大小

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


4)預設分割槽

一個T bytes的分割槽,設定每個blockB bytes,每個inodeI bytes。如果假設平均每個檔案佔用兩個block的話,那麼inode的數量就應該設定為T/(2B+I)個,即inode tableT*I/(2B+I) bytesblock tableT*B/(2B+I) bytes。所以一個分割槽的檔案系統所能容納的檔案數量,被限制於該分割槽的檔案系統的inode area中的inode數。

如果一個分割槽大小為1GB,每個block4KB,一個inode128B,並假設平均每個檔案佔用2block。那麼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:<not available>


#檔案系統的通用唯一識別符號

Filesystem UUID:<none>


#檔案系統的

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


#每個groupblock數是32K

Blocks per group: 32768


#每個groupfragment數是32K

Fragments per group: 32768


#每個groupinode

Inodes per group:32032


#每個groupinode 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


4group資訊

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


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


4、檔案系統結構

結合上面命令的輸出結果,一個分割槽一般含有多個block group,比如上面看到的40個。而每個block group都有superblockgroup descriptionblock bitmapinode bitmapinode tabledata blocks,比如上面的Backup Superblock佔用1block4KB)、Group descriptors佔用1block4KB)、Block bitmap佔用1block1KB)、Inode bitmap佔用1block1KB)、Inode table佔用1001block512.5KB)。

Superblock記錄整個partitionblockinode的總量,已使用和未使用的inodeblock的數量,1block1inode的大小,filesystem的掛載時間/最後寫入時間/最後檢查時間、標示該檔案系統是否被掛載的valid bit0標示未掛載,1標示已掛載)。是MBR中的Superblockbackup

Group descriptors描述由何處開始記錄資料,是MBR中的Group descriptorsbackup

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

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

Inode table存放inode資料。

Data blocks存放block資料。

如下圖:



(注:圖取自《鳥哥的Linux私房菜》)


《柳大的Linux遊記·基礎篇》來自柳大的CSDN部落格,轉載請註明原文連結:http://blog.csdn.net/poechant/article/details/7214926

-

相關文章