寫在前面
作為一個理工科的你,我相信你一定給自己或者給別人裝過windows操作系統,作為windows操作系統都圖形化了,因此我們可能很難去了解中間都發生了什么。比如使用U盤安裝的時候,網上一大堆某某某U盤制作系統工具,按照網上的教程,制作完成以后,就可以在要裝系統的電腦上點擊電源鍵狂按F12(不同的電腦可能不同)進入BIOS設置了,然后就等著使用了。作為學習另一個使用命令行的操作系統,我們有必要了解一下它的啟動工作流程。
細說流程
Linux系統的啟動流程主要分為以下幾個主要步驟,POST –> BootSequence(BIOS) –> BootLoader(MBR)–> Kernel(ramdisk、ramfs)–> rootfs(readonly)–> /sbin/init。
- POST
按下主機電源鍵,主機會首先加載BIOS信息,主要負責檢測系統外圍關鍵設備(如:CPU、內存、顯卡、I/O、鍵盤鼠標等)是否正常。如果硬件設備因為各自原因自檢沒有通過,則不會進行下一步啟動,如果硬件設備沒有問題,則轉交給下一步執行啟動。
- BootSequence
按次序查找BIOS中各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備。
- BootLoader
BootLoader稱為引導加載器,位于磁盤中的MBR中,每個磁盤都有一個MBR,MBR是磁盤上的第一個扇區又叫做主引導扇區,是主機開機后訪問磁盤時首先要讀取的扇區,MBR扇區共有512個字節,其中的446個字節即存放bootloader,64個字節存放分區表,剩余的2字節存放校驗信息。
在Linux中,BootLoader的具體實現是由grub程序實現的。grub分為三個階段,第一個階段存放于MBR中,第二個階段也稱為stage1.5階段,存放于MBR之后的扇區,主要為第三階段提供文件系統驅動。第三階段也稱為stage2階段,存放于一個基本的磁盤分區上,主要是提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到RAM(內存)中特點空間中,解壓、展開,而后把整個系統控制權移交給內核,即完成把內核加載到內存空間中。
grub也有自己的配置文件/boot/grub/grub.conf,啟動菜單就是通過讀取此文件進行信息顯示,文件大體如下圖所示:
其中各配置參數:
- default=#: 設定默認啟動的菜單項順序;菜單項(title)編號從0開始;
- timeout=#:指定菜單項等待選項選擇的超時時長;
- splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
- hiddenmenu:隱藏菜單;
- title TITLE:定義菜單項“標題”, 可出現多次;
- root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”;
- kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核;
- initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
此外還能對grub菜單及內核啟動進行認證處理,在上面配置文件中加入password [–md5] STRING項即可,加在title之前表示需要對編輯菜單進行認證,加在title之后表示對內核進行認證,需要認證以后才能啟動內核。
grub還有自己的命令行接口,啟動系統時,敲擊任意鍵進入grub命令行接口模式,在grub界面可以按照提示輸入e、b、c進行相應的編輯,在對應的title輸入c即可進入命令行模式,有如下常用選項:
- help:獲取幫助信息;
- find :文件查找,通常用于定位文件,find(hd#,#);
- root (hd#,#):把哪一個磁盤分區設置為根;
- kernel:設定本次啟動時用到的內核文件;
- initrd:設定為選定的內核提供額外文件的ramdisk;
所以也可以通過手動指定來啟動內核,在grub界面通過上述介紹的參數,依次輸入:
- root (hd#,#);
- kernel /vmlinuz-VERSION-RELEASE ?ro ?root=/dev/DEVICE;
- initrd /initramfs-VERSION-RELEASE.img;
- boot;
來通過讀取新指定的各參數啟動內核。
- Kernel
在kernal階段,主要是通過前面步驟加載到的內核完成自身的初始化:
- 探測可識別到的所有硬件設備;
- 加載硬件驅動程序(有可能會借助于ramdisk加載驅動);
- 以只讀方式掛載根文件系統;
- 運行用戶空間的第一個應用程序:/sbin/init
- rootfs
根切換,因為在內核加載階段,系統有可能會借助ramdisk提供的一個簡化版的根文件系統來提供驅動,完成后續步驟后ramdisk會加載真正的根文件系統,并把控制權移交給真正的根文件系統。
- /sbin/init
內核被加載后,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,設定Linux的運行級別并依據此來進行后續的初始化工作。
寫在最后
今天的分享就到這里了,里面涉及到了Linux啟動的一些基本流程,還特別提到了grub的兩種實現方式,通過配置文件新增內核信息方式和grub命令行接口方式進行配置,如果我們熟知了Linux系統啟動每步驟都需要什么文件,完成什么內容以后,我覺得配置都是很輕松的事情。實在沒轍的話,不妨試試強大的搜索引擎,這也是學習的很好方法。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/91102