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這個文件控制了計算機的啟動級別,及該級別下啟動的進程。

[root@hao 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/目錄內,有如下目錄。

[root@Hao 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中允許和不允許啟動的進程,

  再進去目錄看一下。

[root@Hao 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
root@Hao 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中的腳本文件。

[root@Hao 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/

[root@Hao 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中的狀態。

[root@Hao rc.d]# chkconfig --list sshd
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

[root@Hao rc.d]# chkconfig --level 3 sshd off

[root@Hao 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好了。然后重啟就可以了。

 

4.推薦文章

Linux啟動這個很不經意的過程里面包含了太多的內容,本文只是介紹了很小的一部分,推薦大家去深入了解,順便推薦幾篇還不錯的文章。

rc.d rc.local rc.sysinit 等Linux系統腳本啟動順序詳解 作者:jsxubar (朱秀龍) 

Linux2.6 內核的 Initrd 機制解析 作者: dazhi.li(李 大治)

深入理解linux啟動過程 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM