2021-05-12 14:32:11
CentOS 6.6 執行級別
測試環境: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
相關文章