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

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

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

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

兩年后……

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

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

概覽

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

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

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

硬件上電

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

硬件上電

BIOS/UEFI

bootloader

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

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

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

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

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

內(nèi)核引導

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

GRUB引導

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

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

1.加載/etc/default/grub中的一些配置項。比如GRUB_CMDLINE_LINUX_DEFAULT配置項會控制Linux的boot param。

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

在GRUB界面選擇啟動項,按e編輯啟動項。除了普通的上下左右鍵移動光標,還可以使用基本的Emacs快捷鍵:

Ctrl+N 下一行

Ctrl+P 上一行

Ctrl+B 左移一個字符

Ctrl+F 右移一個字符

Ctrl+A 移動光標到行首

Ctrl+E 移動光標到行尾

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

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

UEFI直接引導

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

內(nèi)核啟動

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

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

2.解析內(nèi)核啟動參數(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步中識別到的boot參數(shù)指定的,自帶的可選項有l(wèi)ocal(本地啟動,默認)、nfs(比如PXE啟動);

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

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

live系統(tǒng)

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

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

調(diào)試

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

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

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

系統(tǒng)初始化

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

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

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

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

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

廣告

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

搜索引擎優(yōu)化