首頁 > 軟體

簡介RHEL7上的Systemd

2020-06-16 17:48:57

Abstract: Systemd 有爭議,但是Fedora,SFedora,SUSE,Rhel 都逐漸投向了systemd。都逐漸投向了systemd。 我們將會學習使用systemd 控制系統啟動systemd。 我們將會學習使用systemd 控制系統啟動,管理服務,檢視紀錄檔。 我們將會學習使用systemd 控制系統啟動,管理服務,檢視紀錄檔 我們將會學習使用systemd 控制系統啟動,管理服務,檢視紀錄檔我們將會學習使用systemd 控制系統啟動,管理服務,檢視紀錄檔systemd 控制系統啟動,管理服務,檢視紀錄檔控制系統啟動,管理服務,檢視紀錄檔

“SystemD 入門”

Systemd 簡介:

systemd 是由Lennart Poettering帶頭開發,並在LGPL 2.1及其後續版本許可證下開源發布。其開發目標是提供更優秀的框架以表示系統服務間的依賴關係,並依此實現系統初始化時服務的並行啟動,同時達到降低Shell的系統開銷的效果,最終代替現在常用的System V與BSD風格init程式。(來自維基百科)

Systemd 存在爭議,但是Fedora,Suse,Rhel 都逐漸投向了systemd,本文將在Rhel 7 上使用systemd,帶領讀者學習使用systemd 控制系統啟動,檢視紀錄檔,管理服務。

系統啟動:

我們首先來回憶下過去,/sbin/init 作為PID 為1的進程首先啟動,然後fork (clone)其他的進程,按照/etc/inittab裡面的設定選擇runlevel, 並從/etc/rc* /etc/init.d/ 下面選擇相應的啟動指令碼來啟動服務。而現在PID 為1的進程變成了sytemd ,(PID 0是核心進程)在我的機器上則顯示為:

[root@22062 ~]# ps -ef

UID PID PPID C STIME TTY TIME CMD

root 1 0 0 Jan14 ? 00:01:51 /usr/lib/systemd/systemd --system --deserialize 17

由systemd來spawn其他的進程。

而Runlevel 則變成了 Target:

graphical.target=5

multiuser.target=3

下面是一些常用的的命令:

檢視default target: systemctl get-default

修改default target: systemctl set-default []

實時修改:systemctl isolate []

檢視啟動時間:systemd-analyze 

檢視單項任務啟動的時間開銷: systemd-analyze blame

檢視任務之間的依賴關係: systemctl list-dependencies

(註:/etc/inittab 不再使用,為向上相容保留了runlevel5.target,runlevel3.target)

管理服務:

在以前,預設的啟動指令碼都放在/etc/init.d /etc/rc*下面。

Systemd 使用Unit file 來控制服務。

控制檔案: /usr/lib/systemd/system

控制檔案: /etc/systemd/system

執行時資料: /run/systemd

(註:/etc 目錄下的檔案具有更高優先順序)

我在這台機器上裝了HTTPD,我們來看一下HTTPD服務的狀態。

[root@22062 ~]# systemctl status httpd

httpd.service - The Apache HTTP Server

Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)

Active: active (running) since Wed 2015-01-21 03:46:34 EST; 4 days ago

Process: 18544 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)

Main PID: 10701 (httpd)

Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"

CGroup: /system.slice/httpd.service

├─10701 /usr/sbin/httpd -DFOREGROUND

├─18556 /usr/sbin/httpd -DFOREGROUND

├─18557 /usr/sbin/httpd -DFOREGROUND

├─18558 /usr/sbin/httpd -DFOREGROUND

├─18559 /usr/sbin/httpd -DFOREGROUND

└─18560 /usr/sbin/httpd -DFOREGROUND

SystemD預設我們這裡輸入都是Service,所以

systemctl status httpd 等同於 systemctl status httpd.service , Rhel 7 會把service httpd status 重定向到 systemctl status httpd.

關閉httpd服務:systemctl stop httpd

systemctl disable httpd ( 等同於以前的chkconfig httpd off)

重新啟動/重新載入:systemctl restart httpd / systemctl reload httpd

檢視httpd 服務是否是自啟動的:systemctl is-enable httpd

檢視httpd 是否啟動: systemctl is-active httpd

檢視httpd 的狀態: systemctl status httpd

檢視所有服務的狀態:systemctl

以樹狀方式檢視服務:systemd-cgls 

systemd-cgls 給出的樹狀結構非常具體,可以看到Cgroup ,服務,進程之間的層級)

在這裡,我省略了一些輸出。 (註:slice 並不是服務的容器)

└─system.slice

├─httpd.service

│ ├─10701 /usr/sbin/httpd -DFOREGROUND

│ ├─18556 /usr/sbin/httpd -DFOREGROUND

│ ├─18557 /usr/sbin/httpd -DFOREGROUND

│ ├─18558 /usr/sbin/httpd -DFOREGROUND

│ ├─18559 /usr/sbin/httpd -DFOREGROUND

│ └─18560 /usr/sbin/httpd -DFOREGROUND

控制檔案:

下面我們來看httpd的控制檔案,這個檔案是軟體安裝時自動生成的,我們也可以在/etc/systemd/system/再生成一個httpd.service 檔案,那麼/lib/systemd/system/下的同名檔案內容將會被覆蓋。

[root@22062 ~]# cat /lib/systemd/system/httpd.service 

[Unit]

Description=The Apache HTTP Server

After=network.target remote-fs.target nss-lookup.target

[Service]

Type=notify

EnvironmentFile=/etc/sysconfig/httpd

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND

ExecReload=/usr/sbin/httpd $OPTIONS -k graceful

ExecStop=/bin/kill -WINCH ${MAINPID}

# We want systemd to give httpd some time to finish gracefully, but still want

# it to kill httpd after TimeoutStopSec if something went wrong during the

# graceful stop. Normally, Systemd sends SIGTERM signal right after the

# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give

# httpd time to finish.

KillSignal=SIGCONT

PrivateTmp=true

[Install]

WantedBy=multi-user.target

停止服務: 

systemctl stop httpd 或者 systemctl kill httpd 

這兩個命令都能停止服務,但實現過程不同。

kill 是直接傳送SIGTERM 給這個Cgroup,而stop 則是按照httpd 這個Unit的設定,ExecStop=/bin/kill -WINCH ${MAINPID}是stop 真正呼叫的命令。

檢視紀錄檔:

在Systemd 內部它提供了一個紀錄檔,該紀錄檔會記錄syslog,Kernel log,boot messages.

你可以把他當作一個syslog/rsyslog 的替代品。

簡單的輸入journalctl 就能檢視紀錄檔。紀錄檔儲存在 /run/systemd/journal/

Systemd 小結:

本文僅僅是systemd入門知識,在Rhel 7上做了些簡單的實驗。

Systemd 的引入是很大的變化,體現在並行啟動,cgroup管理服務,對於資源的管理, 對於容器的管理,systemd 有很多內容值得挖掘。

CentOS7/RHEL7 systemd詳解   http://www.linuxidc.com/Linux/2015-04/115937.htm

為什麼systemd會被如此迅速的採用? http://www.linuxidc.com/Linux/2014-08/105789.htm

systemd 與 sysVinit 彩版對照表 http://www.linuxidc.com/Linux/2014-09/106455.htm

太有用了!用systemd命令來管理Linux系統!  http://www.linuxidc.com/Linux/2014-09/106490.htm

淺析 Linux 初始化 init 系統,第 3 部分: Systemd  http://www.linuxidc.com/Linux/2014-12/110383.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-12/126196.htm


IT145.com E-mail:sddin#qq.com