理解格式化原理

在前文《磁盤開篇:扒開機械硬盤堅硬的外殼!》和《拆解固態硬盤結構》中,咱們瞭解到了硬盤基本單位是扇區。在《磁盤分區也是隱含了技術技巧的》中咱們也瞭解了磁盤分區是怎麼回事,但剛分完區的硬盤也是不能直接被被操做系統使用的,必須還得要通過格式化。那麼今天咱們就簡單聊一聊,Linux下的格式化到底都幹了些啥。node

Linux下的格式化命令是mkfs,mkfs在格式化的時候須要制定分區以及文件系統類型。該命令其實就是把咱們的連續的磁盤空間進行劃分和管理。我在個人機器上執行了一下,輸出以下:數組

# mkfs -t ext4 /dev/vdb
mke2fs 1.42.9 (28-Dec-2013)
文件系統標籤=
OS type: Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
6553600 inodes, 26214400 blocks
1310720 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=2174746624
800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000, 7962624, 11239424, 20480000, 23887872

接下來讓咱們深刻理解一下上面輸出裏攜帶的信息。服務器

inode與block

在上面的結果中咱們看到了幾個重要信息oracle

  • 塊大小:4096字節
  • inode數量:6553600
  • block數量:26214400

塊大小設置的是4096字節,咱們來分析兩種場景ide

  • 假如你的文件系統所有都用來存儲1KB如下的小文件,這個時候你的磁盤1/3的空間將會被浪費沒法使用。
  • 假如你的文件全都是GB以上的大文件,這個時候你的inode索引節點裏就須要直接或間接維護許許多多的block索引號

很明顯,以上這兩種狀況下4096字節的塊大小是不合適的。你須要本身根據狀況選擇本身的塊大小進行從新格式化。操作系統

咱們再看另外的兩個數據,inode數量和block數量。咱們用block數量除一下inode,26214400/6553600=4,也就是說平均4個block會有一個inode。再舉兩個極端的例子:code

  • 第一種狀況,假如說咱們的文件都是4KB如下的,那麼咱們的文件系統用到最後出現的狀況就是inode所有用光了,還有1/3的block空閒,並且再也沒有辦法建立新文件了。
  • 第二種狀況,假如咱們的文件都特別大,每個文件須要1000個block,最後的狀況就是block所有都用光了,可是inode又都空閒下來了,這個時候也是沒辦法再建文件的。

這些狀況下,block和inode的配比也都是不符合你使用的,你須要根據本身的業務從新配置。mkfs傻瓜格式出來的結果沒法知足你的業務需求,你就須要使用另一些格式化命令了,好比mke2fs,這個命令容許你輸入更詳細的格式化選項,demo以下:blog

mke2fs -j -L "卷標" -b 2048 -i 8192 /dev/sdb1

塊組

咱們再回頭看格式化後的結果,結果中顯示了一些和groups相關的東東,以下:索引

800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group

那麼這個groups到底說的是啥呢?其實呀,格式化後的全部inode並非挨着一塊兒放的,一樣block也不是。而是分紅了一個個的group,每個group裏都有一些inode和block。邏輯圖以下:ip

file

這個塊組通常是多大呢?注意每一個塊中的數據塊位圖只有一個,假如你的塊大小爲4KB,這樣一個bit表明一個數據塊,4KB能夠有32KB個bit,能夠管理32K*4K=128M的數據塊。來讓咱們實際動手驗證一下,以下:

# dumpe2fs /dev/vdb
......
Block size:               4096
Inode size:               256
Inode count:              6553600
Block count:              26214400
......
Group 16: (Blocks 524288-557055) [INODE_UNINIT, ITABLE_ZEROED]
  Checksum 0xe838, unused inodes 8192
  Block bitmap at 524288 (+0), Inode bitmap at 524304 (+16)
  Inode表位於 524320-524831 (+32)
  24544 free blocks, 8192 free inodes, 0 directories, 8192個未使用的inodes
  可用塊數: 532512-557055
  可用inode數: 131073-139264
......
Group 799: (Blocks 26181632-26214399) [INODE_UNINIT, ITABLE_ZEROED]
......

上述結果中包含信息以下:

  • 該分區總共格式化好了800個塊組
  • 塊組16共有32K個block(第524288-557055),
  • block位圖在524288這個塊上
  • inode位圖在524304這個塊上
  • inode table佔用了612個block(524320-524831)
  • 剩下的其它的block(32K-1-1-612)就都真的是給用戶準備的了,目前空閒未分配的在Free blocks能夠查看到。

再次理解目錄

好了,瞭解了以上原理之後,讓咱們回頭在來看看目錄使用的數據是怎麼在磁盤上組織的。建立目錄的時候,操做系統會在inode位圖上尋找還沒有使用的inode編號,找到後把inode分配給你。目錄會默認分配一個block,因此還須要查詢block位圖,找到後分配一個block。在block裏面,存儲的就是文件系統本身定義的desty結構了,每個結構裏會保存其下的文件名,文件的inode編號等信息。某個實際文件夾在磁盤上最終使用的空間以下圖所示:

file

目錄的block中保存的是其下面的文件和子目錄的desty結構體,保存着它們的文件名和inode號。理解了目錄,對於文件也是同樣的。也須要消耗inode,當有數據寫入的時候,再去申請block。

結論

硬盤就是一個扇區組成的大數組,是沒法被咱們使用的,須要通過分區、格式化和掛載三個步驟。分區是把全部的扇區按照柱面分割成不一樣的大塊,格式化就把原始的扇區數組變成了可被Linux文件系統使用的inode、block等基本元素了。感受格式化程序有點像是廚師團隊裏的那個切墩的,把原材料變成了可被廚師直接使用的蔥花,肉段。格式化完後再通過最後一步掛載,對應的命令是mount,而後你就能夠在它下面建立和保存文件了。

再擴展一下其實剛分完區的設備也是可使用的,這個時候的分區叫裸分區,也叫裸設備。好比oracle就是繞開操做系統直接使用裸設備的。可是這個時候你就沒法利用Linux文件系統裏爲你封裝好的inode、block組成的文件與目錄了,開發工做量會增長。

發現寫文章的過程當中最費時的是畫圖,眼睛快瞎了,路過就給個贊把,謝了!


file


開發內功修煉之硬盤篇專輯:


個人公衆號是「開發內功修煉」,在這裏我不是單純介紹技術理論,也不僅介紹實踐經驗。而是把理論與實踐結合起來,用實踐加深對理論的理解、用理論提升你的技術實踐能力。歡迎你來關注個人公衆號,也請分享給你的好友~~~

相關文章
相關標籤/搜索