linux
Linux
是一種開源電腦操作系統內核。它是一個用C語言寫成,符合POSIX
標準的類Unix
操作系統。
90年代初期Linux
開始出現的時候,僅僅是以源代碼形式出現,用戶需要在其他操作系統下進行編譯才能使用。後來出現了一些正式版本。目前最流行的幾個正式版本有:SUSE、RedHat、Fedora、Debian、Ubuntu、CentOS、Gentoo
,等等。用戶可根據自己的經驗和喜好選用合適的Linux
發行版。
原先Linus Torvalds
將Linux
置於一個禁止任何商業行爲的條例之下,但之後改用GNU
通用公共許可證第二版。該協議允許任何人對軟件進行修改或發行,包括商業行爲,只要其遵守該協議,所有基於Linux
的軟件也必須以該協議的形式發表,並提供源代碼。
對於開發人員而言,很多時候都會接觸到LINUX
系統,甚至要去維護和開發,所以對開機/關機
過程需要一定的認識,特別是服務器大部分都是linux系統
的時候,我們重啓服務、切換服務等都需要保障服務的功能不能中斷,這就更需要對linux
的運行過程有深入的認識,本文只是記錄一小部分過程。
Linux操作系統運行級別
Linux 使用的是基於運行級(run-levels
) 概念的稱爲 SysVinit
的專用啓動工具。 它在不同的系統上可能是完全不一樣的, 所以不能認爲一個腳本在某個 Linux 發行版上工作正常。
SysVinit
以運行級的模式來工作,一般有 7 (從 0 到 6)個運行級 (實際上可以有更多的運行級,但都是用於特殊情況而且一般使用不到。 參見 init(8)以獲得更多信息),每個運行級對應於一套設定好的任務, 當啓動一個運行級的時候, 計算機就需要執行相應的任務。 默認的運行級是 3,下面是對不同運行級的描述:
0: 關閉計算機
1: 單用戶模式
2: 無網絡多用戶模式
3: 有網絡多用戶模式
4: 保留作自定義,否則同運行級 3
5: 同運行級 4,一般用於圖形界面(GUI)登錄(如 X的 xdm 或 KDE的 kdm)
6: 重啓動計算機
可以使用runlevel
查看,也可以在/etc/inittab
文件中看到以下:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
也就是說我們系統的運行級別目前是3,那麼需要看的就是/etc/rc3.d
下的內容,其實裏面都是軟連接,所有的軟鏈指向/etc/init.d/中的腳本文件,命名規範如下:
[K|S][number][service name] --> ../init.d/servicename
S 表示 Start,開啓服務
[number]表示的是該腳本的運行優先級,number越小,腳本的運行優先級就越高
[service name]表示的是服務的名稱。
因此我們如果需要定義一個服務啓動的優先級(順序),則需指定腳本的number即可。
開機過程
-
加載內核
打開電腦電源,開始讀取 BIOS 並進行主機的自我測試;透過 BIOS 取得第一個可開機裝置,讀取主要開機區 (MBR) 取得開機管理程式;
LILO啓動之後,如果你選擇了Linux作爲準備引導的操作系統,第一個被加載的東西就是內核。請記住此時的計算機內存中還不存在任何操作系統,PC(因爲它們天然的設計缺陷)也還沒有辦法存取機器上全部的內存。因此,內核就必須完整地加載到可用RAM的第一個兆字節之內。爲了實現這個目的,內核是被壓縮了的。這個文件的頭部包含着必要的代碼,先設置CPU進入安全模式(以此解除內存限制),再對內核的剩餘部分進行解壓縮。 -
執行內核
內核在內存中解壓縮之後,就可以開始運行了。此時的內核只知道它本身內建的各種功能,也就是說被編譯爲模塊的內核部分還不能使用。最基本的是,內核必須有足夠的代碼設置自己的虛擬內存子系統和根文件系統(通常就是ext2文件系統)。一旦內核啓動運行,對硬件的檢測就會決定需要對哪些設備驅動程序進行初始化。從這裏開始,內核就能夠掛裝根文件系統(這個過程類似於Windows識別並存取C盤的過程)。內核掛裝了根文件系統之後,將啓動並運行一個叫做init的程序。
-
init進程
init
程式開始執行系統初始化,最先讀取/etc/inittab
文件中的配置,配置中一般是先執行下/etc/rc.d/rc.sysinit
,然後執行/etc/init.d/functions
,設置環境變量等,同時讀取runlevel
的配置級別,對於嵌入式開發而言,在執行rcN.d
之前會有/etc/init.d/rcS
單用戶模式啓動腳本的執行。
依據init
的設定的initdefault
進行daemon start
(/etc/rc.d/rc[0-6].d/*
),依次執行腳本,啓動服務。關機時依次關閉服務。rc0.d~rc.6.d
文件夾下分別對應的是操作系統0-6
級運行的狀態下需要執行的腳本。在這些文件夾下的文件,都是軟鏈文件,指向指定位置的腳本,這些軟鏈都是指向同一個文件夾/etc/init.d/
的腳本文件, -
載入本機設定 (/etc/rc.d/rc.local)
rc.local
文件,
/etc/profile
文件。這個文件是系統啓動時,任何用戶登錄時執行的文件。任何用戶登錄前,root用戶也會執行一遍。
~/.bash_profile
文件。這個文件每個用戶都有。它在用戶登錄時自動執行,擁有用戶的權限。它export的環境變量對該用戶隨後啓動的進程都有效。
自啓動腳本實踐
- 如果用戶需要開機自動以
root
權限執行一些腳本,那麼最好的方法是編輯/etc/rc.d/rc.local
文件。 - 如果每一個用戶登錄時都應該執行的腳本,如設置一些環境變量。那麼應該修改
/etc/profile
文件。 - 如果某一個特定用戶登錄時應該執行特定的腳本,如設置該用戶特定的環境變量,應該修改
~/.bash_profile
文件。
============
/etc/profile
============
此文件爲系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行.
並從/etc/profile.d目錄的配置文件中搜集shell的設置.
===========
/etc/bashrc
===========
爲每一個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取.
===============
~/.bash_profile
===============
每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該
文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件.
=========
~/.bashrc
=========
該文件包含專用於你的bash shell的bash信息,當登錄時以及每次打開新的shell時,該文件被讀取.
==========
~/.profile
==========
在Debian中使用.profile文件代 替.bash_profile文件
.profile(由Bourne Shell和Korn Shell使用)和.login(由C Shell使用)兩個文件是.bash_profile的同義詞,目的是爲了兼容其它Shell。在Debian中使用.profile文件代 替.bash_profile文件。
==============
~/.bash_logout
==============當每次退出系統(退出bash shell)時,執行該文件.