本文介紹 Linux 文件系統(tǒng)相關(guān)的基本概念。
硬盤的物理組成
盤片
硬盤其實(shí)是由單個(gè)或多個(gè)圓形的盤片組成的,按照盤片能夠容納的數(shù)據(jù)量,分為單盤(一個(gè)硬盤里面只有一個(gè)盤片)或多盤(一個(gè)硬盤里面有多個(gè)盤片)的硬盤。下面是一張盤片的示意圖(此圖來自互聯(lián)網(wǎng)):
磁道和柱面
硬盤中有磁頭在盤片上讀寫數(shù)據(jù),磁頭固定在機(jī)械臂上,機(jī)械臂上有多個(gè)磁頭(每個(gè)盤片的兩側(cè)各一個(gè))。當(dāng)磁頭固定不動(dòng)時(shí)(假設(shè)機(jī)械手臂不動(dòng)),盤片轉(zhuǎn)一圈所畫出來的圓就是磁道(track)。所有盤片上相同半徑的那個(gè)磁道就組成了柱面(cylinder)。柱面是磁盤分區(qū)是的最小單位。
扇區(qū)
由圓心向外畫直線,可以將磁道再劃分為扇區(qū),扇區(qū)就是盤片上最小的讀寫單位。通常情況下,一個(gè)扇區(qū)的大小為 512 個(gè)字節(jié)。因此可以使用下面的公式計(jì)算磁盤的容量:
柱面數(shù) * 磁頭數(shù) * 扇區(qū)數(shù) * 512 字節(jié)
磁盤分區(qū)
為什么要對硬盤進(jìn)行分區(qū)呢?
因?yàn)槲覀儽仨氁嬖V操作系統(tǒng):這塊硬盤可以訪問的區(qū)域是從 A 柱面到 B 柱面。如此一來,操作系統(tǒng)才能控制硬盤磁頭去 A-B
范圍內(nèi)的柱面上訪問數(shù)據(jù)。如果沒有告訴操作系統(tǒng)這些信息,它就無法在磁盤上存取數(shù)據(jù)。所以對磁盤分區(qū)的要點(diǎn)是:記錄每一個(gè)分區(qū)的起始與結(jié)束柱面。
實(shí)際上,分區(qū)時(shí)指定的開始和結(jié)束位置是柱面上的扇區(qū)(sector):
下圖是通過 fdisk 命令查看到的磁盤分區(qū)信息:
那么,這些分區(qū)的信息(起始柱面與結(jié)束柱面)被存放在了哪里呢?答案是磁盤的主引導(dǎo)區(qū)(Master Boot Recorder, MBR)。MBR
在一塊硬盤的第 0 軌上,這也是計(jì)算機(jī)啟動(dòng)之后要去使用硬盤時(shí)必須讀取的第一個(gè)區(qū)域。
這個(gè)區(qū)域內(nèi)記錄了硬盤里所有分區(qū)的信息即磁盤分區(qū)表,以及啟動(dòng)時(shí)可以寫入引導(dǎo)程序的位置。因此 MBR
對于硬盤來說至關(guān)重要,如果它壞掉了,這塊磁盤也就壽終正寢了。下面是磁盤分區(qū)表的示意圖(此圖來自互聯(lián)網(wǎng)):
文件系統(tǒng)
在告知系統(tǒng)分區(qū)所在的起始與結(jié)束柱面后,需要將分區(qū)格式化為操作系統(tǒng)能夠識(shí)別的文件系統(tǒng)。每個(gè)操作系統(tǒng)能夠識(shí)別的文件系統(tǒng)并不相同,比如 Windows
系統(tǒng)在默認(rèn)的情況下就無法識(shí)別 Linux 的文件系統(tǒng),所以要針對操作系統(tǒng)來格式化分區(qū)。可以簡單的認(rèn)為每個(gè)分區(qū)就是一個(gè)文件系統(tǒng)。
邏輯塊
不論哪種文件系統(tǒng),目的都是為了存儲(chǔ)數(shù)據(jù)。前面提到,硬盤的最小讀寫單位是扇區(qū),而現(xiàn)實(shí)中數(shù)據(jù)的讀寫單位并不是扇區(qū)的大小,原因是使用扇區(qū)的大小為單位來讀寫數(shù)據(jù)的效率實(shí)在是太低了。因?yàn)橐粋€(gè)扇區(qū)只有
512 個(gè)字節(jié),而磁頭是一個(gè)扇區(qū)一個(gè)扇區(qū)的讀取數(shù)據(jù),也就是說,如果文件有 10M,那么讀取這個(gè)文件磁頭就要進(jìn)行 20480 次讀取操作(I/O)。
為了提升效率,就有了邏輯塊(Block)的概念。邏輯塊是在分區(qū)進(jìn)行文件系統(tǒng)的格式化時(shí)所指定的"最小存儲(chǔ)單位",這個(gè)最小存儲(chǔ)單位以扇區(qū)的大小為基礎(chǔ)(因?yàn)樯葏^(qū)為硬盤的最小物理存儲(chǔ)單位),大小為扇區(qū)大小的
2? 倍。此時(shí),磁頭一次可以讀取一個(gè)邏輯塊。指定邏輯塊的大小為 4KB(即由連續(xù)的 8 個(gè)扇區(qū)構(gòu)成的一個(gè)塊),那么,同樣讀取一個(gè) 10M
的文件,磁頭要讀取的次數(shù)則大幅下降為 2560 次,這樣就大大提高了文件的讀取效率。
需要注意的是,邏輯塊也并不是越大越好。因?yàn)橐粋€(gè)邏輯塊最多僅能容納一個(gè)文件(這里指 Linux 的 ext2
文件系統(tǒng))。這有什么問題呢?舉例來說,假如邏輯塊的大小為 4KB,有一個(gè)文件大小為 0.1KB,這個(gè)小文件將占用掉一個(gè)塊的空間。也就是說,該塊雖然可以容納
4KB 的容量,然而由于文件只占用了 0.1KB,實(shí)際上剩下的 3.9KB
空間就不能再被使用了(完全浪費(fèi)掉了)。所以好的方式是根據(jù)實(shí)際的使用場景來設(shè)置邏輯塊的大小。
在分區(qū)上創(chuàng)建文件系統(tǒng)時(shí),可以指定文件系統(tǒng)的邏輯塊大?。?br>
上面命令中我們指定的邏輯塊大小為 1024 B,也就是兩個(gè)扇區(qū)的大小。我們還可以通過 tune2fs 查看現(xiàn)有文件系統(tǒng)邏輯塊的大?。?br>
這里需要區(qū)分三個(gè)概念:
扇區(qū)、邏輯塊和頁
塊設(shè)備中最小的尋址單元是扇區(qū)。
邏輯塊是文件系統(tǒng)的一種抽象--只能基于塊來訪問文件系統(tǒng)。內(nèi)核執(zhí)行的所有磁盤操作都是按照塊進(jìn)行的(但是所有設(shè)備的 I/O
必須以扇區(qū)為單位進(jìn)行操作)。對塊的要求有:必須是扇區(qū)大小的 2 的整數(shù)倍;不能超過頁的大小。
內(nèi)核把內(nèi)存的物理頁作為內(nèi)存的管理單位,因?yàn)閺拇疟P讀取的數(shù)據(jù)最終都會(huì)被保存在內(nèi)存中,所以系統(tǒng)優(yōu)化的結(jié)果是不允許文件系統(tǒng)中的邏輯塊超過內(nèi)存頁的大小??梢酝ㄟ^下面的命令查看系統(tǒng)中頁的大?。?br>$ getconf PAGESIZE
超級(jí)塊
分區(qū)完成后,每個(gè)分區(qū)會(huì)被格式化為一個(gè)文件系統(tǒng)。而每個(gè)文件系統(tǒng)開始位置的那個(gè)塊就稱為超級(jí)塊(superblock)。超級(jí)塊會(huì)記錄整個(gè)文件系統(tǒng)的整體信息,包括
inode 與 block 的總量、使用量、剩余量等。
也就是說,要使用一個(gè)分區(qū)(或文件系統(tǒng))來進(jìn)行數(shù)據(jù)訪問時(shí),第一個(gè)要經(jīng)過的就是超級(jí)塊。所以,如果超級(jí)塊損壞了,這個(gè)分區(qū)上的數(shù)據(jù)也就丟掉了。
inode
Linux
操作系統(tǒng)的文件數(shù)據(jù)除了文件實(shí)際內(nèi)容外,通常含有非常多的屬性,例如文件權(quán)限(rwx)與文件屬性(擁有者、群組、時(shí)間參數(shù)等)。文件系統(tǒng)通常會(huì)將這兩部份的數(shù)據(jù)分別存放在不同的區(qū)塊,權(quán)限與屬性放置到
inode 中,至于實(shí)際數(shù)據(jù)則放置到 datablock 區(qū)塊中。
block
實(shí)際記錄文件的內(nèi)容,若文件太大時(shí),會(huì)占用多個(gè) block。
每個(gè)文件都會(huì)占用一個(gè) inode,inode 內(nèi)則有文件數(shù)據(jù)放置的 block 號(hào)碼。下面是 inode、block 數(shù)據(jù)存取的示意圖(此圖來自互聯(lián)網(wǎng)):
這種數(shù)據(jù)存取的方法我們稱為索引式文件系統(tǒng)(indexed allocation)。
掛載點(diǎn)
在 Linux
系統(tǒng)中,文件系統(tǒng)被安裝在一個(gè)特定的掛載點(diǎn)(一個(gè)普通的目錄)上,所有的已安裝文件系統(tǒng)都作為根文件系統(tǒng)樹的枝葉出現(xiàn)在系統(tǒng)中。與這種單一、統(tǒng)一的樹形成鮮明對照的就是
Windows 系統(tǒng)的表現(xiàn),它們以字母命名文件系統(tǒng),比如我們常見的 C 盤、D 盤。
參考:
《鳥哥的私房菜》
熱門工具 換一換