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(李 大治)