回顧歷史
在linux發展的歷史長河中,按照順序依次出現過三種系統初始化機制,分別是:SysV init,Upstart,Systemd,不需要深究機制這個詞是不是準確,
所謂系統初始化機制,就是它們決定了在系統初始化時候,執行什么操作以及按照什么順序來執行這些操作,三種系統初始化機制各有優缺點,但是后浪總是會把前浪拍在沙灘上,以下優缺點參考自“網路”
- SysV init
SysV init中的服務串行按照順序啟動,保證腳本執行順序,也方便除錯和排錯,但也因為串行啟動,導致系統啟動時間過長,在linux被應用到移動端后這個缺點成了大問題,
- Upstart
upstart通過并行啟動加快執行速度,但對于相互依賴的服務仍然采用并發啟動,它也支持硬體熱插拔時的動態啟動和卸載,
- Systemd
相比于upstart,systemd對于相互依賴的服務它也支持并行啟動,它的按需啟動比upstart更優秀,
這時候有人腦海里面就會閃現出一個問題:如何判斷某個linux系統采用了哪種初始化系統?
因為系統初始化行程是linux啟動的第一個行程,其pid始終為1,因此可以從/proc/1/檔案夾中獲取到一些蛛絲馬跡,在/proc目錄中,有一個名稱為exe的檔案(和windows系統沒有半毛錢關系),
exe檔案指向啟動當前行程的可執行檔案(完整路徑)的符號鏈接,通過查看exe檔案的指向,可以知道當前系統所使用的初始化系統型別,
以下是在兩種不同初始化系統上執行stat /proc/1/exe所得到的結果,從第二行結果可知,第一個系統采用的是Systemd,第二個系統采用的是SysV init初始化(init為其可執行檔案),
為什么例子中沒有Upstart?因為找不到Upstart的系統
[root@ip-172-31-8-32 ~]# stat /proc/1/exe
File: ‘/proc/1/exe’ -> ‘/usr/lib/systemd/systemd’
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
Device: 3h/3d Inode: 66971739 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
root@ip-172-31-9-10:/proc/1# stat /proc/1/exe
File: /proc/1/exe -> /init
Size: 0 Blocks: 0 IO Block: 1024 symbolic link
Device: 33h/51d Inode: 81 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
我是誰?我在哪里?應該到哪里去?
當明確了當前linux系統的初始化系統后,緊接著第二個問題接踵而至:怎么做才能讓初始化系統知道,在系統啟動后要運行kafka或者nginx?
答案和把一頭大象裝入冰箱一樣:1. 打開冰箱門 2. 把大象裝進去 3. 關閉冰箱門
但是細節呢?細節就是1、完成服務腳本 2、將服務腳本放在固定的位置,下面是不同初始化系統放置服務腳本的位置
| SysV init | Upstart | Systemd |
|---|---|---|
| /etc/init.d | /etc/init | /etc/rc.d/init.d |
下面一一更詳細解釋
SysV init
- 撰寫服務腳本,服務腳本主體采用shell語法撰寫,一般應用程式都會提供自啟動腳本,下面為一段例子腳本
#!/bin/bash
#service hello
start() {
echo 'start hello service...'
echo 'start hello service over'
}
stop() {
echo 'stop hello service...'
echo 'stop hello service over'
}
case $1 in
start)
start ;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "valid arg:[start|status|stop|restart]"
esac
exit 0
- 將其放在
/etc/init.d目錄中,service --status-all命令,會列舉/etc/init.d目錄中所有服務,以下結果說明,系統已經認識了服務hello
root@ip-172-31-9-10:/etc/init.d# service --status-all
[ - ] apparmor
[ ? ] apport
[ - ] dbus
[ - ] hello
[ ? ] hwclock.sh
...
- 使用命令
chkconfig --add hello將服務hello添加到開機啟動中, /etc目錄有6個子目錄,可以指定init.d目錄中所包含服務腳本的執行場景,
| 目錄 | level | 執行場景 |
|---|---|---|
| rc0.d | 0 | 關機 |
| rc1.d | 1 | 單用戶模式 |
| rc2.d | 2 | 無網路連接的多用戶命令列模式 |
| rc3.d | 3 | 有網路連接的多用戶命令列模式 |
| rc4.d | 4 | 系統保留 |
| rc5.d | 5 | 帶圖形界面的多用戶模式 |
| rc6.d | 6 | 重新啟動 |
每個目錄中的檔案都鏈接至init.d目錄中的服務腳本,以下為rc0.d目錄內容,其顯示在關機場景時,將rc0.d目錄中所有的服務關閉(K-kill)
root@weidengbai:/etc/rc0.d# ls -l
total 0
lrwxrwxrwx 1 root root 13 Apr 23 2020 K01atd -> ../init.d/atd
lrwxrwxrwx 1 root root 20 Apr 23 2020 K01cryptdisks -> ../init.d/cryptdisks
lrwxrwxrwx 1 root root 25 Apr 23 2020 K01multipath-tools -> ../init.d/multipath-tools
lrwxrwxrwx 1 root root 15 Mar 25 09:48 K01nginx -> ../init.d/nginx
....
當運行chkconfig --add hello命令時,chkconfig 會自動創建對應目錄的軟連接,
Upstart

systemd
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/458186.html
標籤:Linux
上一篇:解決USB在虛擬機不顯示問題
下一篇:圖文詳細程序Linux 使用yum安裝telnet-server、telnet、xinetd以及telnet本機ip
