在前文《磁盤開篇:扒開機械硬盤堅硬的外殼!》和《拆解固態硬盤結構》中,咱們瞭解到了硬盤基本單位是扇區。在《磁盤分區也是隱含了技術技巧的》中咱們也瞭解了磁盤分區是怎麼回事,但剛分完區的硬盤也是不能直接被被操做系統使用的,必須還得要通過格式化。那麼今天咱們就簡單聊一聊,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
接下來讓咱們深刻理解一下上面輸出裏攜帶的信息。服務器
在上面的結果中咱們看到了幾個重要信息oracle
塊大小設置的是4096字節,咱們來分析兩種場景ide
很明顯,以上這兩種狀況下4096字節的塊大小是不合適的。你須要本身根據狀況選擇本身的塊大小進行從新格式化。操作系統
咱們再看另外的兩個數據,inode數量和block數量。咱們用block數量除一下inode,26214400/6553600=4,也就是說平均4個block會有一個inode。再舉兩個極端的例子:code
這些狀況下,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
這個塊組通常是多大呢?注意每一個塊中的數據塊位圖只有一個,假如你的塊大小爲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] ......
上述結果中包含信息以下:
好了,瞭解了以上原理之後,讓咱們回頭在來看看目錄使用的數據是怎麼在磁盤上組織的。建立目錄的時候,操做系統會在inode位圖上尋找還沒有使用的inode編號,找到後把inode分配給你。目錄會默認分配一個block,因此還須要查詢block位圖,找到後分配一個block。在block裏面,存儲的就是文件系統本身定義的desty結構了,每個結構裏會保存其下的文件名,文件的inode編號等信息。某個實際文件夾在磁盤上最終使用的空間以下圖所示:
目錄的block中保存的是其下面的文件和子目錄的desty結構體,保存着它們的文件名和inode號。理解了目錄,對於文件也是同樣的。也須要消耗inode,當有數據寫入的時候,再去申請block。
硬盤就是一個扇區組成的大數組,是沒法被咱們使用的,須要通過分區、格式化和掛載三個步驟。分區是把全部的扇區按照柱面分割成不一樣的大塊,格式化就把原始的扇區數組變成了可被Linux文件系統使用的inode、block等基本元素了。感受格式化程序有點像是廚師團隊裏的那個切墩的,把原材料變成了可被廚師直接使用的蔥花,肉段。格式化完後再通過最後一步掛載,對應的命令是mount
,而後你就能夠在它下面建立和保存文件了。
再擴展一下其實剛分完區的設備也是可使用的,這個時候的分區叫裸分區,也叫裸設備。好比oracle就是繞開操做系統直接使用裸設備的。可是這個時候你就沒法利用Linux文件系統裏爲你封裝好的inode、block組成的文件與目錄了,開發工做量會增長。
發現寫文章的過程當中最費時的是畫圖,眼睛快瞎了,路過就給個贊把,謝了!
開發內功修煉之硬盤篇專輯:
個人公衆號是「開發內功修煉」,在這裏我不是單純介紹技術理論,也不僅介紹實踐經驗。而是把理論與實踐結合起來,用實踐加深對理論的理解、用理論提升你的技術實踐能力。歡迎你來關注個人公衆號,也請分享給你的好友~~~