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ù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為隨州企業(yè)提供專(zhuān)業(yè)的網(wǎng)站制作、成都做網(wǎng)站,隨州網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。以前曾被同事纏問(wèn)過(guò)類(lèi)似的問(wèn)題。遇到這種宏大而又不著邊際的問(wèn)題,我的回復(fù)往往是“你還太嫩,現(xiàn)在我告訴你還是會(huì)忘掉的,等你干上個(gè)兩年,不用我說(shuō)你就知道了”。我邊敲著鍵盤(pán),邊佩服自己的聰明才智。
兩年后……
這個(gè)小伙子長(zhǎng)大了,并且堅(jiān)定地又問(wèn)了同樣的問(wèn)題。我一愣神,腦海中不停浮現(xiàn)出一個(gè)聲音“出來(lái)混,遲早是要還的”。
想想也罷,是時(shí)候該把壓箱底兒的貨拿出來(lái)了,畢竟自封了“半吊子系統(tǒng)工程師”的title(雖然我自封的title還有很多:半吊子客服、半吊子產(chǎn)品經(jīng)理、半吊子研發(fā)項(xiàng)目經(jīng)理等等),不給你們露兩手看看看來(lái)還真不行……
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)來(lái)說(shuō)僅僅有內(nèi)核跑起來(lái)是不行的,還要有各種各樣的服務(wù)對(duì)系統(tǒng)的軟硬件進(jìn)行管理,這也是平常大家說(shuō)發(fā)行版跟純粹的GNU/Linux內(nèi)核不是一個(gè)概念的原因之一。
下面我從一個(gè)軟件開(kāi)發(fā)者的角度說(shuō)一下我對(duì)每個(gè)階段的理解以及一些調(diào)試的方法。
既然說(shuō)了是軟件開(kāi)發(fā)者的角度,這個(gè)部分對(duì)我來(lái)說(shuō)基本上相當(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è)備的基本功能都是可以使用的,一些硬件的開(kāi)關(guān)配置也可以在BIOS中進(jìn)行操作。
除此之外,BIOS還有兩個(gè)重要的功能,一個(gè)是硬件自檢;另外一個(gè)是加載引導(dǎo)。硬件自檢這個(gè)跟作為一個(gè)”半吊子系統(tǒng)工程師“沒(méi)什么關(guān)系,自不多說(shuō)。加載引導(dǎo)的過(guò)程其實(shí)就是大家耳熟能詳?shù)腗BR、小蝌蚪找媽…哦不…MBR中找bootloader了。
跟BIOS對(duì)應(yīng)的UEFI,要說(shuō)它們之間的區(qū)別,除了加載引導(dǎo)的方式不大一樣以外。對(duì)我來(lái)說(shuō)可能就是界面能夠用鼠標(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)化情況,老是說(shuō)效果不理想,我去看看吧,原來(lái)是他們測(cè)試系統(tǒng)啟動(dòng)是從硬件啟動(dòng)算起的,我說(shuō)你們直接從內(nèi)核引導(dǎo)開(kāi)始計(jì)算,他還問(wèn)我為什么。優(yōu)化時(shí)間/(BIOS時(shí)間+GRUB時(shí)間+內(nèi)核時(shí)間+圖形時(shí)間) 跟 優(yōu)化時(shí)間/(內(nèi)核時(shí)間+圖形時(shí)間)哪個(gè)大哪個(gè)???我只能說(shuō)這個(gè)測(cè)試同學(xué)的數(shù)學(xué)不大好……
BIOS在MBR中(或者UEFI在主板專(zhuān)有的存儲(chǔ)設(shè)備中)找到bootloader并加載后,bootloader就會(huì)開(kāi)始加載Linux內(nèi)核并啟動(dòng)了。
deepin系統(tǒng)默認(rèn)的bootloader是GRUB(GRand Unified Bootloader)。其實(shí)我一直覺(jué)得這個(gè)名字挺惡心的,大神們果然都是重口味……GRUB并不需要按照什么規(guī)則去硬盤(pán)中找系統(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ā)行版上是沒(méi)有的。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/目錄中的腳本,用來(lái)生成最終的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ì)保存,也就是說(shuō)如果需要永久修改某個(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模式下,除了使用GRUB來(lái)引導(dǎo)內(nèi)核以外,還可以通過(guò)UEFI直接引導(dǎo)內(nèi)核(需要內(nèi)核開(kāi)啟了EFI Stub支持),具體的配置方式見(jiàn)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)部分其實(shí)主要是想說(shuō)initrd。initrd是一個(gè)小型的rootfs,這個(gè)rootfs保證了內(nèi)核啟動(dòng)過(guò)程中所需要的內(nèi)核模塊和用戶態(tài)工具。同時(shí),它還需要為下一個(gè)階段“系統(tǒng)初始化”做準(zhǔn)備,也就是為init程序準(zhǔn)備好真正的文件系統(tǒng),并且啟動(dòng)init程序。內(nèi)核使用initrd啟動(dòng)的過(guò)程主要是:
1.執(zhí)行init腳本(這個(gè)不是上面說(shuō)得init程序,而是生成好的initramfs中的/init這個(gè)文件。后面的步驟其實(shí)都發(fā)生在這個(gè)腳本的執(zhí)行過(guò)程中);
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程序。
上面第6步提到initramfs-tools包自帶有兩種boot類(lèi)型:local和nfs,我們使用live系統(tǒng)的時(shí)候的boot類(lèi)型其實(shí)live。這個(gè)boot類(lèi)型主要是live-boot這個(gè)包支撐起來(lái)的。
在啟動(dòng)live系統(tǒng)的時(shí)候,/scripts/live中的mountroot會(huì)調(diào)用/lib/live/boot/目錄中的腳本設(shè)置根文件系統(tǒng),包括掛在ISO和設(shè)置overlay等。
initrd啟動(dòng)階段支持幾個(gè)特殊的啟動(dòng)參數(shù)輔助調(diào)試:
1.debug 會(huì)開(kāi)啟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的行。
從這個(gè)階段開(kāi)始,啟動(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è)龐然大物太過(guò)復(fù)雜,或許將來(lái)開(kāi)個(gè)坑寫(xiě)一個(gè)系列才能說(shuō)好……這里只簡(jiǎn)單說(shuō)明一下跟系統(tǒng)啟動(dòng)流程相關(guān)的內(nèi)容。一個(gè)是 man bootup中的一個(gè)圖:
當(dāng)前文章:「深度小課堂」說(shuō)一說(shuō)deepin操作系統(tǒng)的啟動(dòng)流程-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://m.rwnh.cn/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í)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容