1. 程式人生 > >Linux 啟動詳解之init執行過程

Linux 啟動詳解之init執行過程

Linux 啟動詳解之init

1.init初探 init是Linux系統操作中不可缺少的程式之一。init程序,它是一個由核心啟動的使用者級程序,然後由它來啟動後面的任務,包括多使用者環境,網路等。

 核心會在過去曾使用過init的幾個地方查詢它,它的正確位置(對Linux系統來說)是/sbin/init。如果核心找不到init,它就會試著執行/bin/sh,如果執行失敗,系統的啟動也會失敗。

 根據實際看一下,我們來到/boot下,



 可以看見,Grub就在這裡,vmlinuz-2.6.32-358.el6.i686這個檔案很重要,說通俗一點的話應該是我們的核心,在啟動後加載所有驅動(這個有另外的章節再講,這裡不詳述)。另外initramfs-2.6.32-358.el6.i686.img是啟動init程序的一個映象檔案,包含一個最小的linux系統。

 Linux核心在初始化之後會執行init程序,而init程序會掛載我們的根檔案系統,但由於init程式也是在根檔案系統上的,所以這就有了悖論。Linux採用兩步走的方法來解決這個問題。Linux2.6版以前的方法是:除了核心vmlinuz之外還有一個獨立的initrd.img映像檔案,其實它就是一個檔案系統映像,linux核心在初始化後會mount initrd.img作為一個臨時的根檔案系統,而init程序就是在initrd.img裡的,然後init程序會掛載真正的根檔案系統,然後umount initrd.img。但Linux2.6核心的實現方式卻不太一樣,雖然完成的功能是一樣的。Linux2.6採用initramfs。initramfs:init ram filesystem,它是一個cpio格式的記憶體檔案系統,其實這部分也有很多內容可以講,我們以後再談。

通常的步驟是先啟動核心,然後核心掛載initrd.img,並執行裡面的指令碼來進一步掛載各種各樣的模組,然後發現真正的root分割槽,掛載並執行/sbin/init。

如果沒有這個檔案,計算機的啟動時第一個程序都啟動不起來。有他存在1號程序才可以開啟。相當於是一個指揮官,他要指揮哪些程式在啟動時應當存在,哪些程式不應當存在。/etc/inittab檔案是init在啟動時讀取的檔案,也就是指揮官的決策書,這個決策書規定了當前戰爭的局勢,比如和平局勢、冷戰局勢、戰爭局勢。以及該局勢下的核心策略。init就是這樣,通過inittab這個檔案控制了計算機的啟動級別,及該級別下啟動的程序。

複製程式碼 [[email protected]

boot]# cat /etc/inittab

Default runlevel. The runlevels used 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:5:initdefault: 複製程式碼   從這裡可以看出,我這裡linux的default啟動級別是runevel 5(注意,此處不要擅自改為6,如果預設的runlevel是6,那麼就會比較麻煩,為什麼會這麼說,看完下面每個級別具體對應的程序就會明白)。那麼具體每個級別都是什麼呢?其實每個級別都有若干個程序,只不過每個級別開的程序不同。

0:幾乎所有程序都關閉,停機狀態

1:單使用者模式,root賬戶進行操作

2:多使用者,不能使用net file system,一般很少用

3:完全多使用者,一部分啟動,一部分不啟動,命令列介面

4:未使用、未定義的保留模式

5:圖形化,3級別中啟動的程序都啟動,並且會啟動一部分圖形介面程序。

6:停止所有程序,解除安裝檔案系統,重新啟動

這些級別中1、2、4很少用,相對而言0、3、5、6用的會較多。3級別和5級別除了桌面相關的程序外沒有什麼區別。為了減少資源佔用,推薦都用3級別。

那麼這些級別是如何定義的呢,在/etc/rc.d/目錄內,有如下目錄。

複製程式碼 [[email protected] rc.d]# ll total 60 drwxr-xr-x. 2 root root 4096 Mar 11 13:44 init.d -rwxr-xr-x. 1 root root 2617 Feb 22 2013 rc drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc0.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc1.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc2.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc3.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc4.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc5.d drwxr-xr-x. 2 root root 4096 Apr 3 08:36 rc6.d -rwxr-xr-x. 1 root root 220 Feb 22 2013 rc.local -rwxr-xr-x. 1 root root 19472 Feb 22 2013 rc.sysinit 複製程式碼   在諸如rc3.d和rc5.d目錄下有runlevel 3 和runlevel 5中允許和不允許啟動的程序,

再進去目錄看一下。

複製程式碼 [[email protected] rc.d]# ls rc3.d/ K01smartd K69rpcsvcgssd S10network S26acpid K02oddjobd K73winbind S11auditd S26haldaemon K05wdaemon K75ntpdate S11portreserve S26udev-post K10psacct K75quota_nld S12rsyslog S28autofs K10saslauthd K76ypbind S13cpuspeed S50bluetooth K15htcacheclean K80kdump S13irqbalance S58ntpd K15httpd K84wpa_supplicant S13rpcbind S80postfix K15svnserve K87restorecond S15mdmonitor S82abrt-ccpp K25sshd K88sssd S22messagebus S82abrtd K30spice-vdagentd K89rdisc S23NetworkManager S90crond K36mysqld K95firstboot S24nfslock S95atd K50dnsmasq K99rngd S24rpcgssd S99certmonger K50netconsole S01sysstat S24rpcidmapd S99local K50snmpd S02lvm2-monitor S25blk-availability K50snmptrapd S08ip6tables S25cups K60nfs S08iptables S25netfs 複製程式碼 複製程式碼 [email protected] rc.d]# ls rc5.d/ K01smartd K75ntpdate S11portreserve S26udev-post K02oddjobd K75quota_nld S12rsyslog S28autofs K05wdaemon K76ypbind S13cpuspeed S50bluetooth K10psacct K80kdump S13irqbalance S55sshd K10saslauthd K84wpa_supplicant S13rpcbind S58ntpd K15htcacheclean K87restorecond S15mdmonitor S70spice-vdagentd K15httpd K88sssd S22messagebus S80postfix K15svnserve K89rdisc S23NetworkManager S82abrt-ccpp K36mysqld K95firstboot S24nfslock S82abrtd K50dnsmasq K99rngd S24rpcgssd S90crond K50netconsole S01sysstat S24rpcidmapd S95atd K50snmpd S02lvm2-monitor S25blk-availability S99certmonger K50snmptrapd S08ip6tables S25cups S99local K60nfs S08iptables S25netfs K69rpcsvcgssd S10network S26acpid K73winbind S11auditd S26haldaemon 複製程式碼   這些都是連結檔案lrwxrwxrwx,連結的路徑都是/etc/init.d中的指令碼檔案。

[[email protected] rc.d]# ll rc3.d/ | grep ab lrwxrwxrwx. 1 root root 19 Feb 10 19:46 S08ip6tables -> …/init.d/ip6tables lrwxrwxrwx. 1 root root 18 Feb 10 19:44 S08iptables -> …/init.d/iptables lrwxrwxrwx. 1 root root 26 Feb 10 19:51 S25blk-availability -> …/init.d/blk-availability lrwxrwxrwx. 1 root root 19 Feb 10 19:46 S82abrt-ccpp -> …/init.d/abrt-ccpp lrwxrwxrwx. 1 root root 15 Feb 10 19:46 S82abrtd -> …/init.d/abrtd   K開頭的檔案意味著是要關閉程序的檔案,S開頭的程序則是開啟的程序,之後的數字表示啟動的順序,比如S23NetworkManager和S80postfix都要依賴S10network,如果這個順序錯了或者電腦了,那麼和網路有關的程式都會啟動錯誤,這個也在管理伺服器的過程中也需要定期去看一下。

對比rc3.d/目錄與rc5.d/

[[email protected] rc.d]# diff rc3.d/ rc5.d/ Only in rc3.d/: K30spice-vdagentd Only in rc5.d/: S70spice-vdagentd   發現spice-vdagentd服務在runlevel 3中是KILL的,在runleve5是START的,spice-vdagentd服務是Redhat桌面虛擬元件之一,所以在runlevel3中沒必要開,在runleve5中是要開啟的,否則Linux將無法提供桌面服務,除此之外,兩個執行級別沒區別。

還記得那個之前提到的決策書嗎?核心策略對應的會啟動的內容都是在這裡,比如和平局勢(之於runlevel 1)下啟用基本的民防系統(之於S01sysstat)就可以了,冷戰時期(之於runlevel 3)除了民防以外,還開啟了自衛系統(之於S08iptables)、訊息傳遞(S10network)、警報機制(之於S22messagebus)、派遣間諜(之於sshd)、調動步兵部隊(之於httpd)等等,如果是戰爭時期(之於runlevel 5)除了上面種種之外還要啟動更多的戰爭活動,排程更強大的部隊。

2.相關命令 通過chkconfig –level 3 sshd off在執行級別中的開啟或者關閉服務。

通過chkconfig –list sshd來檢視sshd在所有runlevel中的狀態。

複製程式碼 [[email protected] rc.d]# chkconfig --list sshd sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

[[email protected] rc.d]# chkconfig --level 3 sshd off

[[email protected] rc.d]# chkconfig --list sshd sshd 0:off 1:off 2:on 3:off 4:on 5:on 6:off 複製程式碼 init 6是重啟,init 0是關機。

who –r 檢視當前級別

run-level 5 2012-09-02 06:23

3.附文1.不小心把init 預設的執行級別設為6怎麼辦   通過檢視 /etc/rc.d/rc6.d可以看到,runlevel 6中只有兩個服務是開啟的,分別是 S00killall和S01reboot,如果預設的執行級別設為6,那麼重啟之後,機器會不停重啟。

如果真的意(shou)外(jian)把預設的runlevel執行級別設定成了6,那麼需要如下操作更改預設執行級別。在GRUB介面按e

然後選中第二行,再按e進入

在出現的命令列後加 [\空格]1 (單使用者),按Enter鍵確認操作並後退到Linux配置頁面

再按b重啟Linux進入單使用者模式就可以修改了,我們這裡改為3好了。然後重啟就可以了。