歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux(openSUSE13.1) 從上電到提示符閃爍之過程簡介

Linux(openSUSE13.1) 從上電到提示符閃爍之過程簡介

日期:2017/2/28 14:27:08   编辑:Linux教程

有時候需要了解系統啟動的過程,在安裝系統,自定義啟動程序以及配置shell profile的時候比較有用。當然,了解這些過程,對於我們理解系統是如何工作的也是很有意義的。網上也有很多有用資料,不過有些文章太具體詳細,有些只描述了某一子過程中的情況,有些描述的跟現在的有些差距。為此,加上自己的理解,稍稍匯總一下,寫個簡介,看起來方便,同時附上具體過程的一些鏈接,方便要深入的時候可以隨時深入。因為現在用的系統是openSUSE13.1,所以就以此系統作為描述的對象,其實,大多數Linux系統都是差不多的,只是一些細小方面的區別。

1.BIOS

當計算機一開始被啟動,或者重新啟動時,處理器將從BIOS(Basic I/O System)開始執行。BIOS存儲於主板上的閃存中,主要做什麼用途呢?BIOS進行所謂的POST(Power On Self Test),然後依據設置的引導順序從硬盤,U盤或CDROM中讀入“引導塊”。通常BIOS中設的引導順序為硬盤在最前面,那麼就把第一個硬盤的第0柱面,第0磁頭的第1個扇區讀入內存,然後跳到那裡開始執行。這個扇區被叫做:MBR(Main Boot Record)。

2.MBR

MBR的大小為512字節。其中的446字節存放boot loader,接下來的64字節存放磁盤分區表信息,最後的兩個字節為MBR的終止標志位,為0xAA55。在早期沒有GRUB之類的引導程序前,操作系統直接由MBR的boot loader啟動,但是因為它的存儲區域有限,很難做復雜的啟動控制,尤其在多操作系統的情況下。所以有了引導程序,現在用的比較多的是GRUB。因為boot loader存儲區域的限制,GRUB只能把一小部分hook的程序放在這裡,用來跳轉到GRUB主要的程序。這部分hook的程序就叫做GRUB stage1。

(在裝完Linux系統後再裝Windows系統,啟動的時候就會直接啟動Windows,就是因為MBR在安裝Windows的時候被重寫了,只能引導Windows。在這種情況下,有種辦法是從Windows啟動的時候用Grub4dos命令行模式啟動到Linux系統,然後重新安裝GRUB stage1到MBR)

3.GRUB

如果有/boot分區,GRUB會被安裝到此分區下,當然,這裡的GRUB指GRUB stage2。GRUB從menu.list中讀取配置顯示到屏幕讓用戶選擇,用戶也可以通過命令行手動進行啟動。一般來說有3個參數,root---用來指定哪個硬盤哪個分區,kernel---用來指定用哪個內核文件,initrd---用來指定用哪個初始化ram的img文件。有了這3個參數,就可以啟動Linux系統了。

(GRUB2請參考 Grub2基礎教程 PDF http://www.linuxidc.com/Linux/2012-07/64759.htm)

(http://www.linuxidc.com/Linux/2014-10/108032.htm 這篇博文詳細介紹了1,2,3步驟)

4.Kernel

內核映像文件vmlinuz:包含有linux內核(vmlinux)的靜態鏈接的使用zlib壓縮過的壓縮文件。傳統上,vmlinux被稱為可引導的內核鏡像。Kernel通過調用start_kernel,會調用一系列初始化函數來設置中斷,執行進一步的內存配置,並加載初始 RAM 磁盤。然後,啟動 init 函數,這是第一個用戶空間進程(user-space process)。最後,啟動空任務,現在調度器就可以接管控制權了(在調用 cpu_idle 之後)。通過啟用中斷,搶占式的調度器就可以周期性地接管控制權,從而提供多任務處理能力。

(http://www.linuxidc.com/Linux/2014-10/108033.htm 詳細分析了內核啟動過程)

(http://www.linuxidc.com/Linux/2014-10/108034.htm 詳細分析了內核啟動代碼)

5.Init

init即是/sbin/init,為Linux系統第一個進程,進程號為1,是系統所有進程的起點。控制系統啟動的腳本放在/etc/init.d裡(有的Linux系統放在/etc/rc.d裡,在Opensuse13.1中,/etc/rc.d為一指向/etc/init.d的鏈接)。這些腳本或直接或間接地被/sbin/init調用。/sbin/init的配置由/etc/inittab提供,/etc/inittab文件的每一行包括四個域(id:runlevels:action:process)。

/sbin/init調用/etc/init.d/boot(boot level master script)來初始化系統,比如文件系統檢測,同時也調用/etc/init.d/boot.d中的硬件初始化腳本,然後調用/etc/init.d/boot.local,這個腳本用來執行用戶自定義的一些命令。需要注意的是,這一文件執行時網絡等設備都尚未就緒,使用時應小心。

在系統進入運行級前,/sbin/init還會運行一個用戶可以自定義的腳本/etc/init.d/before.local(此時網絡等設備也未就緒),然後/sbin/init將根據/etc/inittab中的配置跳轉到默認的run level,調用/etc/init.d/rc(run level master script)來啟動或停止一些服務。

為了控制一個運行級的服務,相應的腳本被鏈接到run level directories /etc/init.d/rc<X>.d中,其中<X>為0,1,2,3,4,5,6,S,代表運行級。在/etc/init.d/rc<X>.d中,有以S開頭的start links和以K開頭的stop links,start links將在系統進入一個運行級時被依次調用,stop links將在系統退出一個運行級時被依次調用。

/etc/sysconfig下的系統配置文件用於配置那些對應的服務。在Opensuse13.1中,這些系統配置文件可以被YaST改變,或者直接拿編輯器改變,不過就是用編輯器改變後,還得運行/sbin/SuSEconfig來使這些配置在系統中生效。

系統完成運行級的啟動後,/sbin/init還會運行一個用戶可以自定義的腳本/etc/init.d/after.local,對於多數用戶自定義的啟動程序來說,將其加到/etc/init.d/after.local中較為合適。比如上文中介紹的goagent,想開機自動啟動的話,在/etc/init.d/after.local中加上命令即可。

6.TTY

運行級啟動完後,將會返回到/sbin/init。這時基本系統環境已經設置好了,各種守護進程也已經啟動了。/sbin/init接下來會打開終端tty,以便用戶登錄系統。

(http://www.linuxidc.com/Linux/2014-10/108035.htm 對Init及tty有比較詳盡的分析)

7.SHELL

用戶登錄系統後,根據/etc/passwd配置的默認shell,啟動相應的shell。一般大多都是bash,這裡也以bash為例描述下bash讀取配置文件的過程。

/etc/profile --- ~/.inputrc(/etc/inputrc) --- /etc/profile.d/* --- /etc/profile.local --- ~/.bash_profile(~/.bash_login |~/.profile)

.bash_profile和.bash_login以及.profile只會執行其中一個。搜索順序以 .bash_profile->.bash_login->.profile這樣的順序進行,如果有前者就不執行後者。

~/.bashrc用於子shell啟動配置。

(對比介紹:

1./etc/profile和用戶主目錄下的配置文件

用戶登陸到shell時,shell會執行一系列初始化動作,其中就包括讀取配置文件,然後根據配置文件設置環境信息。這樣用戶就可以很方便地在環境中加入自定義信息,如設置環境變量。事實上,登陸shell會讀兩配置個文件,/etc/profile文件和用戶主目錄下的配置文件,這兩個文件的區別是:

/etc/profile文件:為系統的每個用戶設置環境信息,對所有用戶的登陸shell都有效;

用戶主目錄下的配置文件:為當前用戶設置環境信息,僅對當前用戶的登陸shell有效;

2.用戶主目錄下有哪些配置文件

用戶主目錄下的配置文件有.profile, .login, .bash_profile, .bash_login。不同的登陸SHELL用不同的配置文件,具體為:

Bourne Shell (sh):使用.profile文件;

Korn Shell (ksh):兼容sh,也使用.profile文件;

C Shell (csh):使用.login文件;

Bourne Again Shell(bash:bash被設計成兼容sh,ksh,並有csh的特征, 所以會在用戶的主目錄下依次查找.bash_profile,.bash_login,.profile文件,並用找到的第一個作為自己的配置文件;

bash查找這些同義文件的好處是,如果曾經用過Bourne shell,你可以保留它,如果需要加入特定的bash命令,可以將它們放入.bash_profile中並在後面跟一條命令source .profile。登錄時,所有特定的bash命令均被執行,然後bash將會調用.profile,執行其保留的命令。即使決定仍使用Bourne shell,也不必修改已存在的文件,類似的方法也可以用於.bash_login和C shell的.login,但由於這些shell基本語法的差異性,這不是一個好主意。

需要注意的是:經過編輯的.bash_profile文件,直到退出再次登錄,該文件被重新讀取後,.bash_profile中的內容才會生效。

2.Bash的其他幾個配置文件

Bash的設計考慮的場景比較齊全,所以除了上面的幾個配置文件外,還有如下幾個配置文件:

~/.bash_logout文件:每次登錄shell退出時文件.bash_logout被讀取並執行,它提供了定制用戶環境的功能,如刪除帳號內的臨時文件或記錄登錄系統所花的時間;

~/.bashrc文件:.bash_profile只被登錄shell讀取並執行,如果你在命令行上鍵入bash啟動一個新的shell,這個新shell讀取的是.bashrc而不是.bash_profile,將登錄shell和運行一個子shell所需的配置文件分開可以獲得非常靈的配置策略,從而滿足不同的應用場景;

/etc/bashrc文件:和~/.bashrc的含義一樣,只不過適用於所有的用戶;

事實上,很多情況下某些配置文件是一樣的,比如.bashrc和.bash_profile,這時只需要在一個配置文件中執行另外一個配置文件就可以了,例如source .bashrc,或 ..bashrc(匿名命令)。

到此為止,提示符開始閃爍。。。

更多SUSE相關信息見SUSE 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=3

Copyright © Linux教程網 All Rights Reserved