歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> CentOS 6.6 運行級別

CentOS 6.6 運行級別

日期:2017/2/28 14:22:23   编辑:Linux教程

測試環境:CentOS6.6 x86_64

偶然發現刪除/etc/inittab文件後居然還能進入系統,我記得5系列的會彈出來一個對話選擇運行級別。因此研究了一下。

#之前走了一點彎路,誤以為控制是在/sbin/init 二進制程序裡做的,下載了upstart源碼包,結果沒怎麼看懂 -_-!
#後來發現控制過程在shell腳本裡。
#不過也算有一點收獲
src.rpm解壓源碼方法
rpm2cpio XXX.src.rpm |cpio -ivmd
-i 提取
-v 顯示詳細信息
-m 不改變原文件更改時間
-d 如有需要,cpio會自行創建目錄


另外,管道後面的命令如果不寫 會顯示亂碼,別問我為什麼知道
分割線—————————————————————————————————————————


RHEL5、RHEL6、RHEL7的init系統分別為sysvinit、upstart、systemd。
關於三者差別,請參考

淺析 Linux 初始化 init 系統,第 1 部分: sysvinit http://www.linuxidc.com/Linux/2014-12/110382.htm

淺析 Linux 初始化 init 系統,第 2 部分: UpStart http://www.linuxidc.com/Linux/2014-12/110381.htm

淺析 Linux 初始化 init 系統,第 3 部分: Systemd http://www.linuxidc.com/Linux/2014-12/110383.htm

(這幾篇文檔用Ubuntu做的例子,細節處和RHEL可能有出入。)


CentOS為紅帽的社區企業版,與RHEL差別相當小。 CentOS6.6 同樣使用upstart
----------------------------------------------------------------------------------------------------------

# rpm -qf /sbin/init
upstart-0.6.5-13.el6_5.3.x86_64
=============================================================
upstart把sysvinit原本在/etc/inittab中的rc.sysinit, rc.d等配置拆分,放在/etc/init/下。/etc/inittab變為只負責控制運行級別。

系統內核加載完成後,開始執行第一個進程init。init會執行這樣一個腳本:
/etc/init/rcS.conf

內容如下:
8 start on startup
9
10 stop on runlevel
11
12 task
13
14 # Note: there can be no previous runlevel here, if we have one it's bad
15 # information (we enter rc1 not rcS for maintenance). Run /etc/rc.d/rc
16 # without information so that it defaults to previous=N runlevel=S.
17 console output
18 pre-start script
19 for t in $(cat /proc/cmdline); do
20 case $t in
21 emergency)
22 start rcS-emergency
23 break
24 ;;
25 esac
26 done
27 end script
28 exec /etc/rc.d/rc.sysinit
29 post-stop script
30 if [ "$UPSTART_EVENTS" = "startup" ]; then
31 [ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)
32 [ -z "$runlevel" ] && runlevel="3"
33 for t in $(cat /proc/cmdline); do
34 case $t in
35 -s|single|S|s) runlevel="S" ;;
36 [1-9]) runlevel="$t" ;;
37 esac
38 done
39 exec telinit $runlevel
40 fi
41 end script

和runlevel有關的是30-32行:
30 if [ "$UPSTART_EVENTS" = "startup" ]; then
31 [ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)
32 [ -z "$runlevel" ] && runlevel="3"
#----------------------------------------------------------------------------------------------------
30行:如果觸發的 EVENT是“startup”就執行後面的內容。

31 行:/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab的意思是:以“:”作為字段分隔符,找出 /etc/inittab裡面 第三個字段是initdefault,並且不是以“#”開頭的行(#開頭一般為注釋),然後提取出第二個字段。

連起來就是:如果存在/etc/inittab 這個文件,runlevel的值就取剛才提取的字符串。

32行:如果現在runlevel為空,就讓runlevel取“3”。這個值可以改。不過最好還是3。

所以刪掉inittab ,第32行後半段賦值語句生效,最後運行級別就是3。

修改CentOS 6.3啟動級別以及啟動級別配置錯誤的修改問題 http://www.linuxidc.com/Linux/2013-05/84200.htm

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

Copyright © Linux教程網 All Rights Reserved