linux 启动流程与文件系统管理
啟動(dòng)流程與主要啟動(dòng)記錄區(qū)(MBR)
CMOS 與 BIOS
- CMOS是記錄各項(xiàng)硬件參數(shù)且嵌入在主板上面的儲(chǔ)存器
- BIOS則是一個(gè)寫入到主板上的一個(gè)韌體(再次說(shuō)明, 韌體就是寫入到硬件上的一個(gè)軟件程序).這個(gè)BIOS就是在啟動(dòng)的時(shí)候,計(jì)算機(jī)系統(tǒng)會(huì)主動(dòng)運(yùn)行的第一個(gè)程序了!
整個(gè)啟動(dòng)流程到操作系統(tǒng)之前的動(dòng)作應(yīng)該是這樣的:
由上面的說(shuō)明我們會(huì)知道,BIOS與MBR都是硬件本身會(huì)支持的功能,至於Boot loader則是操作系統(tǒng)安裝在MBR上面的一套軟件了.由於MBR僅有446 bytes而已,因此這個(gè)啟動(dòng)管理程序是非常小而美的. 這個(gè)boot loader的主要任務(wù)有底下這些項(xiàng)目:
- 提供菜單:使用者可以選擇不同的啟動(dòng)項(xiàng)目,這也是多重啟動(dòng)的重要功能!
- 加載核心文件:直接指向可啟動(dòng)的程序區(qū)段來(lái)開(kāi)始操作系統(tǒng);
- 轉(zhuǎn)交其他loader:將啟動(dòng)管理功能轉(zhuǎn)交給其他loader負(fù)責(zé).
并且啟動(dòng)管理程序除了可以安裝在MBR之外, 還可以安裝在每個(gè)分割槽的啟動(dòng)磁區(qū)(boot sector)
我們舉一個(gè)例子來(lái)說(shuō),假設(shè)你的個(gè)人計(jì)算機(jī)只有一個(gè)硬盤,里面切成四個(gè)分割槽,其中第一、二分割槽分別安裝了Windows及Linux, 你要如何在啟動(dòng)的時(shí)候選擇用Windows還是Linux啟動(dòng)呢?假設(shè)MBR內(nèi)安裝的是可同時(shí)認(rèn)識(shí)Windows/Linux操作系統(tǒng)的啟動(dòng)管理程序, 那么整個(gè)流程可以圖示如下:
在上圖中我們可以發(fā)現(xiàn),MBR的啟動(dòng)管理程序提供兩個(gè)菜單,菜單一(M1)可以直接加載Windows的核心文件來(lái)啟動(dòng); 菜單二(M2)則是將啟動(dòng)管理工作交給第二個(gè)分割槽的啟動(dòng)磁區(qū)(boot sector).當(dāng)使用者在啟動(dòng)的時(shí)候選擇菜單二時(shí), 那么整個(gè)啟動(dòng)管理工作就會(huì)交給第二分割槽的啟動(dòng)管理程序了. 當(dāng)?shù)诙€(gè)啟動(dòng)管理程序啟動(dòng)后,該啟動(dòng)管理程序內(nèi)(上圖中)僅有一個(gè)啟動(dòng)菜單,因此就能夠使用Linux的核心文件來(lái)啟動(dòng)羅. 這就是多重啟動(dòng)的工作情況啦!我們將上圖作個(gè)總結(jié):
- 每個(gè)分割槽都擁有自己的啟動(dòng)磁區(qū)(boot sector)
- 圖中的系統(tǒng)槽為第一及第二分割槽,
- 實(shí)際可啟動(dòng)的核心文件是放置到各分割槽內(nèi)的!
- loader只會(huì)認(rèn)識(shí)自己的系統(tǒng)槽內(nèi)的可啟動(dòng)核心文件,以及其他loader而已;
- loader可直接指向或者是間接將管理權(quán)轉(zhuǎn)交給另一個(gè)管理程序.
那現(xiàn)在請(qǐng)你想一想,為什么人家常常說(shuō):『如果要安裝多重啟動(dòng), 最好先安裝Windows再安裝Linux』呢?這是因?yàn)?#xff1a;
- Linux在安裝的時(shí)候,你可以選擇將啟動(dòng)管理程序安裝在MBR或各別分割槽的啟動(dòng)磁區(qū), 而且Linux的loader可以手動(dòng)配置菜單(就是上圖的M1, M2...),所以你可以在Linux的boot loader里面加入Windows啟動(dòng)的選項(xiàng);
- Windows在安裝的時(shí)候,他的安裝程序會(huì)主動(dòng)的覆蓋掉MBR以及自己所在分割槽的啟動(dòng)磁區(qū),你沒(méi)有選擇的機(jī)會(huì), 而且他沒(méi)有讓我們自己選擇菜單的功能.
因此,如果先安裝Linux再安裝Windows的話,那MBR的啟動(dòng)管理程序就只會(huì)有Windows的項(xiàng)目,而不會(huì)有Linux的項(xiàng)目 (因?yàn)樵驹贛BR內(nèi)的Linux的啟動(dòng)管理程序就會(huì)被覆蓋掉). 那需要重新安裝Linux一次嗎?當(dāng)然不需要,你只要用盡各種方法來(lái)處理MBR的內(nèi)容即可. 例如利用全中文的spfdisk(http://spfdisk.sourceforge.net/)軟件來(lái)安裝認(rèn)識(shí)Windows/Linux的管理程序, 也能夠利用Linux的救援模式來(lái)挽救MBR即可.
文件系統(tǒng)
superblock,inode,block
superblock,inode,block數(shù)據(jù)簡(jiǎn)略說(shuō)明:
- superblock:記錄此 filesystem 的整體信息,包括inode/block的總量、使用量、剩余量, 以及文件系統(tǒng)的格式與相關(guān)信息等;
- inode:記錄文件的權(quán)限與屬性,一個(gè)文件占用一個(gè)inode,同時(shí)記錄此文件的數(shù)據(jù)所在的 block 號(hào)碼;
- block:實(shí)際記錄文件的內(nèi)容,若文件太大時(shí),會(huì)占用多個(gè) block .
每個(gè) inode 與 block 都有編號(hào),而每個(gè)文件都會(huì)占用一個(gè) inode ,inode 內(nèi)則有文件數(shù)據(jù)放置的 block 號(hào)碼.所以如果能夠找到文件的 inode 的話,那么自然就會(huì)知道這個(gè)文件所放置數(shù)據(jù)的 block 號(hào)碼, 當(dāng)然也就能夠讀出該文件的實(shí)際數(shù)據(jù)了.
data block (數(shù)據(jù)區(qū)塊)
block 基本限制:
- 原則上,block 的大小與數(shù)量在格式化完就不能夠再改變了(除非重新格式化)
- 每個(gè) block 內(nèi)最多只能夠放置一個(gè)文件的數(shù)據(jù)
- 若文件大于 block 的大小,則一個(gè)文件會(huì)占用多個(gè) block 數(shù)量
- 若文件小于 block ,則該 block 的剩余容量就不能夠再被使用了(磁盤空間會(huì)浪費(fèi))
- 在 Ext2 文件系統(tǒng)中所支持的 block 大小有 1K, 2K 及 4K 三種而已
| Block 大小 | 1KB | 2KB | 4KB |
| 最大單一文件限制 | 16GB | 256GB | 2TB |
| 最大文件系統(tǒng)總?cè)萘?/span> | 2TB | 8TB | 16TB |
inode table (inode 表格)
inode 數(shù)據(jù)內(nèi)容:
- 該文件的存取模式(read/write/excute)
- 該文件的擁有者與群組(owner/group)
- 該文件的容量
- 該文件創(chuàng)建或狀態(tài)改變的時(shí)間(ctime)
- 最近一次的讀取時(shí)間(atime)
- 最近修改的時(shí)間(mtime)
- 定義文件特性的旗標(biāo)(flag),如 SetUID...
- 該文件真正內(nèi)容的指向 (pointer)
inode 的特色點(diǎn):
- 每個(gè) inode 大小均固定為 128 bytes
- 每個(gè)文件都僅會(huì)占用一個(gè) inode 而已
- 承上,因此文件系統(tǒng)能夠創(chuàng)建的文件數(shù)量與 inode 的數(shù)量有關(guān)
- 系統(tǒng)讀取文件時(shí)需要先找到 inode,并分析 inode 所記錄的權(quán)限與用戶是否符合,若符合才能夠開(kāi)始實(shí)際讀取 block 的內(nèi)容
系統(tǒng)將 inode 記錄 block 號(hào)碼的區(qū)域定義為12個(gè)直接,一個(gè)間接, 一個(gè)雙間接與一個(gè)三間接記錄區(qū),如下圖所示:
- 12 個(gè)直接指向: 12*1K=12K
- 間接: 256*1K=256K
- 雙間接: 256*256*1K=2562K=64M
- 三間接: 256*256*256*1K=16777216K=16384M=16G
Superblock (超級(jí)區(qū)塊)
Superblock 是記錄整個(gè) filesystem 相關(guān)信息的地方, 沒(méi)有 Superblock ,就沒(méi)有這個(gè) filesystem 了.
記錄的信息主要有:
- block 與 inode 的總量
- 未使用與已使用的 inode / block 數(shù)量
- block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 bytes)
- filesystem 的掛載時(shí)間、最近一次寫入數(shù)據(jù)的時(shí)間、最近一次檢驗(yàn)磁盤 (fsck) 的時(shí)間等文件系統(tǒng)的相關(guān)信息
- 一個(gè) valid bit 數(shù)值,若此文件系統(tǒng)已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1
block bitmap (區(qū)塊對(duì)照表)
block bitmap 記錄使用與未使用的 block 號(hào)碼,并在進(jìn)行文件添加修改時(shí)候?qū)?yīng)的修改 block 的使用狀況
inode bitmap (inode 對(duì)照表)
inode bitmap 記錄使用與未使用的 inode 號(hào)碼,并在進(jìn)行文件添加修改時(shí)候?qū)?yīng)的修改 inode 的使用狀況
boot sector 與 superblock 的關(guān)系
block 為 1024 bytes (1K) 時(shí):
如果 block 大小剛好是 1024 的話,那么 boot sector 與 superblock 各會(huì)占用掉一個(gè) block , 所以整個(gè)文件系統(tǒng)圖示就會(huì)如同圖 1.3.1 所顯示的那樣,boot sector 是獨(dú)立于 superblock 外面的!
如果 block 大于 1024 的話:
那么 superblock 將會(huì)在 0 號(hào),在第一個(gè) block 內(nèi) superblock 僅占有 1024-2047 ( 由 0 號(hào)起算的話)之間的咚咚,至于 2048bytes 以后的空間就真的是保留啦!而 0-1023 就保留給 boot sector 來(lái)使用
索引式文件系統(tǒng)(indexed allocation)
在索引式文件系統(tǒng)(indexed allocation)中將 inode 與 block 區(qū)塊用圖解來(lái)說(shuō)明一下,如下圖所示,文件系統(tǒng)先格式化出 inode 與 block 的區(qū)塊,假設(shè)某一個(gè)文件的屬性與權(quán)限數(shù)據(jù)是放置到 inode 4 號(hào)(下圖較小方格內(nèi)),而 這個(gè) inode 記錄了文件數(shù)據(jù)的實(shí)際放置點(diǎn)為 2, 7, 13, 15 這四個(gè) block 號(hào)碼,此時(shí)我們的操作系統(tǒng)就能夠據(jù)此來(lái)排列磁盤的閱讀順序,可以一口氣將四個(gè) block 內(nèi)容讀出來(lái)! 那么數(shù)據(jù)的讀取就如同下圖中的箭頭所指定的模樣了.
FAT 格式
閃盤使用的文件系統(tǒng)一般為 FAT 格式.FAT 這種格式的文件系統(tǒng)并沒(méi)有 inode 存在,所以 FAT 沒(méi)有辦法將這個(gè)文件的所有 block 在一開(kāi)始就讀取出來(lái).每個(gè) block 號(hào)碼都記錄在前一個(gè)?
block 當(dāng)中, 他的讀取方式有點(diǎn)像底下這樣:
上圖中我們假設(shè)文件的數(shù)據(jù)依序?qū)懭?->7->4->15號(hào)這四個(gè) block 號(hào)碼中, 但這個(gè)文件系統(tǒng)沒(méi)有辦法一口氣就知道四個(gè) block 的號(hào)碼,他得要一個(gè)一個(gè)的將 block 讀出后,才會(huì)知道下一個(gè)?
block 在何處. 如果同一個(gè)文件數(shù)據(jù)寫入的 block 分散的太過(guò)厲害時(shí),則我們的磁盤讀取頭將無(wú)法在磁盤轉(zhuǎn)一圈就讀到所有的數(shù)據(jù), 因此磁盤就會(huì)多轉(zhuǎn)好幾圈才能完整的讀取到這個(gè)文件的?
內(nèi)容!此時(shí)文件讀取的效能將會(huì)變的很差所致. 這個(gè)時(shí)候可以透過(guò)碎片整理將同一個(gè)文件所屬的 blocks 匯整在一起.
Ext2 文件系統(tǒng)
件系統(tǒng)一開(kāi)始就將 inode 與 block 規(guī)劃好了,除非重新格式化(或者利用 resize2fs 等命令變更文件系統(tǒng)大小),否則 inode 與 block 固定后就不再變動(dòng)
Ext2 文件系統(tǒng)在格式化的時(shí)候基本上是區(qū)分為多個(gè)區(qū)塊群組 (block group) 的,每個(gè)區(qū)塊群組都有獨(dú)立的 inode/block/superblock 系統(tǒng),整個(gè)來(lái)說(shuō),Ext2 格式化后有點(diǎn)像底下這樣:
文件系統(tǒng)最前面有一個(gè)啟動(dòng)扇區(qū)(boot sector),這個(gè)啟動(dòng)扇區(qū)可以安裝啟動(dòng)管理程序,如此一來(lái)我們就能夠?qū)⒉煌膯?dòng)管理程序安裝到個(gè)別的文件系統(tǒng)最前端,而不用覆蓋整顆硬盤唯一的?
MBR, 這樣也才能夠制作出多重引導(dǎo)的環(huán)境!
目錄
在 Linux 下的 ext2 文件系統(tǒng)創(chuàng)建一個(gè)目錄時(shí), ext2 會(huì)分配一個(gè) inode 與至少一塊 block 給該目錄.
inode 記錄該目錄的相關(guān)權(quán)限與屬性,并可記錄分配到的那塊 block 號(hào)碼
block 則是記錄在這個(gè)目錄下的文件名與該文件名占用的 inode 號(hào)碼數(shù)據(jù).如下圖所示:
文件
在 Linux 下的 ext2 創(chuàng)建一個(gè)一般文件時(shí), ext2 會(huì)分配一個(gè) inode 與相對(duì)于該文件大小的 block 數(shù)量給該文件
目錄樹(shù)讀取
由于目錄樹(shù)是由根目錄開(kāi)始讀起,因此系統(tǒng)透過(guò)掛載的信息可以找到掛載點(diǎn)的 inode 號(hào)碼(通常一個(gè) filesystem 的最頂層 inode 號(hào)碼會(huì)由 2 號(hào)開(kāi)始喔!),此時(shí)就能夠得到根目錄的 inode 內(nèi)容,并依據(jù)該 inode 讀取根目錄的 block 內(nèi)的文件名數(shù)據(jù),再一層一層的往下讀到正確的檔名.舉例來(lái)說(shuō),如果我想要讀取 /etc/passwd 這個(gè)文件時(shí),系統(tǒng)是如何讀取的呢?
[root@www ~]# ll -di / /etc /etc/passwd2 drwxr-xr-x 23 root root 4096 Sep 22 12:09 /
1912545 drwxr-xr-x 105 root root 12288 Oct 14 04:02 /etc
1914888 -rw-r--r-- 1 root root 1945 Sep 29 02:21 /etc/passwd
在鳥(niǎo)哥的系統(tǒng)上面與 /etc/passwd 有關(guān)的目錄與文件數(shù)據(jù)如上表所示,該文件的讀取流程為(假設(shè)讀取者身份為 vbird 這個(gè)一般身份使用者):
透過(guò)掛載點(diǎn)的信息找到 /dev/hdc2 的 inode 號(hào)碼為 2 的根目錄 inode,且 inode 規(guī)范的權(quán)限讓我們可以讀取該 block 的內(nèi)容(有 r 與 x) ;
經(jīng)過(guò)上個(gè)步驟取得 block 的號(hào)碼,并找到該內(nèi)容有 etc/ 目錄的 inode 號(hào)碼 (1912545);
讀取 1912545 號(hào) inode 得知 vbird 具有 r 與 x 的權(quán)限,因此可以讀取 etc/ 的 block 內(nèi)容;
經(jīng)過(guò)上個(gè)步驟取得 block 號(hào)碼,并找到該內(nèi)容有 passwd 文件的 inode 號(hào)碼 (1914888);
>讀取 1914888 號(hào) inode 得知 vbird 具有 r 的權(quán)限,因此可以讀取 passwd 的 block 內(nèi)容;
最后將該 block 內(nèi)容的數(shù)據(jù)讀出來(lái).
總結(jié)
以上是生活随笔為你收集整理的linux 启动流程与文件系统管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 天气预报今天几点下雨_天气预报今天几点下
- 下一篇: SSH协议及免密码登录