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