前述:Linux系統管理員很重要的任務之一就是管理好本身的磁盤文件系統,每一個分區不可太大也不能夠過小,太大會致使磁盤容量的浪費,過小會致使產生的文件沒法存儲的問題。在Linux裏面文件是由兩部分數據組成,一部分是metadata,另外一部分是data。那麼這些數據都存放在文件系統的什麼地方呢?這就讓咱們必須得了解文件系統的Inode與Block的基本原理了,而Linux最傳統的磁盤文件系統使用的是Ext2,因此咱們瞭解下它的內部原理。node
第一部分:磁盤的組成和分區(基礎)bash
磁盤的機械部分:
服務器
一、圓形的盤片(主要記錄數據的部分)
ide
二、機械手臂與機械手臂上的磁頭(可讀寫盤片上的數據)
性能
三、主軸馬達,能夠轉動盤片,讓機械手臂的磁頭在盤片上讀寫數據
學習
磁盤的基本概念
flex
一、扇區是最小的物理存儲單元(512bytes)
ui
二、將扇區組成一個園,那就是柱面,柱面是分區的最小單位
spa
三、第一個扇區最重要,裏面有硬盤的主引導程序(MBR)佔446bytes和分區表(partision tables)佔64bytes。操作系統
四、目前流行的家用硬盤接口SATA和服務器硬盤接口SAS。
磁盤分區部分:
一、主分區和擴展分區最多能夠有4個(硬盤的限制)
二、擴展分區最多隻能有一個(操做系統限制)
三、邏輯分區是由擴展分區分化出來的分區
四、主分區和邏輯分區的內容能夠被格式化,而擴展分區沒法格式化
第二部分:文件系統的基本特性
咱們都知道硬盤分區後都是須要格式化,以後操做系統才能使用該分區,爲何呢?這是由於各類操做系統的文件的屬性和權限並不相同的,爲了可以存放這些文件,所以將分區格式化,以成爲操做系統能利用的系統格式。
文件系統一般會將兩部分的數據分別放在不一樣的塊,權限與屬性放置到inode中,實際的數據放置到 data block塊中,另外還有一個超級塊(superblock)會記錄整個文件系統的總體信息,包括inode和block的總量、使用量、剩餘量,以及文件系統的格式與信息。inode會記錄文件的屬性,一個文件會佔用一個inode,同時會記錄文件的數據所在的block號碼,block實際會記錄文件的內容,若文件太大,會佔用多個block。
第三部分:Linux的Ext2文件系統
一、data block(數據塊)
data block是用來放置文件內容的地方,在Ext2文件系統下支持的block的大小爲1KB、2KB和4KB。在格式化的時候,block的大小就被肯定了,而且每一個block都會有編號,以方便inode記錄。
原則上,block的大小與數量在格式化是不能再改變了(除非從新格式化);每一個block內最多隻能放置一個文件的數據,存在如下兩種狀況,一種是文件大於1個block則會佔用多個block,另一種是文件小於block,則block的剩餘空間就不會再被使用了(磁盤空間的浪費)。
那既然上述說的大的block可能會致使嚴重的磁盤容量浪費,可是block設定爲最小1K呢?那麼對於大的文件來講會佔用數量更多的block,而inode要記錄更過的block的號碼,此時又會到時文件系統的不良讀寫的性能。
所以,在系統進行格式化以前,要想好文件系統的預計使用狀況,目前流行爲4K。
二、inode
inode的主要內容是記錄文件的屬性以及該文件的實際數據是放在那幾號的block內。inode記錄文件數據有如下內容:
a、該文件的訪問模式(r/w/x)
b、該文件的全部者與組(owner/group)
c、該文件的大小
d、該文件的時間戳(atime、ctime、mtime)
e、定義文件屬性的標誌
f、該文件真正內容的指向(pointer)
其實inode的數量以及大小在格式化的時候就已經被固定了,除了以上還有其它的特性以下:
每一個inode的大小爲128bytes,每一個文件都僅會佔用一個inode,所以文件系統可以建立的文件的數量是與inode的數量相關的。
系統讀取文件時須要先找到inode,而且分析inode所記錄的權限與用戶是否符合,若符合才能繼續讀取block的內容。
第四部分:inode的結構示意圖
首先,inode須要記錄的數據很是的多,但恰恰只有128bytes,而inode記錄一個block號碼就要花掉4bytes,一個inode若是不記錄其餘數據的化,最多也只能記錄32個block號碼。假如一個文件的大小爲4GB且每一個block爲4KB時,那麼至少也要100萬個block號碼,那麼按照上面所說的一個inode對應32個block號碼,就須要至少32000個inode,這時會須要更多的inode,咱們也沒有那麼多的inode,所以咱們的系統就有了inode記錄block號碼的12個直接,1個間接,1個雙間接,1個三間接的記錄區。
下面咱們經過上述inode的結構圖,來分析下內部原理。
圖中最左邊爲inode自己(128bytes),裏面有12個直接指向block號碼對照,這12個記錄就可以直接取得block的號碼。至於咱們說的間接就是再拿一個block的內存來放當作記錄block的號碼的記錄區,若是文件較大時,系統就會使用間接。同理若是文件再大的化,可使用雙間接,和三間接。所謂的雙間接第一個block再指向下一個記錄編號的block在哪裏,實際記錄的是第二個block中。以此類推三間接就是利用第三層block來記錄編號的,前兩層的block都是放置記錄區的內容。
若1個block的大小爲1KB,下面咱們看各層能夠記錄多少block
12個直接指向:12X1K=12K (直接鏈接,僅能記錄12條block)
間接鏈接:256X1K=256K (每條block號碼的記錄會花掉4bytes,所以1個block會記錄256條記錄)
雙間接:256X256X1K=64MB(第一層block會指定256個第二層,每一個第二層又能夠指定256個號碼,就會對應256個block)
三間接:256X256X256X1K=16GB(第一層block會指定256個第二層,每一個第二層又會指定256個第三層,每一個第三層能夠指定256個號碼)
所以將以上四種方式加在一塊兒約等於16GB,此時咱們知道文件系統block格式化爲1K大小時,可以容納最大的文件爲16GB,因爲Ext2文件系統自己限制block的大小,所以2K和4K的block的大小,在此就不加介紹了,是一樣的道理。
第五部分:實驗操做查看當前文件系統
[root@localhost ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 103081248 3759536 94078832 4% / tmpfs 953648 228 953420 1% /dev/shm /dev/sda1 194241 39059 144942 22% /boot /dev/sda3 20027260 44992 18958268 1% /testdir /dev/sr0 3824484 3824484 0 100% /media/CentOS_6.8_Final
[root@localhost ~]# dumpe2fs /dev/sda1 dumpe2fs 1.41.12 (17-May-2010) Filesystem volume name: <none> Last mounted on: /boot (最後的掛載點) Filesystem UUID: 439d1457-04f7-4069-b3ac-04e77c29543c Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize Filesystem flags: signed_directory_hash Default mount options: user_xattr acl Filesystem state: clean (文件系統是沒有) Errors behavior: Continue Filesystem OS type: Linux Inode count: 51200 (Inode的總數) Block count: 204800 (Block的總數) Reserved block count: 10240 Free blocks: 155182 (還有多少個block可用) Free inodes: 51161 (還有多少個inode可用) First block: 1
Block size: 1024 (每一個block的大小爲1024字節) Fragment size: 1024 Reserved GDT blocks: 256 Blocks per group: 8192 Fragments per group: 8192 Inodes per group: 2048 Inode blocks per group: 256 Flex block group size: 16 Filesystem created: Mon Jul 25 01:29:21 2016 Last mount time: Fri Jul 29 23:48:48 2016 Last write time: Fri Jul 29 23:48:48 2016
Mount count: 7 Maximum mount count: -1 Last checked: Mon Jul 25 01:29:21 2016 Check interval: 0 (<none>) Lifetime writes: 48 MB Reserved blocks uid: 0 (user root) Reserved blocks gid: 0 (group root) First inode: 11 Inode size: 128 (每一個inode爲128字節) Journal inode: 8 Default directory hash: half_md4 Directory Hash Seed: e0fcf3ec-d918-4914-8e8b-34b7fa31b7f6 Journal backup: inode blocks Journal features: (none) Journal size: 4096k Journal length: 4096 Journal sequence: 0x0000002b Journal start: 1
本文僅爲Linux的Ext2文件系統的inode和block的簡單介紹,其中還有超級塊,塊對照表,inode對照表等以及和目錄樹的關係內容,咱們先了解其基本原理,有助於咱們接下來的學習。