CentOS 7 中 Systemd詳解

來源:互聯網
上載者:User

標籤:html   登入   救援   hostname   wan   計算   判斷語句   檔案   接收   


CentOS 7 中 Systemd詳解

[日期:2016-12-01] 來源:Linux社區  lxlxlx [字型:大 中 小] 


  

 
  

 

目錄
     一、systemd的由來
     二、systemd
     三、服務管理
     1、systemctl2
     2、服務查看
     3、服務狀態
     4、hostnamectl
     5、localectl
     6、 timedatectl
     7、loginctl
     四、unit
     1、Unit類型
     2、systemctl list-units命令可以查看當前系統的所有 Unit
     3、unit狀態
     4、依賴關係
     五、unit設定檔
     1、概述
     2、設定檔狀態
     3、設定檔格式
     1)unit設定檔格式
     2)Unit段的常用選項
     3)service常用的選項
     4)install 常用選項
     六、Target
     1、Target命令
     2、Target與傳統 RunLevel 的對應關係如下
     3、它與init進程的主要差別如下
     七、日誌管理
     1、journalctl功能強大,用法非常多
     2、查看指定優先順序(及其以上層級)的日誌,共有8級

一、systemd的由來
Linux一直以來採用init進程但是init有兩個缺點:
1、啟動時間長。Init進程是串列啟動,只有前一個進程啟動完,才會啟動下一個進程。(這也是CentOS5的主要特徵)
2、啟動指令碼複雜。Init進程只是執行啟動指令碼,不管其他事情。指令碼需要自己處理各種情況,這使得指令碼變得很長而且複雜。
Init:
   Centos 5 Sys init 是啟動速度最慢的,串列啟動過程,無論進程相互之間有無依賴關係。
   Centos6 Upstart init 相對啟動速度快一點有所改進。有依賴的進程之間依次啟動而其他與之沒有依賴關係的則並行同步啟動。
   Centos7 Systemd 與以上都不同。所有進程無論有無依賴關係則都是並行啟動(當然很多時候進程沒有真正啟動而是只有一個訊號或者說是標記而已,在真正利用的時候才會真正啟動。)
二、systemd
   Systemd為瞭解決上文的問題而誕生。它的目標是,為系統的啟動和管理提供一套完整的解決方案。根據linux慣例,字母d是守護進程(daemon) 的縮寫。Systemd名字的含義就是 守護整個系統。
   Centos 7裡systemd代替了init,成為了系統的第一個進程。PID為1.其他所有的進程都是它的子進程。Systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常複雜。事實上,現在還有很多人反對使用 Systemd,理由就是它過於複雜,與作業系統的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。

    Systemd 架構圖


 
三、服務管理
   1、systemctl
         Systemctl是systemd的主要命令,用於管理系統。
Centos  7 :service unit
注意:能相容早期的服務指令碼
   命令格式
    
#systemctl COMMAND name.service
     重啟系統
     #  systemctl reboot
     關閉系統,切斷電源
     #  systemctl poweroff
     CPU停止工作
     #  systemctl halt
     暫停系統
     #  systemctl suspend
     讓系統進入冬眠狀態
     #  systemctl hibernate
     讓系統進入互動式休眠狀態
     #  systemctl hybrid-sleep
     啟動進入救援狀態(單使用者狀態)
     # systemctl rescue
     啟動服務
     #service name start ==> systemctl start name.service
     停止服務
     #service name stop ==> systemctl  stop name.service
     重啟服務
     #service name restart ==> systemctl restart name.service
     查看服務狀態
     #service name status ==> systemctl status name.service
     條件式重啟:已啟動才重啟,否則不做操作
     #service name condrestart ==> systemctl tryrestart name.service
     重載或重啟服務:先載入,再啟動
     #systemctl reload-or-restart name.service
     重載或條件式重啟服務:
     #systemctl reload-or-try-restart name.service
     禁止自動和手動啟動:
     #systemctl mask name.service
     取消禁止:
     #systemctl unmask name.service

  2、服務查看:
   查看所有服務的開機自啟狀態:
     chkconfig --list ==> systemctl list-unit-files --type service
     用來列出該服務在哪些運行層級下啟用和禁用
     chkconfig sshd –list  ==>ls /etc/systemd/system/*.wants/sshd.service
     查看服務是否開機自啟:
     systemctl is-enabled name.service
     其它命令:
     查看服務的依賴關係:
     systemctl list-dependencies name.service
     殺掉進程:
     systemctl kill 進程名
     顯示某個 Unit 的所有底層參數
     # systemctl show httpd.service
     顯示某個 Unit 的指定屬性的值
     # systemctl show -p CPUShares httpd.service
     設定某個 Unit 的指定屬性
     # sudo systemctl set-property httpd.service CPUShares=500


   3、服務狀態:
     顯示狀態
     systemctl list-unit-files --type service –all 
     loaded:Unit 設定檔已處理
     active(running)一次或多次持續處理的運行
     active(exited)成功完成一次性的配置
     active(waiting)運行中,等待一個事件
     inactive不運行
     enabled開機啟動
     disabled開機不啟動
     static開機不啟動,但可被另一個啟用的服務啟用

4、hostnamectl
hostnamectl命令用於查看當前主機的資訊。
  顯示當前主機的資訊
# hostnamectl
設定主機名稱。
# hostnamectl set-hostname rhel7

5、localectl
localectl命令用於查看本地化設定。
  查看本地化設定
# localectl
# 設定本地化參數。
# localectl set-locale LANG=en_GB.utf8
# localectl set-keymap en_GB

6、 timedatectl
123456789 timedatectl
timedatectl命令用於查看當前時區設定。
查看當前時區設定
顯示所有可用的時區
# timedatectl list-timezones                                                                                   
# 設定當前時區
$# timedatectl set-timezone America/New_York
# timedatectl set-time YYYY-MM-DD
# timedatectl set-time HH:MM:SS

7、loginctl
loginctl命令用於查看當前登入的使用者。
# 列出當前session
# loginctl list-sessions
# 列出當前登入使用者
# loginctl list-users
# 列出顯示指定使用者的資訊
# loginctl show-user (ruanyf) 使用者

四、unit
Systemd可以管理系統中所有資源。不同的資源統稱為unit(單位)。Unit表示不同類型的systemd對象,通過設定檔進程標識和配置;檔案中主要包含了系統服務、監聽socket、儲存的系統快照以及其它與init相關的資訊。
1、Unit類型
Unit一共分為12種。
Sysstemctl  –t help 查看unit類型
Service unit:副檔名為.Service,用於定義系統服務
Target unit : 檔案名稱擴充為.target,用於類比實現“運行層級”
Device unit :.device ,用於定義檔案核心識別裝置
Mount unit: .mount 定義檔案系統掛載點。
Socket unit: .socket, 用於標識處理序間通訊用的socket檔案,也可在系統啟動時,延遲啟動服務,實現按需啟動
Snapshot unit: .snapshot, 管理系統快照
Swap unit: .swap, 用於標識swap裝置
Automount unit: .automount,檔案系統的自動掛載點
Path unit: .path,用於定義檔案系統中的一個檔案或目錄使用,常用於當檔案系統變化時,延遲啟用服務,如:spool目錄
Scope unit :不是由systemd啟動的外部進程
Slice unit :進程組
Timer unit :定時器


2、systemctl list-units命令可以查看當前系統的所有 Unit 。
  列出正在啟動並執行 Unit
# systemctl list-units
  列出所有Unit,包括沒有找到設定檔的或者啟動失敗的
# systemctl list-units --all
  列出所有沒有啟動並執行 Unit
# systemctl list-units --all --state=inactive
  列出所有載入失敗的 Unit
# systemctl list-units --failed
  列出所有正在啟動並執行、類型為 service 的 Unit
# systemctl list-units --type=service


3、unit狀態
systemctl status命令用於查看系統狀態和單個 Unit 的狀態。
  顯示系統狀態
#systemctl status
  顯示單個 Unit 的狀態
# sysystemctl status bluetooth.service
  顯示遠程主機的某個 Unit 的狀態
# systemctl -H [email protected] status httpd.service
除了status命令,systemctl還提供了三個查詢狀態的簡單方法,主要供指令碼內部的判斷語句使用。


  顯示某個 Unit 是否正在運行
# systemctl is-active application.service
  顯示某個 Unit 是否處於啟動失敗狀態
# systemctl is-failed application.service
  顯示某個 Unit 服務是否建立了啟動連結
# systemctl is-enabled application.service
4、依賴關係
Unit 之間存在依賴關係:A 依賴於 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。
#systemctl list-dependencies命令列出一個 Unit 的所有依賴。
# systemctl list-dependencies nginx.service
上面命令的輸出結果之中,有些依賴是 Target 類型(詳見下文),預設不會展開顯示。如果要展開 Target,就需要使用--all參數。
# systemctl list-dependencies --all nginx.service


五、unit設定檔
1、概述
每一個 Unit 都有一個設定檔,告訴 Systemd 怎麼啟動這個 Unit 。
Systemd 預設從目錄/etc/systemd/system/讀取設定檔。但是,裡面存放的大部分檔案都是符號連結,指向目錄/usr/lib/systemd/system/,真正的設定檔存放在那個目錄。


systemctl enable httpd.service命令用於在上面兩個目錄之間,建立符號連結關係。(Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.)等同於 ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service。當然systemdctl  diable  httpd.service 則相當於刪除這個軟串連。

/usr/lib/system/system:每個服務最主要的啟動指令碼設定,類似於之前的/etc/init.d/
/run/system/system:系統執行過程中所產生的服務指令碼,與上面目錄優先運行。
/etc/systemd/system:管理員建立的執行指令碼,類似於/etc/rc.d/rcN.d/Sxx的功能,比上面目錄優先運行。


2、設定檔狀態
systemctl list-unit-files命令用於列出所有設定檔。
  列出所有設定檔
#systemctl list-unit-files
  列出指定類型的設定檔
#systemctl list-unit-files --type=service


  systemctl list-unit-files該命令會輸出一個列表,從中可以看到每個設定檔的狀態。
   Unit config filestatus
lvm2-lvmetad.service                        disabled
lvm2-lvmetad.socket                        enabled
lvm2-lvmpolld.service                      disabled
lvm2-lvmpolld.socket                        enabled


這個列表顯示每個設定檔的狀態,一共有四種。
enabled:已建立啟動連結
disabled:沒建立啟動連結
static:該設定檔沒有[Install]部分(無法執行),只能作為其他設定檔的依賴
masked:該設定檔被禁止建立啟動連結
注意,從設定檔的狀態無法看出,該 Unit 是否正在運行。這必須執行前面提到的systemctl status命令。
# systemctl status httpd.service


3、設定檔格式
1)unit設定檔格式
  [Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
[Install]
WantedBy=multi-user.target
[unit] :定義與Unit類型無關的通用選項;用於提供unit的描述資訊、 unit行為及依賴關係等
[Service]:與特定類型相關的專用選項;此處為Service類型
[Install]:定義由“ systemctl enable”以及"systemctl disable“命令在實現服務啟用或禁用時用到的一些選項


2、Unit段的常用選項:Description:簡短描述
Description:描述資訊
After:定義unit的啟動次序,表示當前unit應該晚於哪些
unit啟動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法啟用時,當前unit也無法啟用
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的衝突關係
BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行
Before:如果該欄位指定的 Unit 也要啟動,那麼必須在當前 Unit 之後啟動
Conflicts:這裡指定的 Unit 不能與當前 Unit 同時運行
Condition...:當前 Unit 運行必須滿足的條件,否則不會運行
Assert...:當前 Unit 運行必須滿足的條件,否則會報啟動失敗

3、service常用的選項
Type:定義影響ExecStart及相關參數的功能的unit進程啟動類型
         simple:預設值,這個daemon主要由ExecStart接的指令串來啟動,啟動後常駐於記憶體中
  forking:由ExecStart啟動的程式透過spawns延伸出其他子程式來作為此daemon的主要服務。原生父程式在啟動結束後就會終止。
       oneshot:與simple類似,不過這個程式在工作完畢後就結束了,不會常駐在記憶體中
       dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱後,才會繼續運作.因此通常也要同時設定BusNname= 才行
       notify:在啟動完成後會發送一個通知訊息。還需要配合NotifyAccess 來讓 Systemd 接收訊息
       idle:與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢後才會執行。這類的daemon通
常是開機到最後才執行即可的服務。
     EnvironmentFile:環境設定檔
     ExecStart:指明啟動unit要運行命令或指令碼的絕對路徑
     ExecStartPre: ExecStart前運行
     ExecStartPost: ExecStart後運行
     ExecRsload: 重啟當前服務時執行的命令
     ExecStopPost:停止當前服務之後執行的命令
     ExecStartSec:自動重啟當前服務間隔的秒數
     ExecStop:指明停止unit要啟動並執行命令或指令碼
     Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啟動此服務。
     TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數。
     Environment:指定環境變數。
4、install 常用選項
Install段的常用選項:
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務

注意:對於新建立的unit檔案,或者修改了的unit檔案,要通知systemd重載此設定檔,而後可以選擇重啟。
# systemctl daemon-reload
# systemctl daemon-reload
#systemctl restart httpd.service
更加詳細的unit設定檔格式 請參考官方文檔
https://www.freedesktop.org/software/systemd/man/systemd.unit.html

六、Target
啟動電腦的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。
簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動裡面所有的 Unit。從這個意義上說,Target 這個概念類似於"狀態點",啟動某個 Target 就好比啟動到某種狀態。
傳統的init啟動模式裡面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。
1、Target命令
  查看當前系統的所有 Target
# systemctl list-unit-files --type=target
  查看一個 Target 包含的所有 Unit
# systemctl list-dependencies multi-user.target
  查看啟動時的預設 Target
# systemctl get-default
  設定啟動時的預設 Target
#  systemctl set-default multi-user.target


切換 Target 時,預設不關閉前一個 Target 啟動的進程, systemctl isolate 命令改變這種行為,
關閉前一個 Target 裡面所有不屬於後一個 Target 的進程 systemctl isolate multi-user.target


2、Target與傳統 RunLevel 的對應關係如下。


Traditional runlevel      New target name    Symbolically linked to...
Runlevel 0          |    runlevel0.target -> poweroff.target
Runlevel 1          |    runlevel1.target -> rescue.target
Runlevel 2          |    runlevel2.target -> multi-user.target
Runlevel 3          |    runlevel3.target -> multi-user.target
Runlevel 4          |    runlevel4.target -> multi-user.target
Runlevel 5          |    runlevel5.target -> graphical.target
Runlevel 6          |    runlevel6.target -> reboot.target
3、它與init進程的主要差別如下。
(1)預設的 RunLevel(在/etc/inittab檔案設定)現在被預設的 Target 取代,位置是/etc/systemd/system/default.target,通常符號連結到graphical.target(圖形介面)或者multi-user.target(多使用者命令列)。
(2)啟動指令碼的位置,以前是/etc/init.d目錄,符號連結到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。
(3)設定檔的位置,以前init進程的設定檔是/etc/inittab,各種服務的設定檔存放在/etc/sysconfig目錄。現在的設定檔主要存放在/lib/systemd目錄,在/etc/systemd目錄裡面的修改可以覆蓋原始設定。

七、日誌管理
Systemd 統一管理所有 Unit 的開機記錄。帶來的好處就是,可以只用journalctl一個命令,查看所有日誌(核心日誌和應用日誌)。日誌的設定檔是/etc/systemd/journald.conf。

1、journalctl功能強大,用法非常多。
     查看所有日誌(預設情況下 ,只儲存本次啟動的日誌)   
     #  journalctl
     查看核心日誌(不顯示應用日誌)
     #  journalctl -k
     查看系統本次啟動的日誌
     #  journalctl -b
     #  journalctl -b -0
     查看上一次啟動的日誌(需更改設定)
     #  journalctl -b -1
     查看指定時間的日誌
     #  journalctl --since="2012-10-30 18:17:16"
     #  journalctl --since "20 min ago"
     #  journalctl --since yesterday
     #  journalctl --since "2015-01-10" --until "2015-01-11 03:00"
     #  journalctl --since 09:00 --until "1 hour ago"
     顯示尾部的最新10行日誌
     #  journalctl -n
     顯示尾部指定行數的日誌
     #  journalctl -n 20
     即時滾動顯示最新日誌
     #  journalctl -f
     查看指定服務的日誌
     #  journalctl /usr/lib/systemd/systemd
     查看指定進程的日誌
     #  journalctl _PID=1
     查看某個路徑的指令碼的日誌
     #  journalctl /usr/bin/bash
     查看指定使用者的日誌
     #  journalctl _UID=33 --since today
     查看某個 Unit 的日誌
     #  journalctl -u nginx.service
     #  journalctl -u nginx.service --since today
     即時滾動顯示某個 Unit 的最新日誌
     #  journalctl -u nginx.service -f
     合并顯示多個 Unit 的日誌
     # journalctl -u nginx.service -u php-fpm.service --since today

2、查看指定優先順序(及其以上層級)的日誌,共有8級
     0: emerg
     1: alert
     2: crit
     3: err
     4: warning
     5: notice
     6: info
     7: debug
     #  journalctl -p err -b
     日誌預設分頁輸出,--no-pager 改為正常的標準輸出
     #  journalctl --no-pager
     以 JSON 格式(單行)輸出
     #  journalctl -b -u nginx.service -o json
     以 JSON 格式(多行)輸出,可讀性更好
     #  journalctl -b -u nginx.serviceqq
     -o json-pretty
     顯示日誌佔據的硬碟空間
     #  journalctl --disk-usage
     指定記錄檔佔據的最大空間
     #  journalctl --vacuum-size=1G
     指定記錄檔儲存多久
     #  journalctl --vacuum-time=1years

CentOS 7 中 Systemd詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.