1.磁盤組成與分區的復習
首先說明一下磁盤的物理組成,整塊磁盤的組成主要有:
- 圓形的碟片(主要記錄數據的部分);
- 機械手臂,與在機械手臂上的磁頭(可擦寫碟片上的數據);
- 主軸馬達,可以轉動碟片,讓機械手臂的磁頭在碟片上讀寫數據;
從上面我們知道數據存儲與讀取的重點在于碟片,而碟片上的物理組成則為:
- 扇區(Sector)為最小的物理存儲單位,且依據磁盤設計的不同,目前主要有512B與448
- 兩種格式;
- 將扇區組成一個圓,那就是柱面(Cylinder);
- 早期的分區主要以柱面為最小分區單位,現在的分區通常使用扇區為最小分區單位(每個扇區都有其號碼,就好像座位一樣);
- 磁盤分區表主要有兩種格式,一種是限制較多的MBR分區表,一種是較新且限制較少的GPT分區表;
- MBR 分區表中,第一個扇區最重要,里面有:主引導記錄(Master boot record,MBR)及
- 分區表(partition table),其中MBR占有 446B,而分區表則占有64B;
- GPT分區表除了分區數量擴充較多之外,支持的磁盤容量也可以超過2TB;
????????至于磁盤的文件名部分,基本上,所有物理磁盤的文件名都已經被模擬成/dev/sd[a-p]的格式,第一塊磁盤文件名為/dev/sda,而分區的文件名若以第一塊磁盤為例,則為/dev/sda[1-128]。除了物理磁盤之外,虛擬機的磁盤通常為/devlvd[a-p]的格式。
????????若有使用到軟件磁盤陣列的話,那還有devlmd[0-128]的磁盤文件名,使用LVM時,文件名則為/devNGNAME/LVNAME等格式。關于軟件磁盤陣列與LVM我們會在后面繼續介紹,這里主要介紹的以物理磁盤及虛擬磁盤為主。
- /devlsd[a-p][1-128]:為物理磁盤的文件名;
- /devlvd[a-d][1-128]:為虛擬磁盤的文件名;
復習完物理組成后,來復習一下磁盤分區吧!
如前所述,以前磁盤分區最小單位經常是柱面,但CentOS7的分區軟件,已經將最小單位改成了扇區,所以分區容量的大小可以劃分的更細,此外,由于新的大容量磁盤大多要使用GPT分區表才能夠使用全部的容量,因此過去那個MBR的傳統磁盤分區表限制就不會存在了,不過,由于還是有小磁盤。
因此,你在處理分區的時候,還是得要先查詢一下,你的分區是MBR分區表,還是GPT的分區表。后續的操作,大多還是以GPT為主來介紹。
2.文件系統特性
????????我們都知道磁盤分區完畢后還需要進行格式化(format),之后操作系統才能夠使用這個文件系統。為什么需要進行格式化?
????????這是因為每種操作系統所設置的文件屬性/權限并不相同,為了存放這些文件所需的數據,因此就需要將分區進行格式化,以成為操作系統能夠利用的文件系統格式(filesystem)。由此我們也能夠知道,每種操作系統能夠使用的文件系統并不相同。
????????舉例來說,Windows98以前的微軟操作系統主要使用的文件系統是FAT(或FAT16),Windows2000以后的版本有所謂的NTFS文件系統,至于Linux的正統文件系統則為ext2(Linux second Extended file system,ext2fs)。此外,在默認的情況下,Windows操作系統不支持Linux的ext2文件系統。
????????傳統的磁盤與文件系統應用中,一個分區就只能夠被格式化成為一個文件系統,所以我們可以說個文件系統就是一個硬盤分區。但是由于新技術的利用,例如我們常聽到的LVM與軟件磁盤陣列(software raid ),這些技術可以將一個分區格式化為多個文件系統(例如LVM),也能夠將多個分區合成一個文件系統(LVM,RAID)。
????????所以說,目前我們在格式化時已經不再說成針對硬盤分區來格式化了,通常我們可以稱呼一個可被掛載的數據為一個文件系統而不是一個分區。
那么文件系統是如何運行的呢?
????????這與操作系統的文件有關。較新的操作系統的文件除了文件實際內容外,通常含有非常多的屬性,
例如Linux操作系統的文件權限(rwx)與文件屬性(擁有者、用戶組、時間參數等 )文件系統通常會將這兩部分的數據分別存放在不同的區塊,
- 文件的權限和屬性保存在 inode 中(i 節點)中,每個 inode 都有自己的編號。每個文件各占用一個 inode。不僅如此,inode 中還記錄著文件數據所在 block 塊的編號;
- 文件的實際內容保存在 data block 中(數據區塊),類似衣柜的隔斷,用來真正保存衣物。每個 block 都有屬于自己的編號。當文件太大時,可能會占用多個 block 塊。
另外,還有一個超級區塊(superblock)會記錄整個文件系統的整體信息,包括inode與數據區塊的總量、使用量、剩余量等。
每個inode與區塊都有編號,至于這三個數據的意義可以簡略說明如下:
- 超級區塊:記錄此文件系統的整體信息,包括inode與數據區塊的總量、使用量、剩余量,以及文件系統的格式與相關信息等;
- inode:記錄文件的屬性,一個文件占用一個inode,同時記錄此文件的數據所在的區塊號碼;
- 數據區塊:實際記錄文件的內容,若文件太大時,會占用多個區塊。
????????由于每個inode與數據區塊都有編號,而每個文件都會占用一個inode,inode 內則有文件數據放置的區塊號碼。
????????因此,我們可以知道的是,如果能夠找到文件的inode 的話,那么自然就會知道這個文件所放置數據的區塊號碼,當然也就能夠讀出該文件的實際數據了。這是個比較有效率的做法,因為如此一來我們的磁盤就能夠在短時間內讀取出全部的數據,讀寫的性能比較好。
我們將inode與數據區塊用圖解來說明一下,如圖所示:文件系統先格式化出 inode 和 block 塊,假設某文件的權限和屬性信息存放到 inode 4 號位置,這個 inode 記錄了實際存儲文件數據的 block 號有 4 個,分別為 2、7、13、15,此時我們的操作系統就能夠據此來排列磁盤的讀取順序,可以一口氣將四個區塊內容讀出來,那么數據的讀取就如同下圖中的箭頭所指定的模樣。
每個inode都有一個號碼,操作系統用inode號碼來識別不同的文件。
????????Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。對于系統來說,文件名只是inode號碼便于識別的別稱或者綽號。表面上,用戶通過文件名,打開文件。
實際上,系統內部這個過程分成三步:
- 首先,系統找到這個文件名對應的inode號碼;
- 其次,通過inode號碼,獲取inode信息;
- 最后,根據inode信息,分析 inode 所記錄的權限與用戶是否符合,找到文件數據所在的block,讀出數據
這種數據存取的方法我們稱為索引式文件系統(indexed allocation)。
????????那有沒有其他的常用文件系統可以比較一下?
有的,那就是我們常用的U盤,U盤使用的文件系統一般為FAT格式。
FAT這種格式的文件系統并沒有inode存在,所以FAT沒有辦法將這個文件的所有區塊在一開始就讀取出來。每個區塊號碼都記錄在前一個區塊當中,它的讀取方式有點像下面這樣;
????????上圖中我們假設文件的數據依序寫入1->7->4->15號這4個區塊號碼中,但這個文件系統沒有辦法一口氣就知道四個區塊的號碼,它要一個一個地將區塊讀出后,才會知道下一個區塊在何處。????????如果同一個文件數據寫入的區塊太分散,則我們的磁頭將無法在磁盤轉一圈就讀到所有的數據,因此磁盤就會多轉好幾圈才能完整地讀取到這個文件的內容。
常常會聽到所謂的碎片整理吧?需要碎片整理的原因就是文件寫入的區塊太過于離散,此時文件讀取的性能將會變得很差所致。這個時候可以通過碎片整理將同一個文件所屬的區塊集合在一起,這樣數據的讀取會比較容易。
因此,FAT的文件系統需要不時地碎片整理一下,那么ext2是否需要磁盤整理呢?
????????由于ext2是索引式文件系統,基本上不太需要進行碎片整理。但是如果文件系統使用太久,常常刪除、編輯、新增文件時,那么還是可能會造成文件數據太過于離散的問題,此時或許會需要進行整理一下。Linux操作系統上面進行過ext2或ext3文件系統的碎片整理,似乎不太需要。