淺談init進程

一、什麼是init進程

在介紹init進程前我們先了解下什麼是進程
1.進程的概念

所謂進程就是系統中正在運行的程序,進程是操作系統的概念,每當我們執行一個程序時,對於操作系統來講就是創建了一個進程,在這個過程中操作系統對進程資源的分配和釋放,可以認爲進程就是一個程序的一次執行過程。
2.Linux下的三個特殊進程

Linux下有三個特殊的進程idle進程(PID=0),init進程(PID=1),和kthreadd(PID=2)
idle進程由系統自動創建,運行在內核態
idle進程其pid=0,其前身是系統創建的第一個進程,也是唯一一個沒有通過fork或者kernel_thread產生的進程。完成加載系統後,演變爲進程調度、交換。
kthreadd進程由idle通過kernel_thread創建,並始終運行在內核空間,負責所有內核進程的調度和管理。
它的任務就是管理和調度其他內核線程kernel_thread, 會循環執行一個kthread的函數,該函數的作用就是運行kthread_create_list全局鏈表中維護的kthread, 當我們調用kernel_thread創建的內核線程會被加入到此鏈表中,因此所有的內核線程都是直接或者間接的以kthreadd爲父進程 。
init進程由idle通過kernel_thread創建,在內核空間完成初始化後,加載init程序
在這裏我們就主要講解下init進程,init進程由0進程創建,完成系統的初始化,是系統中所有其他用戶進程的祖先進程
Linux中的所有進程都是由init進程創建並運行的。首先Linux內核啓動,然後在用戶空間中啓動init進程,再啓動其他系統進程。在系統啓動完成後,init將變成爲守護進程監視系統其他進程。
所以說init進程是Linux系統操作中不可缺少的程序之一,如果內核找不到init進程就會試着運行/bin/sh,如果運行失敗,系統的啓動也會失敗。

二、運行級別

init服務的配置文件是/etc/inittab
在centos7之前inittab的配置文件是這樣的

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# 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:

裏面介紹了init的6個運行級別
0是關機

1是單用戶

2是多用戶,不聯網

3是多用戶

4是不使用的

5是xwindows,也就是有界面的

6是重啓

init命令很簡單。直接輸入init + 你想要的模式 回車就行。
我們可以使用runlevel命令來查詢當前系統的運行級別。
比如 輸入 : init 0 就是關機

init 3 就是切換到多用戶

init 5 就是切換到界面

init 6 就是重啓
但是千萬不要把initdefault設置爲0或者6
但是在centos7之後有了一個新的服務systemd取代了init,
systemd 是 Linux 下一個與 SysV 和 LSB 初始化腳本兼容的系統和服務管理器。在這裏我也不過多介紹了,大家有興趣可以自行研究下。

三、init運行級別的定義

init的運行級別配置是在/etc/init,而這些級別的定義是在/etc/rc.d目錄內的如下:

[root@centos6 rc.d]# ll
total 60
drwxr-xr-x. 2 root root  4096 Jan  9 02:30 init.d
-rwxr-xr-x. 1 root root  2617 Mar 23  2017 rc
drwxr-xr-x. 2 root root  4096 Jan  9 02:30 rc0.d
drwxr-xr-x. 2 root root  4096 Jan  9 02:30 rc1.d
drwxr-xr-x. 2 root root  4096 Jan  9 18:39 rc2.d
drwxr-xr-x. 2 root root  4096 Jan  9 18:39 rc3.d
drwxr-xr-x. 2 root root  4096 Jan  9 18:39 rc4.d
drwxr-xr-x. 2 root root  4096 Jan  9 18:39 rc5.d
drwxr-xr-x. 2 root root  4096 Jan  9 02:30 rc6.d
-rwxr-xr-x. 1 root root   220 Mar 23  2017 rc.local
-rwxr-xr-x. 1 root root 20199 Mar 23  2017 rc.sysinit

這裏的rc{0..6}.目錄對應相應的級別裏面放的都是要啓動和關閉的進程我們進去看一下

[root@centos6 rc3.d]# ls
K01smartd          K69rpcsvcgssd      K95firstboot     S13irqbalance        S26udev-post
K02oddjobd         K73winbind         K99rngd          S13rpcbind           S28autofs
K05wdaemon         K74ntpd            S01sysstat       S15mdmonitor         S50bluetooth
K10psacct          K75ntpdate         S02lvm2-monitor  S22messagebus        S55sshd
K10saslauthd       K75quota_nld       S05rdma          S23NetworkManager    S80postfix
K15htcacheclean    K76ypbind          S08ip6tables     S24nfslock           S82abrtd
K15httpd           K84wpa_supplicant  S08iptables      S24rpcgssd           S83abrt-ccpp
K30spice-vdagentd  K87restorecond     S10network       S25blk-availability  S90crond
K50dnsmasq         K88sssd            S11auditd        S25cups              S95atd
K50kdump           K89netconsole      S11portreserve   S25netfs             S99certmonger
K60nfs             K89rdisc           S12rsyslog       S26acpid             S99local
K61nfs-rdma        K92pppoe-server    S13cpuspeed      S26haldaemon

這裏以K開頭的都是要關閉的進程,而以S開頭的則是要啓動的進程

[root@centos6 rc6.d]# ls
K01certmonger    K25sshd            K74haldaemon         K84wpa_supplicant  K90network
K01smartd        K30postfix         K74ntpd              K85mdmonitor       K92ip6tables
K02oddjobd       K30spice-vdagentd  K75blk-availability  K85messagebus      K92iptables
K05atd           K50dnsmasq         K75netfs             K87irqbalance      K92pppoe-server
K05wdaemon       K50kdump           K75ntpdate           K87restorecond     K95firstboot
K10cups          K60crond           K75quota_nld         K87rpcbind         K95rdma
K10psacct        K60nfs             K75udev-post         K88auditd          K99cpuspeed
K10saslauthd     K61nfs-rdma        K76ypbind            K88rsyslog         K99lvm2-monitor
K15htcacheclean  K69rpcsvcgssd      K83bluetooth         K88sssd            K99rngd
K15httpd         K72autofs          K83nfslock           K89netconsole      K99sysstat
K16abrt-ccpp     K73winbind         K83rpcgssd           K89portreserve     S00killall
K16abrtd         K74acpid           K84NetworkManager    K89rdisc           S01reboot

像rc6.d目錄中基本都是要關閉的進程,只有S00killall和S01reboot這兩個要啓動的進程他們分別是結束所有進程和重啓系統。這裏文件中的數字代表了他們的優先級,數字越小優先啓動。所以我們自己做的服務放在這個目錄中時要謹慎以免因爲他所需的關聯程序沒有啓動而導致進程無法啓動。
PS:如果真的不小心把init默認運行級別設置爲0或6的解決辦法
我們知道init0和6級別分別對應的是關機和重啓,如果把這兩個設爲默認運行級別我們是無法進入系統的,所以我們就要藉助救援系統了,在開機GRUB界面按e如下:
淺談init進程
選擇kernel這行接着按e
淺談init進程
在命令行最後輸入1(進入單用戶模式),回車退後到上個界面
淺談init進程
接着按b進入單用戶模式,我們這就進入到單用戶模式了
淺談init進程
我們只需要進入/etc/inittab配置文件中把最後的0或6改爲3,重啓系統就可以啦
淺談init進程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章