「深度小課堂」說一說deepin操作系統(tǒng)的啟動(dòng)流程-創(chuàng)新互聯(lián)

deepin操作系統(tǒng)整個(gè)的啟動(dòng)流程到底是怎么樣子的?

創(chuàng)新互聯(lián)長(zhǎng)期為1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為隨州企業(yè)提供專業(yè)的網(wǎng)站制作、成都做網(wǎng)站,隨州網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

以前曾被同事纏問過類似的問題。遇到這種宏大而又不著邊際的問題,我的回復(fù)往往是“你還太嫩,現(xiàn)在我告訴你還是會(huì)忘掉的,等你干上個(gè)兩年,不用我說你就知道了”。我邊敲著鍵盤,邊佩服自己的聰明才智。

兩年后……

這個(gè)小伙子長(zhǎng)大了,并且堅(jiān)定地又問了同樣的問題。我一愣神,腦海中不停浮現(xiàn)出一個(gè)聲音“出來混,遲早是要還的”。

想想也罷,是時(shí)候該把壓箱底兒的貨拿出來了,畢竟自封了“半吊子系統(tǒng)工程師”的title(雖然我自封的title還有很多:半吊子客服、半吊子產(chǎn)品經(jīng)理、半吊子研發(fā)項(xiàng)目經(jīng)理等等),不給你們露兩手看看看來還真不行……

概覽

deepin系統(tǒng)啟動(dòng),從整體上看主要分為了 硬件上電、內(nèi)核引導(dǎo)、內(nèi)核啟動(dòng)、系統(tǒng)初始化、圖形界面等幾個(gè)階段。

如果將這幾個(gè)階段分為兩個(gè)部分,那么第一部分的硬件上電、內(nèi)核引導(dǎo)、內(nèi)核啟動(dòng)主要是“引導(dǎo)(boot)”,更偏向讓內(nèi)核可以啟動(dòng);而第二部分的系統(tǒng)初始化、圖形界面兩個(gè)階段主要的任務(wù)則是“初始化(initialize)”了,因?yàn)閷?duì)于一個(gè)系統(tǒng)來說僅僅有內(nèi)核跑起來是不行的,還要有各種各樣的服務(wù)對(duì)系統(tǒng)的軟硬件進(jìn)行管理,這也是平常大家說發(fā)行版跟純粹的GNU/Linux內(nèi)核不是一個(gè)概念的原因之一。

下面我從一個(gè)軟件開發(fā)者的角度說一下我對(duì)每個(gè)階段的理解以及一些調(diào)試的方法。

硬件上電

既然說了是軟件開發(fā)者的角度,這個(gè)部分對(duì)我來說基本上相當(dāng)于黑盒子了。但是大體上我們?nèi)匀恢肋@個(gè)部分主要是:

硬件上電

BIOS/UEFI

bootloader

當(dāng)你按下電源的那一刻起,電流就會(huì)“滋滋滋”的流向主板,啟動(dòng)BIOS(Basic Input Output System)系統(tǒng)。

BIOS系統(tǒng),顧名思義就是最直接跟硬件打交道的系統(tǒng),因?yàn)橛袠?biāo)準(zhǔn)規(guī)定,所以輸入輸出設(shè)備的基本功能都是可以使用的,一些硬件的開關(guān)配置也可以在BIOS中進(jìn)行操作。

除此之外,BIOS還有兩個(gè)重要的功能,一個(gè)是硬件自檢;另外一個(gè)是加載引導(dǎo)。硬件自檢這個(gè)跟作為一個(gè)”半吊子系統(tǒng)工程師“沒什么關(guān)系,自不多說。加載引導(dǎo)的過程其實(shí)就是大家耳熟能詳?shù)腗BR、小蝌蚪找媽…哦不…MBR中找bootloader了。

跟BIOS對(duì)應(yīng)的UEFI,要說它們之間的區(qū)別,除了加載引導(dǎo)的方式不大一樣以外。對(duì)我來說可能就是界面能夠用鼠標(biāo)點(diǎn)點(diǎn)點(diǎn)了吧,嗯……哈哈哈。

這里講個(gè)段子,之前15.7搞啟動(dòng)時(shí)間優(yōu)化的時(shí)候,測(cè)試的同學(xué)測(cè)試系統(tǒng)啟動(dòng)時(shí)間的優(yōu)化情況,老是說效果不理想,我去看看吧,原來是他們測(cè)試系統(tǒng)啟動(dòng)是從硬件啟動(dòng)算起的,我說你們直接從內(nèi)核引導(dǎo)開始計(jì)算,他還問我為什么。優(yōu)化時(shí)間/(BIOS時(shí)間+GRUB時(shí)間+內(nèi)核時(shí)間+圖形時(shí)間) 跟 優(yōu)化時(shí)間/(內(nèi)核時(shí)間+圖形時(shí)間)哪個(gè)大哪個(gè)???我只能說這個(gè)測(cè)試同學(xué)的數(shù)學(xué)不大好……

內(nèi)核引導(dǎo)

BIOS在MBR中(或者UEFI在主板專有的存儲(chǔ)設(shè)備中)找到bootloader并加載后,bootloader就會(huì)開始加載Linux內(nèi)核并啟動(dòng)了。

GRUB引導(dǎo)

deepin系統(tǒng)默認(rèn)的bootloader是GRUB(GRand Unified Bootloader)。其實(shí)我一直覺得這個(gè)名字挺惡心的,大神們果然都是重口味……GRUB并不需要按照什么規(guī)則去硬盤中找系統(tǒng),而是根據(jù)/boot/grub/grub.cfg中的啟動(dòng)項(xiàng)加載內(nèi)核、啟動(dòng)系統(tǒng),而這個(gè)配置文件則是在系統(tǒng)安裝或者手動(dòng)執(zhí)行update-grub這個(gè)命令的時(shí)候生成和更新。

update-grub這個(gè)命令其實(shí)是對(duì)grub-mkconfig的一個(gè)包裝,在非Debian系的發(fā)行版上是沒有的。grub-mkconfig會(huì)執(zhí)行的動(dòng)作主要是:

1.加載/etc/default/grub中的一些配置項(xiàng)。比如GRUB_CMDLINE_LINUX_DEFAULT配置項(xiàng)會(huì)控制Linux的boot param。

2.挨個(gè)執(zhí)行/etc/grub.d/目錄中的腳本,用來生成最終的grub.cfg文件。比如我們平??吹絬pdate-grub命令執(zhí)行時(shí)輸出的哪些啟動(dòng)項(xiàng),其實(shí)就是/etc/grub.d/03_os-prober這個(gè)腳本里面執(zhí)行os-prober這個(gè)工具產(chǎn)生的。

在GRUB界面選擇啟動(dòng)項(xiàng),按e編輯啟動(dòng)項(xiàng)。除了普通的上下左右鍵移動(dòng)光標(biāo),還可以使用基本的Emacs快捷鍵:

Ctrl+N 下一行

Ctrl+P 上一行

Ctrl+B 左移一個(gè)字符

Ctrl+F 右移一個(gè)字符

Ctrl+A 移動(dòng)光標(biāo)到行首

Ctrl+E 移動(dòng)光標(biāo)到行尾

編輯完成后按Ctrl+X按照編輯后的結(jié)果啟動(dòng)系統(tǒng),但是編輯的結(jié)果不會(huì)保存,也就是說如果需要永久修改某個(gè)啟動(dòng)項(xiàng),就要修改grub.cfg文件或者會(huì)影響grub.cfg生成的/etc/default/grub以及/etc/grub.d/中的腳本文件了。

對(duì)于GRUB,我們一般需要知道的就這么多,關(guān)于GRUB其他一些用法和知識(shí),可以參考GRUB與系統(tǒng)引導(dǎo)(https://blog.nanpuyue.com/2017/037.html)這篇文章。

UEFI直接引導(dǎo)

在UEFI模式下,除了使用GRUB來引導(dǎo)內(nèi)核以外,還可以通過UEFI直接引導(dǎo)內(nèi)核(需要內(nèi)核開啟了EFI Stub支持),具體的配置方式見Debian Wiki EFI Stub(https://wiki.debian.org/EFIStub)。需要注意的一點(diǎn)是在使用efibootmgr創(chuàng)建啟動(dòng)項(xiàng)的時(shí)候,可能需要-d參數(shù)指定設(shè)備,否則可能會(huì)導(dǎo)致創(chuàng)建啟動(dòng)項(xiàng)失敗。

內(nèi)核啟動(dòng)

內(nèi)核啟動(dòng)部分其實(shí)主要是想說initrd。initrd是一個(gè)小型的rootfs,這個(gè)rootfs保證了內(nèi)核啟動(dòng)過程中所需要的內(nèi)核模塊和用戶態(tài)工具。同時(shí),它還需要為下一個(gè)階段“系統(tǒng)初始化”做準(zhǔn)備,也就是為init程序準(zhǔn)備好真正的文件系統(tǒng),并且啟動(dòng)init程序。內(nèi)核使用initrd啟動(dòng)的過程主要是:

1.執(zhí)行init腳本(這個(gè)不是上面說得init程序,而是生成好的initramfs中的/init這個(gè)文件。后面的步驟其實(shí)都發(fā)生在這個(gè)腳本的執(zhí)行過程中);

2.解析內(nèi)核啟動(dòng)參數(shù),識(shí)別關(guān)鍵的如debug、boot、break等;

3.執(zhí)行/scripts/init-top/中的腳本;

4.加載內(nèi)核模塊;

5.執(zhí)行/scripts/init-premount/中的腳本;

6.執(zhí)行/scripts/$BOOT腳本中的mountroot函數(shù),其中的$BOOT參數(shù)就是第2步中識(shí)別到的boot參數(shù)指定的,自帶的可選項(xiàng)有l(wèi)ocal(本地啟動(dòng),默認(rèn))、nfs(比如PXE啟動(dòng));

7.執(zhí)行/scripts/init-bottom/中的腳本;

8.執(zhí)行init程序。

live系統(tǒng)

上面第6步提到initramfs-tools包自帶有兩種boot類型:local和nfs,我們使用live系統(tǒng)的時(shí)候的boot類型其實(shí)live。這個(gè)boot類型主要是live-boot這個(gè)包支撐起來的。

在啟動(dòng)live系統(tǒng)的時(shí)候,/scripts/live中的mountroot會(huì)調(diào)用/lib/live/boot/目錄中的腳本設(shè)置根文件系統(tǒng),包括掛在ISO和設(shè)置overlay等。

調(diào)試

initrd啟動(dòng)階段支持幾個(gè)特殊的啟動(dòng)參數(shù)輔助調(diào)試:

1.debug 會(huì)開啟initrd啟動(dòng)腳本中的調(diào)試模式;

2.break 可以講啟動(dòng)停止在某個(gè)階段,例如break=premount就會(huì)在真正的根文件系統(tǒng)掛載前停掉啟動(dòng)流程,并給你一個(gè)busybox環(huán)境;可選break的階段可以在/scripts/init腳本中看到,就是哪些使用maybe_break的行。

系統(tǒng)初始化

從這個(gè)階段開始,啟動(dòng)流程就算是進(jìn)入我們真實(shí)的的系統(tǒng)中了,init程序會(huì)啟動(dòng)各種服務(wù)對(duì)系統(tǒng)進(jìn)行配置,保證軟硬件環(huán)境可以正常使用。

deepin系統(tǒng)下默認(rèn)的init程序是systemd,這個(gè)龐然大物太過復(fù)雜,或許將來開個(gè)坑寫一個(gè)系列才能說好……這里只簡(jiǎn)單說明一下跟系統(tǒng)啟動(dòng)流程相關(guān)的內(nèi)容。一個(gè)是 man bootup中的一個(gè)圖:

「深度小課堂」說一說deepin操作系統(tǒng)的啟動(dòng)流程

當(dāng)前文章:「深度小課堂」說一說deepin操作系統(tǒng)的啟動(dòng)流程-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://bm7419.com/article26/cecjjg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、企業(yè)網(wǎng)站制作商城網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站排名、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化