- 計算機硬件組成之存儲設備
- 磁盤鏈接方式與設備文件名
- MBR(MS-DOS)與GPT磁盤分區表(partition table)
- 啟動流程中的BIOS與UEFI(啟動檢測程序)
- Linux安裝模式下磁盤分區的選擇
?一、計算機硬件組成之存儲設備
關于計算機硬件組成中的存儲設備這里只是為了更好的理解Linux文件系統做一些必要的介紹,主要圍繞Linux文件系統管理來展開,而不會涉及存儲設備硬件的物理特性原理和指令集這些計算機組成原理內容,但不排除會出現一些相關的描述,但這些內容不會怎么影響對Linux文件系統的軟件部分的理解,如果對相關內容有興趣可以自行查閱資料。
在計算機存儲設備中又分為主存和輔存,而這里要了解的輔存:磁盤在Linux文件系統層面的相關內容。主存包括寄存器、緩存、內存,它們需要在通電環境下才能實現數據的存儲。而輔存屬于持久化的存儲設備,通過設備的物理特性存儲數據,它們一般有磁盤、磁帶等,這里我們需要了解的是磁盤,磁盤是由多個圓形碟片、機械手臂、磁頭與主軸馬達組成。
?
碟片上的數據通過機器手臂移動磁頭和碟片轉動配合實現數據讀寫,由于這種轉動讀寫數據的方式在碟片上畫出很多個同心圓,然后在這些圓上面切出一個個小區塊讓機械手臂上的磁頭去讀寫。每一個小區塊就是磁盤的最小物理存儲單元稱為扇區(sector),同一個同心圓的扇區組合成的圓就是磁道(track),由于磁盤里可能會有多個碟片,因此所有碟片上面的同一個圓組合成所謂的柱面(cylinder)。由于同心圓的外圈圓比內圈圓大,所以為了合理利用這些空間,在外圈圓磁道上扇區比內圈圓扇區多,所以碟片轉一圈讀寫的數據量比內圈多,因此通常數據讀寫會由外圈往內圈寫。
?二、磁盤鏈接方式與設備文件名
正常情況下物理機器大概使用的都是/dev/sd[a-p]的磁盤文件名,至于虛擬機環境中,為了加速,可能會使用/dev/vd[a-p]這種設備文件名。假設當前你的虛擬機中,僅有一個virtio接口的磁盤,那么它對應在Linux操作系統中文件名應該是/dev/vda。
由于SATA、USB、SAS等磁盤接口都是使用SCSI模塊來驅動的,因此磁盤的文件名都是/dev/sd[a-p]的格式,這時候要根據Linux內核檢測到磁盤的順序來命名,一般會先檢測主板上的SATA插槽(SAS接口一般在以前的大型機上),按照接入插槽順序對應命名,然后接著將將USB接口的磁盤按照順序往后命名,比如現在主板上有六個SATA插槽,現在有兩個磁盤分別插入主板的SATA1、SATA5插槽上,還有一個USB磁盤,這時候它們的文件名應該分別是:
SATA1插槽上的文件名:/dev/sda SATA5插槽上的文件名:/dev/sdb USB磁盤(系統啟動完成后才被系統識別):/dev/sdc
?三、MBR(MS-DOS)與GPT磁盤分區表(partition table)
磁盤的碟片上可以細分出扇區(Sector)與磁道(Track)兩種單位,其中扇區的物理大小設計有兩種,分別是512字節與4K字節。在碟片上有一個重要的扇區,里面記錄了重要的信息被稱為MBR(Master Boot Record)格式,由于磁盤容量不斷擴大,造成讀寫上的一些困擾,后來又發展出GPT磁盤分區格式。
3.1MBR(MS-DOS)分區表格式與限制
早期Linux系統了兼容Windows的磁盤,所以使用的是支持Windows的MBR(Master Boot Record,主引導記錄)的方式來處理啟動引導程序與分區表。而啟動引導程序記錄與分區表就放在磁盤的第一個扇區,這個扇區通常是512字節的大?。ㄅf的磁盤扇區都是512字節),第一個扇區的512字節主要包含就是主引導程序記錄和分區表。
主引導記錄(Master Boot Record, MBR):可以安裝啟動引導程序的地方,有446個字節;
分區表(partition table):記錄整塊磁盤分區的狀態,有64個字節。
關于主引導記錄在下一節啟動流程中的做具體介紹,這里我們首先來關注分區表,由于分區表所在區域僅有64個字節容量,因此最多只能有四組記錄區,每組記錄了對應磁盤分區的開始與結束的柱面號碼,每組記錄所用的容量就是64/4=16字節。
假設現在磁盤的設備文件名為/dev/sda,該磁盤上有400個柱面,每個分區占100個柱面,用一個平面圖來表示這個磁盤分區大概就是下面這樣:
?
因為在第一個扇區中只有四個分區記錄,如何在這四個分區記錄的基礎上實現更多的磁盤分區呢?在MBR格式中除了固定的主要分區(Primary)還有一種分區叫做擴展分區(Extended),這里順帶提一下分區的最小單元是柱面(Cylinder)。在擴展分區中又會拿出一個扇區作為分區表的容器,擴展分區就可以再跟一個磁盤一樣進行分區,不過擴展分區中的分區一般表示為邏輯分區(loogical partition),邏輯分區的數量也不是可以無限劃分的,邏輯分區的數量與操作系統不同而數量會有差別,在Linux中的SATA磁盤上邏輯分區可以突破63個以上的分區限制。
下面是在第一扇區上劃分出一個主要分區和一個擴展分區,然后將擴展分區劃分成五個邏輯分區的示意圖:
?(由于畫示圖時忘了直接在圖中標注磁盤分區對應的文件名,這里再補充以下):
P1:/dev/sda1 P2:/dev/sda2 L1:/dev/sda5 L2:/dev/sda6 L3:/dev/sda7 L4:/dev/sda8 L5:/dev/sda9
MBR格式的磁盤分區主要分區與擴展分區最多可以有四個,擴展分區最多只能有一個(操作系統的限制),邏輯分區是由擴展分區劃分出來的。只有主要分區和邏輯分區才能被格式化,而擴展分區不能格式化。
關于MBR的分區整合,只有在同一個分區表中的分區才可以整合,也就是說邏輯分區只能和跟邏輯分區整合,主要分區可以跟主要分區整合。但是需要注意的是如果將擴展分區與主要分區整合,就必須先將擴展分區中所有的邏輯分區全部刪除才能被整合。
關于MBR的多磁盤分區:每個磁盤上第一個扇區都是自己的主引導程序和分區表扇區,每個磁盤都可以定義一個擴展分區。每個分區的名稱都是磁盤名稱+分區號,比如兩個磁盤的第一個分區名稱分別是:/dev/sda1、/dev/sdb1。
3.2GPT(GUID partition table)磁盤分區表:
因為過去的磁盤扇區大小就是512字節,現在的磁盤有的已經做到了4K一個扇區,為了兼容所有磁盤在扇區的定義上采用了邏輯區塊地址(Logical Block Address,簡稱LBA),每個邏輯區塊依然是512字節,但實際磁盤的扇區可能不是512字節,采用邏輯區塊一方面兼容了之前的磁盤物理扇區容量,另一方面是在磁盤分區時使用的邏輯區塊我們可以將它當作是一個扇區,但實際上它可能不是一個扇區。
與MBR采用磁盤的第一個扇區作為主引導記錄和分區表容器不同,GPT采用了34個邏輯區塊來記錄分區信息,除此之外GPT還將磁盤最后的34個邏輯區塊作為備份,保障磁盤的安全性,下面是GPT磁盤分區示意圖:
根據上面的示圖來了解GPT磁盤分區表的結構內容,這些內容都按照非常整齊的邏輯區塊地址分布在磁盤的起始位置和結束位置,起始位置34個邏輯區塊叫做主分區表,結束位置34個邏輯區塊叫做副分區表,副分區表相對主分區表少了一個主引導程序的區塊,主引導程序的邏輯區塊與MBR的主引導程序記錄一樣,都是在磁盤的第一個扇區,在GPT磁盤分區格式中就是在磁盤的第一個邏輯分區中,下面就按照邏輯區塊編號來逐個解釋:
LBA0:跟MBR的446個字節區塊一樣,用來存放主引導程序記錄,前面說過在GPT格式中每個邏輯區塊是512字節,在LBA0中除了主引導程序記錄占用的區塊,剩下的空間還會記錄一個特殊標識符,用來表示此磁盤為GPT格式。
LBA1:這是GPT表頭記錄,記錄的內容包括分區表的大小、位置、校正碼(CRC32),及備份用的GPT分區的位置。
LBA2~LBA33:這是實際記錄分區信息記錄,每個LAB記錄4組記錄,所以默認情況下有4*32=128組分區記錄。由于每個邏輯分區是512個字節,分為四組每個記錄就是512/4=128字節,GPT分別采用64位來記錄開始/結束的扇區號碼。
雖然Linux本身的內核設備記錄中針對單一磁盤最多只能分15個分區,由于Linux內核通過udev等方式處理可以突破這個限制,GPT已經沒有MBR的主、擴展、邏輯分區的概念,與之相對的是通過磁盤起始/結束地址的方式來切分成相對應的磁盤分區,每個分區都可以被獨立的格式使用。GTP分區表對于單一分區來說,最大容量理論可以達到264*512字節=263*1k字節=233*TB=8ZB。
在GPT分區格式中,每個分區的起始/結束設備物理地址可以不一定是連續的,如果不是連續的就會自動將不連續的中間空間作為一個分區,所以這種機制可以突破128個分區的限制,但超出分區表的分區好像不能格式化使用,這個我沒有測試過,但理論上確實可以不使用連續的物理地址進行分區突破這個限制,說這個只是作為理解GPT的機制,而不是為了去突破他的限制,在現實應用中也沒有必要。接著來了解一下為什么要對磁盤進行分區。
3.3為什么要對磁盤進行分區?
數據安全性:
如果磁盤沒有進行分區,此時磁盤部分數據出現了問題導致文件系統不能正常工作,這時候整個磁盤的文件數據就會有丟失的風險,采用分區就可以將有問題的那個磁盤分區進行格式化,而不至于導致前整個磁盤的數據出現問題。還有就是假設你的Windows系統裝在C盤,可能因為系統故障的原因需要重裝系統,這時候你可以將C盤的文件遷移到D盤,然后C盤重裝系統就不會影響到D盤中的文件數據。
系統性能的考慮:
有了磁盤分區可以提高指針尋址的速度,說的簡單點假設你的數據是一枚掉在籃球場的硬幣,這時候要尋早這枚硬幣肯定先確定你在球場的活動范圍,然后在你的活動范圍里去找這枚硬幣的速度肯定比在整個籃球場尋找的速度塊,但需要注意的是也不是分區越多性能越高,關于這部分內容以后有機會在系統原理中解析吧,如果有興趣的可以自行查找相關資料。
3.4MBR格式與GPT格式對比
從前面的介紹中我們知道MBR的磁盤主分區和擴展分區放在第一個扇區,如果第一個扇區出現問題就會導致整個磁盤的數據丟失,所以GPT在磁盤的邏輯區塊地址末尾的34個分區中又備份了一份副分區表,就算是主分區表出現了問題依然可以使用副分區表的備份進行恢復,GPT提高了數據的安全性。其二是由于磁盤工藝不斷的提升,磁盤的容量和扇區越來越多,原來MBR的四個分區會阻礙磁盤的性能提升,所以GPT在合理的分區下性能比MBR要高,這其中的原理還是留在系統原理中解析吧。
?四、啟動流程中的BIOS與UEFI(啟動檢測程序)
在前面的磁盤分區中提到了第一個扇區存放的MBR(主引導程序記錄),它是用來加載系統內核文件的程序,輔助啟動操作系統。但MBR(主引導程序記錄)也不能自己啟動,而是要用主板上的一個存儲器固件中存儲的BIOS來啟動MBR(主引導程序記錄),它們大致的計算機系統啟動流程是:
1.主機電源通過通電信號啟動BIOS主動執行固件,BIOS會找到第一個可啟動設備,即通過磁盤硬盤等相關的插槽接口的第一個設備的第一個扇區中的MBR,找到MBR并加載啟動BIOS的任務就完成了;
2.接著MBR主引導程序就會找到系統安裝時記錄的系統內核文件地址,加載系統內核文件并啟動,將控制權交給操作系統,MBR的任務就完成了。
3.系統內核文件啟動操作系統,接著系統就開始可以進入工作狀態了。
如果分區表是GPT格式的話,BIOS也能夠從LBA0的MBR兼容區塊讀取到主引導記錄并啟動它,如果主引導程序支持GPT格式的話,BIOS照樣可以讀取到正確的操作系統內核文件并啟動操作系統。
由于MBR僅有446字節而已,如果使用grub的啟動引導程序的話,那就要額外劃分出一個BIOS boot分區,這個分區才能夠放置其他開機過程所需要的程序,在CentOS當中,這個分區占用2MB左右。
所以MBR的Boot Loader任務很簡單,包括:
1.提供選項:用戶可以選擇不同的啟動選項,這也是多重引導的重要功能(由額外的BIOS boot分區提供程序文件)。 2.加載內核文件:直接指向可使用的程序區段來啟動操作系統(就是加載系統內核文件)。 3.轉交其他啟動引導程序:將啟動管理功能交給其他啟動引導程序負責。
也就是說MBR的任務其實很簡單,提供啟動引導選項,如果是只有一個啟動引導選項也就是它自身的話就會自動去加載系統內核文件,如果有多個啟動引導選項就會通過用戶選擇去加載新的啟動加載程序,并將啟動管理權限交給這個新的啟動加載程序,這個新的啟動加載程序再去加載它對應的系統內核文件。
啟動引導程序除了安裝在默認的MBR中,還可以安裝在每個分區的啟動扇區(boot sector)中,這些被安裝在啟動分區中的啟動引導程序就是Boot Lader中的多個啟動引導選項,可以通過下圖來了解啟動引導程序的工作流程:
?
?
上面的一個多重啟動引導流程圖,你會發現在這個設備上同時安裝了Windows和Linux系統,這也正是因為有了多重引導才能是現在一臺機器上實現安裝多個可用的操作系統,另外需要注意的是這個流程圖沒有體現出BIOS及調用的多重引導文件BIOS toot。
需要注意的是如果在一臺設備上需要同時安裝Windows和Linux的話,需要先安裝Windows,因為Windows會主動覆蓋第一扇區的MBR,而Linux可以選擇將啟動引導程序安裝在MBR或別人分區上。
UEFI BIOS搭配GPT啟動的流程:
由于GPT可以提供64位的尋址,然后也就可以使用較大的區塊來處理啟動引導程序,但是BIOS其實并不懂GPT,畢竟BIOS僅是16位的程序,所以要通過GPT提供兼容模式才能夠讀寫這個磁盤,為了解決這個問題就有了UEFI(Unified extensible Firmware Interface)這個統一可擴展固件接口產生。
UEFI主要是想取代BIOS這個固件接口,因此也被稱為UEFI BIOS,相比傳統的BIOS使用匯編語言,UEFI使用的是C語言更容易開發。UEFI在啟動階段就能讓該系統連接TCP/IP直接上網,根本不需要進入操作系統,這讓小型系統開發充滿了各式各樣的可能性。
UEFI最初開發的時候制定規則里,包括硬件資源使用輪詢的方式管理,與BIOS采用終端的方式管理比較,輪詢的效率稍微低一些。另外UEFI并不能提供完整的緩存功能,因此執行效率也沒有辦法提升,不過UEFI驅動程序會啟動一個類似操作系統的Shell環境,用戶可以在此環境中執行任意UEFI程序,效果相比MS-BIOS更好。
UEFI大多用來實現啟動操作系統之前的硬件檢測、啟動管理、軟件設置等目的,加載操作系統之后更BIOS一樣會將管理權限交給操作系統,但在特定環境下UEFI程序是可以部分執行的。
由于黑客經常借由BIOS啟動階段來破壞系統,并取得系統的控制權,因此UEFI加入了安全啟動(secure boot)功能,這個功能代表即將啟動的操作系統必須被UEFI所驗證,否則無法啟動。Windows用了很多這樣的功能管理硬件,不過這個功能也會導致很多操作系統無法啟動,所以,有時候可能需要將UEFI的secure boot功能關閉才能啟動Linux操作系統。
雖然UEFI可以直接獲取GPT分區表,不過最好還是擁有BIOS boot的分區支持。同時為了兼容Windows,并且提供其他第三方廠商所使用的UEFI應用程序存儲空間,必須格式化一個FAT的文件系統分區,大約需要提供512MB到1GB左右的大小,讓其他UEFI執行更為方便。
關于啟動流程的具體系統操作在后面的系統管理員相關博客中會詳細的介紹,這里只是將一些概念做一些介紹。
?
?
?
?
本文摘自 :https://www.cnblogs.com/