您好,登錄后才能下訂單哦!
做存儲和計算機架構的研發人員需要深入理解數據在磁盤上的分布,只有這樣當系統出現故障的時候才能手動進行系統恢復。目前,磁盤的容量越來越大,故障率越來越高,當故障發生之后需要對磁盤數據進行恢復,磁盤數據的恢復不僅要了解分區等基本的磁盤數據布局,而且需要知道文件系統在磁盤上的數據分布。這里首先討論分區等系統基本數據在磁盤上的分布。
DOS分區是目前常用的一種分區方式,其磁盤數據分布描述如下:
第一個扇區是主引導分區MBR,MBR描述了磁盤分區的結構,MBR的內容包括引導代碼和分區表信息,最后以標志0xaa55結尾。
MBR中的引導代碼是在BIOS啟動之后首先得到運行的代碼,通常引導代碼會檢查磁盤分區表,并且判斷哪個分區是啟動分區,找到那個啟動分區之后,然后從啟動分區引導操作系統。
DOS分區規定了四個主分區,每個分區最大可以描述2TB的磁盤空間。當磁盤容量增大后,需要采用擴展分區滿足應用需求,擴展分區就是在主分區描述的空間中再建分區信息表。在四個主分區中,只能存在一個active的分區,該分區即為啟動分區。
由于巨磁阻效應的發現,磁盤的容量日益增大,DOS分區存在2TB上限的問題,不能滿足日益增長的大分區需求,因此,微軟推出了GPT(GUID Partition Table),該分區表的磁盤結構如下圖所示。
第一部分是保留MBR,占用一個扇區;第二部分是EFI信息,該部分占用一個扇區,該頭描述了分布區的位置信息;第三部分是 分區表,一共占用32個扇區,每個分區表項占用128字節,因此,最多可以容納128個分區表項;第四部分是分區區域;為了提高可靠性,第五部分為分區表備份區域,占用整個磁盤的最后32個扇區。
知道磁盤的分區信息之后,我們通常會關注操作系統的bootloader具體在哪里?以Linux為例,bootloader通常為grub,嵌入式系統通常采用uboot,這里以grub為例,grub功能比較強大。在安裝操作系統的時候,grub就被安裝在了boot分區。在Linux中的/boot目錄就包含了grub文件和操作系統p_w_picpath文件。
Grub是支持文件系統的,在/boot/grub目錄中存在e2fs_stage1_5、xfs_stage1_5等文件,這些文件統稱為stage1.5,其實就是各個不同文件系統的驅動。這里簡要介紹一下grub的構成。Grub的啟動文件分為stage1和stage2兩大部分,stage1是在grub安裝的時候由grub拷貝到MBR中的,由于MBR的大小是512字節,因此,stage1文件大小為512字節。Stage1的作用是引導stage2,由于stage2存儲在boot 上,其具有文件系統格式,而stage1程序不能很大,因此,無法識別boot分區文件系統,只能采用了程序表的方式在stage1中存儲stage2文件和stage1.5文件的位置。
對于grub而言,由于需要獲取stage2文件,所以,需要修改MBR中的引導程序,所以,在安裝操作系統的時候,grub被安裝在了boot分區和MBR中。
熟悉磁盤數據分布對系統啟動過程的了解有一定幫助,在此簡要描述一下系統啟動過程。
1, 系統上電之后,直接將BIOS程序導入內存進行運行,BIOS程序會掃描硬件,并且實現一些基本硬件的驅動(例如PCI掃描)和自檢操作。BIOS程序會掃描系統中的啟動硬盤,一旦發現一個可以啟動的硬盤,BIOS會將啟動硬盤內MBR中的引導程序裝載入內存,并且將CPU交給引導程序。
2, MBR中的引導程序會進行分區表檢查,由于該引導程序是grub安裝時更新過的,其實際就是grub的stage1程序。當所有事情完成之后,引導程序會通過固定地址的方式將啟動分區中的grub stage2程序裝載入內存,并且將CPU交給stage2程序。
3, Stage2程序是grub的主體,其可以識別文件系統。boot分區上有文件系統,這是由用戶在安裝操作系統時候格式化的,grub會將boot分區mount,這樣可以很容易的找到Linux操作系統的鏡像文件,在grub運行過程中,有些系統需要一些特殊的驅動,例如,系統根文件系統建立在一個特殊的軟RAID之上,那么在啟動Linux操作系統之前需要加載特殊的軟RAID驅動。為了達到這個目的,可以采用ramdisk的方式為Linux操作系統預加載驅動,ramdisk文件可以在grub配置文件中指定。Grub 完成一些預加載操作,并且將Linux內核加載入內存,然后將CPU資源釋放給Linux內核。
4, 此時Linux內核開始運行,由于grub已經預加載了一些驅動,因此,Linux也能看到一些特殊的設備,然后Linux會做root switch操作,掛載真正的根文件系統。如果BIOS已經為PCI等設備分配了資源,那么Linux可以直接采用,當然也可以對PCI總線進行重新掃描,并且加載驅動程序。由于根文件系統已經加載,因此,Linux可以根據/etc/inittab啟動各種服務,至此Linux系統基本啟動完畢。
本文概述了分區以及bootloader在磁盤中的數據分布,對于存儲系統而言,這是最基本的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。