IT斷魂槍--閑聊Linux系統(tǒng)啟動過程
前言
沙子龍的鑣局已改成客棧。東方的大夢沒法子不醒了。---- 老舍《斷魂槍》
云計算大潮到來了,我把IT技術(shù)像五虎斷魂槍一樣收起來了。我不會將它壓到箱底,偶爾我也會練練聊聊,紀念一下那個搞技術(shù)的黃金時代。
本文聊個很有嚼頭的技術(shù)問題,Linux系統(tǒng)的啟動過程,當(dāng)我們不用自己安裝系統(tǒng)以后,喪失了這么多樂趣。
正文
主板加電和硬件自檢,就是開機第一屏啟動界面。
CPU和內(nèi)存插得有問題服務(wù)器會滴滴亂叫,而網(wǎng)卡和硬盤插不插都無所謂,因為這些外設(shè)都不屬于經(jīng)典的計算機系統(tǒng)。
早期小內(nèi)存服務(wù)器一般有內(nèi)存檢測的功能,但256G內(nèi)存的服務(wù)器啟動的速度也太慢了,重啟一分鐘能啟動的服務(wù)還能恢復(fù),重啟三分鐘可能群集性狀就變了,所以我們經(jīng)常順手就把他關(guān)掉了。
2. 讀取主板引導(dǎo)配置,現(xiàn)在終于要從外部設(shè)備讀取數(shù)據(jù)了。
主板大都是BIOS引導(dǎo),也有是UEFI引導(dǎo),但從服務(wù)器用戶看區(qū)別也不大。
主板可選從USB/SATA/NIC這幾類接口上獲取引導(dǎo)數(shù)據(jù),而且可以排隊式加載,第一個加載不成功就嘗試第二個。系統(tǒng)安裝鏡像都有個防止誤操作的倒計時,而網(wǎng)絡(luò)引導(dǎo)一般是排在末位,硬盤引導(dǎo)就是通用的系統(tǒng)啟動的方式。
愛折騰桌面電腦的朋友從這一步開始就玩雙系統(tǒng)/WINPE/U盤版Ubuntu/無盤工作站了,還好服務(wù)器維護人員比較單純專一。
3. 讀取MBR(可略過)。
如果是BIOS啟動,做為一個老古董它只能會去讀MBR,MBR去讀取GRUB;而UEFI略過MBR,直接讀取GRUB。
BIOS將啟動權(quán)限交給MBR的446字節(jié),而446字節(jié)連Linux啟動界面的logo都裝不下,MBR也只是個搬運工,會將啟動權(quán)限交給GRUB。
遇到過幾次倒霉事以后,我習(xí)慣用dd備份每臺服務(wù)器的前512字節(jié),但自從我做完備份以后,就再也沒倒霉過。
##不好意思沒圖
4. GRUB引導(dǎo)啟動vmlinuz內(nèi)核。
GRUB2如果細說有stage1、stage1.5、stage2多個步驟,我們可以簡單認為前面兩步是為了茍到stage2加載為止。
我們用GRUB來選定要加載的內(nèi)核,并向其傳遞大量啟動參數(shù),這樣就可以在多OS、多Kernel、多runlevel之間來回切換。網(wǎng)上的GRUB調(diào)試教程都集中在這一步,我們還可以直接傳參以單用戶模式啟動,直接無密碼登陸服務(wù)器。
有些人習(xí)慣給/boot一個128M的小分區(qū),可能是老師的老師說過這樣比較“安全”。那是在更早的版本GRUB程序讀不了GB級磁盤分區(qū),沒辦法加載vmlinuz內(nèi)核,現(xiàn)在已經(jīng)只是一個迷信而已。
5. 內(nèi)核啟動加載驅(qū)動,但這還沒觸及任何業(yè)務(wù)。
不同硬件同一個版本的vmlinuz內(nèi)核hash值是相同的,因為驅(qū)動信息放在initrd*.img里。Initrd*.img是一個精簡但帶了所有驅(qū)動的linux鏡像,一般系統(tǒng)安裝完之后自動生成,也可以事后手動生成。
曾經(jīng)某偏門軟件推薦用集成鏡像安裝,裝完了就是起不來,我把同內(nèi)核版本、同硬件配置的init*.img替換以后系統(tǒng)就正常啟動。
Kernel加載了所有驅(qū)動后就會卸載initrd*.img,早期linux版本在系統(tǒng)啟動過程中還能看到很多“umount filesystem”的提示,那不是卸載正式文件系統(tǒng),而是卸載了initrd*.img這個迷你系統(tǒng),
##不好意思沒圖
6. Init進程啟動,服務(wù)正式啟動。
從看到“Welcome use CentOS”的彩色歡迎文字開始,init服務(wù)已經(jīng)啟動了。
在這之前的啟動過程也就讀取BIOS/MBR/GRUB和/boot分區(qū),現(xiàn)在終于開始讀/etc目錄的配置文件了。
首先被讀取到的是/etc/fstab,各個磁盤都掛載就位。這個文件注釋很簡單但水很深,我們該用標簽還是UUID來標識磁盤,文件系統(tǒng)自檢功能要不要開,這都可以聊好幾個小時。
看看各服務(wù)的啟動優(yōu)先級也是一個講究多多的過程,iptables會比network先啟動這類依存關(guān)系很好理解;但我也遇到過云平臺的DHCP獲取太慢,而云主機操作系統(tǒng)啟動快、Network還沒從DHCP那里獲取到IP地址,然后Mysqld等需要監(jiān)聽端口的服務(wù)啟動失敗。
后記
以上內(nèi)容只能算精簡科普版的Linux系統(tǒng)啟動過程,正式版的啟動過程可以寫十萬字,有興趣的朋友可以自己查維基百科,或拿我說的關(guān)鍵字去百度搜索。
曾經(jīng)我把這些技能當(dāng)做資歷,但現(xiàn)在大家都上云了,它們就只是閑聊的談資了。但客戶上云就能少招一個研究這事的工程師,上云確實也很有意義啊。
夜靜人稀,沙子龍關(guān)好了小門,一氣把六十四槍刺下來;而后,拄著槍,望著天上的群星,想起當(dāng)年在野店荒林的威風(fēng)。嘆一口氣,用手指慢慢摸著涼滑的槍身,又微微一笑,“不傳!不傳!” ---- 老舍《斷魂槍》