首頁 > 軟體

CentOS 6.6 執行級別

2020-06-16 18:07:10

測試環境: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


IT145.com E-mail:sddin#qq.com