您好,登錄后才能下訂單哦!
deepin操作系統(tǒng)整個的啟動流程到底是怎么樣子的?
以前曾被同事纏問過類似的問題。遇到這種宏大而又不著邊際的問題,我的回復(fù)往往是“你還太嫩,現(xiàn)在我告訴你還是會忘掉的,等你干上個兩年,不用我說你就知道了”。我邊敲著鍵盤,邊佩服自己的聰明才智。
兩年后……
這個小伙子長大了,并且堅定地又問了同樣的問題。我一愣神,腦海中不停浮現(xiàn)出一個聲音“出來混,遲早是要還的”。
想想也罷,是時候該把壓箱底兒的貨拿出來了,畢竟自封了“半吊子系統(tǒng)工程師”的title(雖然我自封的title還有很多:半吊子客服、半吊子產(chǎn)品經(jīng)理、半吊子研發(fā)項目經(jīng)理等等),不給你們露兩手看看看來還真不行……
deepin系統(tǒng)啟動,從整體上看主要分為了 硬件上電、內(nèi)核引導(dǎo)、內(nèi)核啟動、系統(tǒng)初始化、圖形界面等幾個階段。
如果將這幾個階段分為兩個部分,那么第一部分的硬件上電、內(nèi)核引導(dǎo)、內(nèi)核啟動主要是“引導(dǎo)(boot)”,更偏向讓內(nèi)核可以啟動;而第二部分的系統(tǒng)初始化、圖形界面兩個階段主要的任務(wù)則是“初始化(initialize)”了,因為對于一個系統(tǒng)來說僅僅有內(nèi)核跑起來是不行的,還要有各種各樣的服務(wù)對系統(tǒng)的軟硬件進(jìn)行管理,這也是平常大家說發(fā)行版跟純粹的GNU/Linux內(nèi)核不是一個概念的原因之一。
下面我從一個軟件開發(fā)者的角度說一下我對每個階段的理解以及一些調(diào)試的方法。
既然說了是軟件開發(fā)者的角度,這個部分對我來說基本上相當(dāng)于黑盒子了。但是大體上我們?nèi)匀恢肋@個部分主要是:
硬件上電
BIOS/UEFI
bootloader
當(dāng)你按下電源的那一刻起,電流就會“滋滋滋”的流向主板,啟動BIOS(Basic Input Output System)系統(tǒng)。
BIOS系統(tǒng),顧名思義就是最直接跟硬件打交道的系統(tǒng),因為有標(biāo)準(zhǔn)規(guī)定,所以輸入輸出設(shè)備的基本功能都是可以使用的,一些硬件的開關(guān)配置也可以在BIOS中進(jìn)行操作。
除此之外,BIOS還有兩個重要的功能,一個是硬件自檢;另外一個是加載引導(dǎo)。硬件自檢這個跟作為一個”半吊子系統(tǒng)工程師“沒什么關(guān)系,自不多說。加載引導(dǎo)的過程其實就是大家耳熟能詳?shù)腗BR、小蝌蚪找媽…哦不…MBR中找bootloader了。
跟BIOS對應(yīng)的UEFI,要說它們之間的區(qū)別,除了加載引導(dǎo)的方式不大一樣以外。對我來說可能就是界面能夠用鼠標(biāo)點點點了吧,嗯……哈哈哈。
這里講個段子,之前15.7搞啟動時間優(yōu)化的時候,測試的同學(xué)測試系統(tǒng)啟動時間的優(yōu)化情況,老是說效果不理想,我去看看吧,原來是他們測試系統(tǒng)啟動是從硬件啟動算起的,我說你們直接從內(nèi)核引導(dǎo)開始計算,他還問我為什么。優(yōu)化時間/(BIOS時間+GRUB時間+內(nèi)核時間+圖形時間) 跟 優(yōu)化時間/(內(nèi)核時間+圖形時間)哪個大哪個?。课抑荒苷f這個測試同學(xué)的數(shù)學(xué)不大好……
BIOS在MBR中(或者UEFI在主板專有的存儲設(shè)備中)找到bootloader并加載后,bootloader就會開始加載Linux內(nèi)核并啟動了。
deepin系統(tǒng)默認(rèn)的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編輯啟動項。除了普通的上下左右鍵移動光標(biāo),還可以使用基本的Emacs快捷鍵:
Ctrl+N 下一行
Ctrl+P 上一行
Ctrl+B 左移一個字符
Ctrl+F 右移一個字符
Ctrl+A 移動光標(biāo)到行首
Ctrl+E 移動光標(biāo)到行尾
編輯完成后按Ctrl+X按照編輯后的結(jié)果啟動系統(tǒng),但是編輯的結(jié)果不會保存,也就是說如果需要永久修改某個啟動項,就要修改grub.cfg文件或者會影響grub.cfg生成的/etc/default/grub以及/etc/grub.d/中的腳本文件了。
對于GRUB,我們一般需要知道的就這么多,關(guān)于GRUB其他一些用法和知識,可以參考GRUB與系統(tǒng)引導(dǎo)(https://blog.nanpuyue.com/2017/037.html)這篇文章。
在UEFI模式下,除了使用GRUB來引導(dǎo)內(nèi)核以外,還可以通過UEFI直接引導(dǎo)內(nèi)核(需要內(nèi)核開啟了EFI Stub支持),具體的配置方式見Debian Wiki EFI Stub(https://wiki.debian.org/EFIStub)。需要注意的一點是在使用efibootmgr創(chuàng)建啟動項的時候,可能需要-d參數(shù)指定設(shè)備,否則可能會導(dǎo)致創(chuàng)建啟動項失敗。
內(nèi)核啟動部分其實主要是想說initrd。initrd是一個小型的rootfs,這個rootfs保證了內(nèi)核啟動過程中所需要的內(nèi)核模塊和用戶態(tài)工具。同時,它還需要為下一個階段“系統(tǒng)初始化”做準(zhǔn)備,也就是為init程序準(zhǔn)備好真正的文件系統(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(本地啟動,默認(rèn))、nfs(比如PXE啟動);
7.執(zhí)行/scripts/init-bottom/中的腳本;
8.執(zhí)行init程序。
上面第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等。
initrd啟動階段支持幾個特殊的啟動參數(shù)輔助調(diào)試:
1.debug 會開啟initrd啟動腳本中的調(diào)試模式;
2.break 可以講啟動停止在某個階段,例如break=premount就會在真正的根文件系統(tǒng)掛載前停掉啟動流程,并給你一個busybox環(huán)境;可選break的階段可以在/scripts/init腳本中看到,就是哪些使用maybe_break的行。
從這個階段開始,啟動流程就算是進(jìn)入我們真實的的系統(tǒng)中了,init程序會啟動各種服務(wù)對系統(tǒng)進(jìn)行配置,保證軟硬件環(huán)境可以正常使用。
deepin系統(tǒng)下默認(rèn)的init程序是systemd,這個龐然大物太過復(fù)雜,或許將來開個坑寫一個系列才能說好……這里只簡單說明一下跟系統(tǒng)啟動流程相關(guān)的內(nèi)容。一個是 man bootup中的一個圖:
基本涵蓋了由systemd接管系統(tǒng)以后,systemd所管理的服務(wù)之間的一個依賴和基本先后順序。
另外一個是systemd-analyze命令,通過systemd-analyze plog > bootup.svg可以更加直觀的看到systemd各個服務(wù)在啟動過程中啟動的時間和所存在的時間。
圖形界面階段是系統(tǒng)到達(dá)圖形環(huán)境后的過程,這個部分主要包括:
display-manager.service 啟動lightdm;
lightdm啟動lightdm-deepin-greeter;
用戶輸入密碼后進(jìn)入圖形會話;
lightdm執(zhí)行/usr/sbin/deepin-session;
/usr/sbin/deepin-session
執(zhí)行/etc/X11/Xsession.d中的腳本,并最終啟動/usr/bin/startdde;
startdde啟動桌面環(huán)境的組件,系統(tǒng)啟動完成。
哦,對了,文章開頭的故事純屬虛構(gòu),請勿對號入座。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。