Linux入门之系统启动过程及初始化----“翻滚吧,牛宝宝”
? ? 每當你按下開機電源鍵的時候,總是懷著一顆虔誠的心,抱著求神拜佛的念頭,祈求機器順利開機,不要出幺蛾子;每當你看到屏幕上輸出的一行又一行的信息,綠的OK,紅的failed,迷茫的眼神穿透了顯示器;這一切都是因為你不懂系統的啟動過程及初始化流程。在這里,力圖將Linux系統的啟動過程及初始化描述清楚,闡述好背后的原理。在撰寫本文的時候,必定會因為個人對知識理解的偏差,知識面的狹窄也限制了博文內容,因此,希望小友們能夠提出寶貴意見。
Linux系統的啟動及初始化是Linux學習過程中非常重要的一個點,只有洞悉系統啟動過程、初始化了哪些內容,才能對Linux有更加深入的了解。本文主要描述Linux系統從電腦開機到初始化完成整個過程,包括cpu加電自檢、bios尋找啟動項、bootloader加載系統內核、系統啟動并初始化等等。
一、“人生”第一步,加電自檢
POST(Power on self test)。電腦開機通上電源后第一件事便是給cpu加載電源,cpu需要對硬件設備等外設進行檢測,以便于啟動系統。然后cpu本身是不存儲任何信息的,所以,cpu根據固定在內部的指向信息,從COMS中加載BIOS里存儲的內容,對各個硬件如硬盤、PCI設備、內存等進行檢測。如果出現錯誤,如內存沒有插好,電腦會發出警報,無法啟動;(這一步也可以算作是BIOS的工作)
二、BIOS的主要任務
BIOS中的信息被加載到cpu中,cpu負責將這些程序運行起來,一是進行自檢,對周邊的硬件設備進行檢測,確保系統啟動的硬件環境;二是,在自檢完成之后,由于電腦中可能存在多個能夠用于啟動系統的驅動器,所以,需要根據BIOS中啟動順序(boot sequence)的設定,找到啟動系統的驅動器。例如我們的硬盤。BIOS會去讀取硬盤上的第一個扇區(512K):MBR(master boot recoder)。至于MBR中是什么內容,怎樣來啟動系統,BIOS并不關心。它只負責讀取該扇區上的數據和程序。
三、“咽喉”MBR
主引導分區記錄分為三段,第一段是446K的bootloader,第二段是硬盤分區表,第三段是硬盤有效標志(也可稱魔術區)。bootloader是啟動系統的核心模塊,cpu根據上面安裝的管理器(我們這里以最常見的grub為例)加載系統內核。
四、“光明之路”Bootloader
bootloader是系統的啟動加載器。通常情況下,引導程序都安裝在bootloader中。以我們常見的grup為例,grub分為stage1,stage1.5,stage2。其中stage1的代碼是直接存放在mbr中的。當BIOS將控制權傳遞給MBR后,stage1的代碼就開始運行,它主要負責將stage1.5或者stage2的內容加載在內存中。stage2被加載到內存中后,就會讀取grub的配置文件grub.conf。grub.conf的主要內容如下:
[root@station47 grub]# cat grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/mapper/vg0-root # initrd /initrd-[generic-]version.img #boot=/dev/sda #指定默認啟動的內核或者os default=0 #等待用戶選擇需要啟動的內核或者os的時常,時間為秒 timeout=5 #啟動時顯示的圖片 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #隱藏選擇菜單 hiddenmenu #啟動時顯示的名稱 title CentOS (2.6.32-358.el6.x86_64) #系統內核所在的磁盤root (hd0,0) #指定內核文件及傳遞給內核的參數kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet #initrd為加載真正系統文件系統前加載的虛擬文件系統(在centos5.0上為虛擬磁盤initrd,在centos6.0上為initramfs虛擬文件系統)initrd /initramfs-2.6.32-358.el6.x86_64.img [root@station47 grub]#讀取配置文件后,系統內核會初始化一部分的設備和文件,但是由于真正的系統內核是在磁盤上文件系統上的,而此時磁盤文件系統還沒有被加載。并且,由于底層硬件設備平臺的巨大差異,內核也不可能將全部的驅動程序都包含進來。這個時候,initramfs出馬了。它是一個虛擬的文件系統,在安裝操作系統的時候,一部分的安裝信息和硬件驅動程序就被寫入進去。這樣,當grub配置文件被讀取后,initramfs中的內容會被復制到rootfs中,內核從中讀取必須的驅動模塊,掛載真正的“根”,完成這些工作后,虛擬文件系統的內容會被復制到系統中,然后從內存中銷毀。控制權被交接給/sbin/init程序來進行初始化
五、系統初始化
? ?/sbin/init接收到系統初始化的工作后,馬上開始工作。它是所有系統進程的父進程,pid永遠為1。它接管了系統的控制權先之后,它首先會去讀取/etc/inittab文件來執行相應的腳本進行系統初始化,如設置鍵盤、字體,裝載模塊,設置網絡等。inittab主要的任務有:
? ? 設置系統默認的運行級別
? ? ? ? 定義運行系統的系統初始化腳本rc.sysinit
? ? ? ?啟動指定級別下的S開頭的服務,關閉K開頭的服務
? ? ? ?定義CtrlAltDel組合操作
? ? ? ?啟動字符端終端
? ? ? ?啟動圖形終端
1.執行初始腳本rc.sysinit
? ?sysinit做了系統初始化的大部分的工作,不辭辛勞的掛載文件系統,啟動相應運行級別上的服務。主要有以下內容:
? ?設定主機名,激活selinux和udev,掛載文件系統,激活swap,以讀寫方式重新掛載根文件系統,設置內核參數,設置系統時鐘,鍵盤映射,加載額外的驅動程序。
? ?rc.sysinit執行完成后,系統基本上就算是啟動了。可以正常工作了。但是還需要啟動相關的系統服務才行。
2.執行/etc/rc.d/rc#.d腳本,根據系統inittab配置文件設定的系統運行級別,執行不同目錄下的服務腳本,K開頭的為關閉的服務,S開頭的為需要開啟的服務。
3.執行用戶定義的引導程序/etc/rc.d/rc.local
我們可以自己定義屬于自己的啟動腳本,一般情況下可以放到該目錄下。
4.初始工作完成,啟動系統,看到登錄界面
六、最淺薄的認識給最需要學習的自己
簡單的描述了系統啟動及初始化的主要流程。但是,由于初學,windows的影響,必定有很多地方認識有誤,也會有很多地方遺漏。但是,奔跑的人從來不在于起步時姿勢是否好看,重要的是,一直在朝著正確的方向奔跑。
最后附一張來自網絡的圖,非常詳細和明晰,由于沒有找到相關作者,這里注明是從網絡上獲取,謝謝作者。
轉載于:https://blog.51cto.com/sweetweapen/1367801
總結
以上是生活随笔為你收集整理的Linux入门之系统启动过程及初始化----“翻滚吧,牛宝宝”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP和MySQL
- 下一篇: linux 其他常用命令