您好,登錄后才能下訂單哦!
我們都知道按下電腦電源鍵后,屏幕上會一閃而過很多信息,然后顯示登錄界面,然后輸入用戶名,密碼就可以暢享網絡世界了。那么這中間到底發生了什么呢,今天就讓我們來簡單探討一下CentOS的簡易版開機啟動流程吧。
第一階段:通電自檢過程
我們都知道電腦所有數據指令都是在內存上才能被cpu處理的吧,我們還知道內存在斷電后其上面的所有數據都會丟失吧,那么開機的時候內存應該是沒有東西的吧,那上面都不能干了,更別說啟動一個操作系統了,其實啊,我們內存并不只是我們常見的那個內存卡,很多硬件都會映射一段內存到cpu的尋址空間上,比如說BIOS,顯卡等等,而我們知道BIOS是寫在主板芯片上的,而且是用閃存做成的ROM上 的,雖然也可以修改里面的數據,但是我們還是習慣稱之為只讀存儲器,那么問題也來了,通電后,cpu怎么知道在內存的哪個地址段是BIOS代碼段呢,這是因為cpu在制作的時候的設置的,當通電瞬間,cpu會進入實模式狀態,然后把內存尋址控制在大概1MB的樣子,然后其內的IP寄存器和CS寄存器會將地址指向內存的一個位置(只需要知道在一個位置,因為只是簡介嘛),而這個位置恰恰是BIOS代碼段開始的位置,然后顯而易見cpu就開始執行這些代碼啦,然后就會看到我們熟悉的各種BIOS自檢信息啦,當然最重要的是在內存中生成中斷向量表(記錄了中斷向量程序在內存中的位置)和中斷向量程序,而我們都設置過BIOS吧,最起碼設置里面的boot選項吧,就是將自己想要啟動的裝有系統的硬盤盡量往前面位置調(因為BIOS只認第一個),這是因為當BIOS檢測到這塊硬盤里含有操作系統的時候就會給CPU發一個中斷信號,然后CPU通過名字找到內存中的中斷向量表中的這個中斷所指向的中斷向量程序的位置,然后就執行這部分的程序,然后這個程序就會將我們的硬盤的第一個扇區(512字節也叫MBR)加載到內存中,我們也知道硬盤的MBR中的前446K裝的是引導啟動程序代碼,中間64K裝的是我們硬盤的分區表,最后2個字節是MBR有效標志(如果是55AA就有效,BIOS就是通過這個來分辨硬盤中是否有操作系統的),然后BIOS就去打瞌睡去了,做了甩手掌柜,把一起都交給了引導程序這個店小二了。
第二階段:引導程序裝載內核過程
我們都懂沒有驅動程序的硬件只能自我娛樂,而硬盤也必須格式成某種格式的文件系統才能在操作系統下存儲東東,那么引導程序這個店小二想要加載硬盤上的操作系統就必須有支持這個文件系統格式的驅動才行,遺憾的是區區446K的空間并不能做到,因此在MBR隨后的扇區中會有這個驅動程序,然后第二階段就去尋找他的真愛了,在Linux中通常在/boot/vmlinuz-版本-發型號,然后內核就被解壓加載到內存中了(內核也只是個程序而已)。
第三階段:內核加載到PID為1的進程init過程
內核加載到內存中開始運行,但是相同的問題又來了,操作系統上的硬盤必須是一種文件系統才可以存放數據,那么是不是可以把所有的文件系統的驅動程序都寫入到內核中呢,當然可以但又不可以,因為那樣的話不僅內核會特別的大,而且一個機器上也就僅僅能用到很少很少的一部分而已,所以不可以這樣,但是寫進去后確實也能達到目的,所以又可以,而Linux雖然是單內核,但是其充分吸取了微內核的高級理念,以為其支持動態加載模塊,上面意思呢,就是將很多功能可以寫成一個個模塊,然后加載到內核中就可以了,當然也可以直接編譯進內核,甚至有些模塊必須編譯進內核。而眾多的驅動程序就是被寫成了模塊,只保留基本功能就行。(請注意,我這里不是在捧windows,雖然它是微內核,但是也因為如此而使得其要想達到內部協調就必須寫更多的代碼,從而變得很臃腫還容易出問題,所以辣雞一詞用在上面最合適不過了),但是這樣的話那就沒能解決啟動操作系統啊,其實呢,內核會在內存中使用randis技術將一部分內存虛擬化為硬盤使用,通過這個虛擬化一個小根文件系統來,你可以看看你的/boot下是不是有一個initramfs-版本-發型號的文件(版本和發型號和內核一樣在CentOS 5中是initrd-版本-發型號,如果看看其下面的文件,會發現里面就是一小文件系統,通過這個來加載文件系統驅動程序,然后再去加載真正的根文件系統,緊接著就運作啊運作,生成0號進程,然后因為自己沒什么本事就去生個兒子叫1號進程init,兒子比老爹就厲害多了(雖然還是腦子不好,但起碼四肢俱全啊)
第四階段:1號進程init干的那些事
在CentOS 5上:init自己也是剛開過光,學老爹,不過他志向比他爹大多了,因為他要生一窩兒子,直到自己兒子們組成一個完整的操作系統(Linux中通過fork()復制,exec()運行的進程會比自己爸爸功能強大),首先這廝會很“軸”,非要去找/etc/inittab這個文件,這個文件里面主要定義了默認終端,系統初始化,關閉和開啟相應終端下的程序,然后獲得可以登錄的終端。格式為
id:默認終端級別:action:process
默認終端級別有:
0:關機, shutdown
1:單用戶模式(single user),root用戶,無須認證;維護模式;
2、多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS;維護模式;
3、多用戶模式(mutli user),完全功能模式;文本界面;
4、預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5、多用戶模式(multi user), 完全功能模式,圖形界面;
6、重啟,reboot
action:
wait:等待切換至此任務所在的級別時執行一次;
respawn:一旦此任務終止,就自動重新啟動之;
initdefault:設定默認運行級別;此時,process省略;
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;
process:
/etc/rc.d/rc[0-6],會關閉相應終端級別下的K##開頭的程序,開啟相應終端級別下的S##開頭的程序,如果你ll其下面的文件會發現都是鏈接到/init.d下的除K##和S##的同名程序。
那么其順序就是,先id:默認終端等級:initdefault:,來知道默認終端,然后就是si::sysinit:/etc/rc,d/rc.sysinit,來初始化,再接著是id號:默認終端等級:wait:/etc/rc.d/rc[0-6],實現開啟關閉相應終端下的服務腳本,最后是tty[1-6]:默認終端等級:respawn:/usr/sbin/mingget tty[1-6],來獲取登錄終端。
其中初始化實現的內容有:
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的所有文件系統;
(5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 根據/etc/sysctl.conf文件來設置內核參數;
(8) 激活lvm及軟raid設備;
(9) 激活swap設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作;
最后執行在/etc/rc.d/rc.local里面的作業,這個文件沒有鏈接到/etc/init.d目錄下的任何腳本,他只是為了讓不想寫腳本來實現開機服務的人懶一下
那么怎么寫可以開機運行或關閉的腳本呢。其實只要看一下/etc/init.d下或者/etc/rc.d/init.d(前面的只是鏈接到后面)的腳本就知道,在腳本開始部分加上#chconfig:終端(可以是多個):開啟優先級:關閉優先級,然后這個腳本就可以被chconfig命令管理,當然你得把這個腳本弄到/etc/init.d或者/etc/rc.d/init.d下,可以鏈接也可以直接建在這目錄下。然后通過chconfig --add 腳本名就會添加到相應終端等級的/etc/rc.d/rc[0-6]目錄下自動生成相應的K##開頭和S##開頭的文件。然后就可以用service 腳本名 {start|restart|status|stop}來運行重啟查看停止此服務腳本了
chkconfig命令
chkconfig --list [腳本名]:查看其在各終端等級的開啟關閉狀態
chkconfig --add 腳本名:將指定腳本生成在相應終端下的K##開頭和S##開頭的的文件了,其實chkconfig 程序名 on/off就是這個機制罷了,但是只是這樣的話不會再其他終端生成文件,只會在腳本指定的終端中生成開啟或關閉文件。
chkconfig --del 腳本名:與上面相反。
chkconfig --level 指定終端(可以多個,默認為2345) 腳本名 on/off。這就是所謂的開機運行和關閉了,其實也就是在相應終端下生成S##文件和K##文件罷了。
另外如果腳本中終端等級為-表示所有終端等級下都關閉(只生成K##),為其他數字的就代表在與這些終端上對應的/etc/rc.d/rc[0-6]里面生成相應的文件。
K##的這兩個數字表示的是停止優先級,數字越小越優先停止,表示依賴別的程序
S##的這兩個數字表示開啟優先級,數字越小越優先啟動,表示其被其他程序所依賴
在CentOS 6上用的是upstart并不是5上面經典的SYS V,但是其還是兼容5,因此其/etc/inittab還是有效,只是這文件只設置默認終端了,因此只有id:指定默認等級:initdefault:
但是其里面說明了初始化腳本在/etc/init/rcS.conf,開啟和關閉相應終端等級的腳本配置文件是/etc/init/rc.conf,然后再看這兩個文件會發現還是指向了/etc/rc.d/目錄下的腳本。所以沒什么好說的,只需要知道5上面的配置文件是/etc/inittab,而6的配置文件有/etc/inittab和/etc/init/*.conf,但是他們的腳本都在/etc/init.d(/etc/rc.d/init.d)
在CentOS 7上用的是systemd,改變非常的大,但是還是能兼容5,6,特別是5,其配置文件在
/etc/systemd/system和/usr/lib/systemd/system下。已經說了雖然改變很大但是并不代表不能像5,6那也使用。因此這方面待續。。。。。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。