九、
運行級別
1
、
Linux
系統的運行級別
(runlevel)
Linux
系統有
7
個運行級別,
Linux
系統任何時候都運行在一個指定的運行級別上,不同的運行級
別所運行的程序和服務不盡相同,所要完成的工作和要達到的目的也不相同
·
運行級別
0
系統停機
(halt)
狀態,系統的默認運行級別不能設為
0
,否則不能正常啟動
·
運行級別
1
單用戶工作
(single user)
狀態,
root
權限,用於系統維護,禁止遠程登陸
·
運行級別
2
多用戶
(multiuser)
狀態
(
沒有
NFS)
·
運行級別
3
完全的多用戶
(multiuser)
狀態
(
有
NFS)
,登陸后進入控制台命令行模式
·
運行級別
4
系統未使用,保留
·
運行級別
5 X11
控制台
(xdm
、
gdm
、
kdm)
,登陸后進入圖形
GUI
模式
·
運行級別
6
系統正常關閉並重啟
(reboot)
,默認運行級別不能設為
6
,否則不能正常啟動
2
、運行級別的原理
在目錄
/etc/rc.d/init.d
下有許多服務器腳本程序,一般稱為服務
(service)
, 在
/etc/rc.d
下
有
7
個名為
rcN.d
的目錄,其中
N=0-6
,對應於系統的
7
個運行級別,
rcN.d
目錄下,都是
一些符號鏈接文件,這些鏈接文件都指向
init.d
目錄下的
service
腳本文件,這些鏈接文件的命
名規則是
"K+nn+
服務名
"
或
"S+nn+
服務名
"
,其中
nn
為
2
位數字:
例
: rc3.d
目錄下的鏈接文件
S80sendmail
就指向
service
腳本文件
../init.d/sendmail
系統會根據指定的
runlevel
進入對應的
rcN.d
目錄,並按照文件名順序檢索目錄下的鏈接文件
• 對於以
K
為開頭的鏈接文件,系統將終止對應的服務
• 對於以
S
為開頭的鏈接文件,系統將啟動對應的服務
通過這種方式來實現
"
不同的運行級別運行不同的程序和服務
"
3
、
/etc/inittab
配置文件詳解
init
的進程號是
1
,從這一點就能看出,
init
進程是系統所有進程的起點,
Linux
在完成核內引導以后,
就開始運行
init
程序,
init
程序需要讀取設置文件
/etc/inittab
。
inittab
是個不可執行的文本文件,他有若
干行指令所組成。在
Redhat
系統中,
inittab
的內容如下所示
(
以“
###"
開始的中注釋為筆者增加的
)
:
(
如果你改變了
inittab
文件,那么要使他立即生效,需要使用一個命令:
init q
)
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# 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)
#
###
表示當前缺省運行級別為
5(initdefault)
;
id:5:initdefault:
###
啟動時自動執行
/etc/rc.d/rc.sysinit
腳本
(sysinit)
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
###
當運行級別為
5
時,以
5
為參數運行
/etc/rc.d/rc
腳本,
init
將等待其返回
(wait)
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
###
在啟動過程中允許按
CTRL-ALT-DELETE
重啟系統
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
###
在
2
、
3
、
4
、
5
級別上以
ttyX
為參數執行
/sbin/mingetty
程序,打開
ttyX
終端用於用戶登錄,
###
如果進程退出則再次運行
mingetty
程序
(respawn)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
###
在
5
級別上運行
xdm
程序,提供
xdm
圖像方式登錄界面,並在退出時重新執行
(respawn)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
以上面的
inittab
文件為例,來說明一下
inittab
的格式。其中以
#
開始的行是注釋行,除了注釋行之
外,每一行都有以下格式:
id:runlevel:action:process
對上面各項的周詳解釋如下:
1. id
id
是指入口標識符,他是個字符串,對於
getty
或
mingetty
等其他
login
程序項,需求
id
和
tty
的編
號相同,否則
getty
程序將不能正常工作。
2. runlevel
runlevel
是
init
所處於的運行級別的標識,一般使用
0
-
6
及
S
或
s
。
0
、
1
、
6
運行級別被系統保留:
其中
0
作為
shutdown
動作,
1
作為重啟至單用戶模式,
6
為重啟;
S
和
s
意義相同,表示單用戶模式,
且無需
inittab
文件,因此也不在
inittab
中出現,實際上,進入單用戶模式時,
init
直接在控制台
(
/dev/console
)上運行
/sbin/sulogin
。在一般的系統實現中,都使用了
2
、
3
、
4
、
5
幾個級別,在
Redhat
系統中,
2
表示無
NFS
支持的多用戶模式,
3
表示完全多用戶模式(也是最常用的級別),
4
保留給用戶
自定義,
5
表示
XDM
圖像登錄方式。
7
-
9
級別也是能使用的,傳統的
Unix
系統沒有定義這幾個級別。
runlevel
能是並列的多個值,以匹配多個運行級別,對大多數
action
來說,僅當
runlevel
和當前運行級
別匹配成功才會執行。
3. action
action
是描述其后的
process
的運行方式的。
action
可取的值包括:
initdefault
、
sysinit
、
boot
、
bootwait
等:
initdefault
是個特別的
action
值,用於標識缺省的啟動級別;當
init
由核心激活以后,他將讀取
inittab
中的
initdefault
項,取得其中的
runlevel
,並作為當前的運行級別。如果沒有
inittab
文件,或其中沒有
initdefault
項,
init
將在控制台上請求輸入
runlevel
。
sysinit
、
boot
、
bootwait
等
action
將在系統啟動時無條件運行,而忽略其中的
runlevel
。
其余的
action
(不含
initdefault
)都和某個
runlevel
相關。各個
action
的定義在
inittab
的
man
手冊
中有周詳的描述。
4. process
process
為具體的執行程序。程序后面能帶參數。
第三部分:系統初始化
在
init
的設置文件中有這么一行:
si::sysinit:/etc/rc.d/rc.sysinit
他調用執行了
/etc/rc.d/rc.sysinit
,而
rc.sysinit
是個
bash shell
的腳本,他主要
在
init
的設置文件中有這么一行:
si::sysinit:/etc/rc.d/rc.sysinit
他 調用執行了
/etc/rc.d/rc.sysinit
,而
rc.sysinit
是個
bash shell
的腳本,他主要是完成一些系統初始化的
工作,
rc.sysinit
是每一個運行級別都要首先運行的重要腳本。他主要完成的工作有:激活交換分區,檢
查磁盤,加載硬件模塊及其他一些需要優先執行任務。
rc.sysinit
約有
850
多行,不過每個單一的功能還是比較簡單,而且帶有注釋,建議有興趣的用戶能自行
閱讀自己機器上的該文件,以了解系統初始化所周詳情況。由於此文件較長,所以不在本文中列出來,
也不做具體的介紹。
當
rc.sysinit
程序執行完畢后,將返回
init
繼續下一步。
第四部分:啟動對應運行級別的守護進程
在
rc.sysinit
執行后,將返回
init
繼續其他的動作,通常接下來會執行到
/etc/rc.d/rc
程序。以運行級別
5
為例,
init
將執行設置文件
inittab
中的以下這行:
l5:5:wait:/etc/rc.d/rc 5
這一行表示以
5
為參數運行
/etc/rc.d/rc
,
/etc/rc.d/rc
是個
Shell
腳本,他接受
5
作為參數,去執行
/etc/rc.d
/rc5.d/
目錄下的所有的
rc
啟動腳本,
/etc/rc.d/rc5.d/
目錄中的這些啟動腳本實際上都是一些鏈接文件,
而不是真正的
rc
啟動腳本,真正的
rc
啟動腳本實際上都是放在
/etc/rc.d/init.d/
目錄下。而這些
rc
啟動
腳本有着類似的用法,他們一般能接受
start
、
stop
、
restart
、
status
等參數。
/etc/rc.d/rc5.d/
中的
rc
啟動腳本通常是
K
或
S
開頭的鏈接文件,對於以以
S
開頭的啟動腳本,將以
start
參數來運行。而如果發現存在相應的腳本也存在
K
打頭的鏈接,而且已處於運行態了
(
以
/var/lock/subsys/
下的文件作為標志
)
,則將首先以
stop
為參數停止這些已啟動了的守護進程,然后再重新運行。這樣做
是為了確保是當
init
改動運行級別時,所有相關的守護進程都將重啟。
至於在每個運行級中將運行哪些守護進程,用戶能通過
chkconfig
或
setup
中的
"System Services"
來自行
設定。常見的守護進程有:
amd
:自動安裝
NFS
守護進程
apmd:
高級電源管理守護進程
arpwatch
:記錄日志並構建一個在
LAN
接口上看到的以太網地址和
IP
地址對數據庫
autofs
:自動安裝管理進程
automount
,和
NFS
相關,依賴於
NIS
crond
:
Linux
下的計划任務的守護進程
named
:
DNS
服務器
netfs
:安裝
NFS
、
Samba
和
NetWare
網絡文件系統
network
:激活已設置網絡接口的腳本程序
nfs
:打開
NFS
服務
portmap
:
RPC portmap
管理器,他管理基於
RPC
服務的連接
sendmail
:郵件服務器
sendmail
smb
:
Samba
文件共享
/
打印服務
syslog
:一個讓系統引導時起動
syslog
和
klogd
系統日志守候進程的腳本
xfs
:
X Window
字型服務器,為本地和遠程
X
服務器提供字型集
Xinetd
:支持多種網絡服務的核心守護進程,能管理
wuftp
、
sshd
、
telnet
等服務
這些守護進程也啟動完成了,
rc
程序也就執行完了,然后又將返回
init
繼續下一步。
第五部分:建立終端
rc
執行完畢后,返回
init
。這時基本系統環境已設置好了,各種守護進程也已啟動了。
init
接下來會打
開
6
個終端,以便用戶登錄系統。通過按
Alt+Fn(n
對應
1-6)
能在這
6
個終端中轉換。在
inittab
中的以下
6
行就是定義了
6
個終端:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
從上面能看出在
2
、
3
、
4
、
5
的運行級別中都將以
respawn
方式運行
mingetty
程序,
mingetty
程序能打
開終端、設置模式。同時他會顯示一個文本登錄界面,這個界面就是我們經常看到的登錄界面,在這個
登錄界面中會提示用戶輸入用戶名,而用戶輸入的用戶將作為參數傳給
login
程序來驗證用戶的身份。
第六部分:登錄系統,啟動完成
對於運行級別為
5
的圖像方式用戶來說,他們的登錄是通過一個圖像化的登錄界面。登錄成功后能直接
進入
KDE
、
Gnome
等窗口管理器。而本文主要講的還是文本方式登錄的情況:
當我們看到
mingetty
的登錄界面時,我們就能輸入用戶名和密碼來登錄系統了。
Linux
的賬號驗證程序是
login
,
login
會接收
mingetty
傳來的用戶名作為用戶名參數。然后
login
會
對用戶名進行分析:如果用戶名不是
root
,且存在
/etc/nologin
文件,
login
將輸出
nologin
文件的內容,
然后退出。這通常用來系統維護時防止非
root
用戶登錄。只有
/etc/securetty
中登記了的終端才允許
root
用戶登錄,如果不存在這個文件,則
root
能在所有終端上登錄。
/etc /usertty
文件用於對用戶作出附加
訪問限制,如果不存在這個文件,則沒有其他限制。
在分析完用戶名后,
login
將搜索
/etc/passwd
及
/etc/shadow
來驗證密碼及設置賬戶的其他信息,比如:
主目錄是什么、使用何種
shell
。如果沒有指定主目錄,將默認為根目錄;如果沒有指定
shell
,將默認
為
/bin/bash
。
login
程序成功后,會向對應的終端在輸出最近一次登錄的信息
(
在
/var/log/lastlog
中有記錄
)
,並檢查用
戶是否有新郵件
(
在
/usr/spool /mail/
的對應用戶名目錄下
)
。然后開始設置各種環境變量:對於
bash
來說,
系統首先尋找
/etc/profile
腳本文件,並執行他;然后如果用戶的主目錄中存在
.bash_profile
文件,就執
行他,在這些文件中又可能調用了其他設置文件,所有的設置文件執行后后,各種環境變量也設好了,
這時會出現大家熟悉的命令行提示符,到此整個啟動過程就結束了。
4
、相關命令
4.1
、查看當前系統運行等級
[root@test ~]# runlevel
N 5
//’N’
代表先前的
Runlevel; ‘5’
代表目前的
Runlevel
4.2
、切換系統運行等級
#init N
//
切換到運行級別
N
# init 0
//
關機
# init 6
//
重啟動系統
