目錄 一、systemd的由來 二、systemd 三、服務管理 1、systemctl2 2、服務查看 3、服務狀態(tài) 4、hostnamectl 5、localectl 6、 timedatectl 7、loginctl 四、unit 1、Unit類型 2、systemctl list-units命令可以查看當前系統(tǒng)的所有 Unit 3、unit狀態(tài) 4、依賴關系 五、unit配置文件 1、概述 2、配置文件狀態(tài) 3、配置文件格式 1)unit配置文件格式 2)Unit段的常用選項 3)service常用的選項 4)install 常用選項 六、Target 1、Target命令 2、Target與傳統(tǒng) RunLevel 的對應關系如下 3、它與init進程的主要差別如下 七、日志管理 1、journalctl功能強大,用法非常多 2、查看指定優(yōu)先級(及其以上級別)的日志,共有8級
一、systemd的由來 Linux一直以來采用init進程但是init有兩個缺點: 1、啟動時間長。Init進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。(這也是Centos5的主要特征) 2、啟動腳本復雜。Init進程只是執(zhí)行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這使得腳本變得很長而且復雜。 Init: Centos 5 Sys init 是啟動速度最慢的,串行啟動過程,無論進程相互之間有無依賴關系。 Centos6 Upstart init 相對啟動速度快一點有所改進。有依賴的進程之間依次啟動而其他與之沒有依賴關系的則并行同步啟動。 Centos7 Systemd 與以上都不同。所有進程無論有無依賴關系則都是并行啟動(當然很多時候進程沒有真正啟動而是只有一個信號或者說是標記而已,在真正利用的時候才會真正啟動。) 二、systemd Systemd為了解決上文的問題而誕生。它的目標是,為系統(tǒng)的啟動和管理提供一套完整的解決方案。根據(jù)linux慣例,字母d是守護進程(daemon) 的縮寫。Systemd名字的含義就是 守護整個系統(tǒng)。 Centos 7里systemd代替了init,成為了系統(tǒng)的第一個進程。PID為1.其他所有的進程都是它的子進程。Systemd 的優(yōu)點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現(xiàn)在還有很多人反對使用 Systemd,理由就是它過于復雜,與操作系統(tǒng)的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。 Systemd 架構(gòu)圖
三、服務管理 1、systemctl Systemctl是systemd的主要命令,用于管理系統(tǒng)。 Centos 7 :service unit 注意:能兼容早期的服務腳本 命令格式
2、服務查看:
3、服務狀態(tài):
4、hostnamectl
5、localectl
6、 timedatectl
7、loginctl
四、unit Systemd可以管理系統(tǒng)中所有資源。不同的資源統(tǒng)稱為unit(單位)。Unit表示不同類型的systemd對象,通過配置文件進程標識和配置;文件中主要包含了系統(tǒng)服務、監(jiān)聽socket、保存的系統(tǒng)快照以及其它與init相關的信息。 1、Unit類型 Unit一共分為12種。 Sysstemctl –t help 查看unit類型 Service unit:文件擴展名為.Service,用于定義系統(tǒng)服務 Target unit : 文件名擴展為.target,用于模擬實現(xiàn)“運行級別” Device unit :.device ,用于定義文件內(nèi)核識別設備 Mount unit: .mount 定義文件系統(tǒng)掛載點。 Socket unit: .socket, 用于標識進程間通信用的socket文件,也可在系統(tǒng)啟動時,延遲啟動服務,實現(xiàn)按需啟動 Snapshot unit: .snapshot, 管理系統(tǒng)快照 Swap unit: .swap, 用于標識swap設備 Automount unit: .automount,文件系統(tǒng)的自動掛載點 Path unit: .path,用于定義文件系統(tǒng)中的一個文件或目錄使用,常用于當文件系統(tǒng)變化時,延遲激活服務,如:spool目錄 Scope unit :不是由systemd啟動的外部進程 Slice unit :進程組 Timer unit :定時器 2、systemctl list-units命令可以查看當前系統(tǒng)的所有 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狀態(tài) systemctl status命令用于查看系統(tǒng)狀態(tài)和單個 Unit 的狀態(tài)。 顯示系統(tǒng)狀態(tài) #systemctl status 顯示單個 Unit 的狀態(tài) # sysystemctl status bluetooth.service 顯示遠程主機的某個 Unit 的狀態(tài) # systemctl -H root@rhel7.example.com status httpd.service 除了status命令,systemctl還提供了三個查詢狀態(tài)的簡單方法,主要供腳本內(nèi)部的判斷語句使用。 顯示某個 Unit 是否正在運行 # systemctl is-active application.service 顯示某個 Unit 是否處于啟動失敗狀態(tài) # 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 上面命令的輸出結(jié)果之中,有些依賴是 Target 類型(詳見下文),默認不會展開顯示。如果要展開 Target,就需要使用--all參數(shù)。 # 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:系統(tǒng)執(zhí)行過程中所產(chǎn)生的服務腳本,與上面目錄優(yōu)先運行。 /etc/systemd/system:管理員建立的執(zhí)行腳本,類似于/etc/rc.d/rcN.d/Sxx的功能,比上面目錄優(yōu)先運行。 2、配置文件狀態(tài) systemctl list-unit-files命令用于列出所有配置文件。 列出所有配置文件 #systemctl list-unit-files 列出指定類型的配置文件 #systemctl list-unit-files --type=service systemctl list-unit-files該命令會輸出一個列表,從中可以看到每個配置文件的狀態(tài)。 Unit config filestatus lvm2-lvmetad.service disabled lvm2-lvmetad.socket enabled lvm2-lvmpolld.service disabled lvm2-lvmpolld.socket enabled 這個列表顯示每個配置文件的狀態(tài),一共有四種。 enabled:已建立啟動鏈接 disabled:沒建立啟動鏈接 static:該配置文件沒有[Install]部分(無法執(zhí)行),只能作為其他配置文件的依賴 masked:該配置文件被禁止建立啟動鏈接 注意,從配置文件的狀態(tài)無法看出,該 Unit 是否正在運行。這必須執(zhí)行前面提到的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“命令在實現(xiàn)服務啟用或禁用時用到的一些選項 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及相關參數(shù)的功能的unit進程啟動類型 simple:默認值,這個daemon主要由ExecStart接的指令串來啟動,啟動后常駐于內(nèi)存中 forking:由ExecStart啟動的程序透過spawns延伸出其他子程序來作為此daemon的主要服務。原生父程序在啟動結(jié)束后就會終止。 oneshot:與simple類似,不過這個程序在工作完畢后就結(jié)束了,不會常駐在內(nèi)存中 dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱后,才會繼續(xù)運作.因此通常也要同時設定BusNname= 才行 notify:在啟動完成后會發(fā)送一個通知消息。還需要配合NotifyAccess 來讓 Systemd 接收消息 idle:與simple類似,要執(zhí)行這個daemon必須要所有的工作都順利執(zhí)行完畢后才會執(zhí)行。這類的daemon通 常是開機到最后才執(zhí)行即可的服務。 EnvironmentFile:環(huán)境配置文件 ExecStart:指明啟動unit要運行命令或腳本的絕對路徑 ExecStartPre: ExecStart前運行 ExecStartPost: ExecStart后運行 ExecRsload: 重啟當前服務時執(zhí)行的命令 ExecStopPost:停止當前服務之后執(zhí)行的命令 ExecStartSec:自動重啟當前服務間隔的秒數(shù) ExecStop:指明停止unit要運行的命令或腳本 Restart:當設定Restart=1 時,則當次daemon服務意外終止后,會再次自動啟動此服務。 TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數(shù)。 Environment:指定環(huán)境變量。 4、install 常用選項 Install段的常用選項: Alias:別名,可使用systemctl command Alias.service RequiredBy:被哪些units所依賴,強依賴 WantedBy:被哪些units所依賴,弱依賴 Also:安裝本服務的時候還要安裝別的相關服務 注意:對于新創(chuàng)建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而后可以選擇重啟。 # systemctl daemon-reload # systemctl daemon-reload #systemctl restart httpd.service 更加詳細的unit配置文件格式 請參考官方文檔 https://www./software/systemd/man/systemd.unit.html 六、Target 啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。 簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動里面所有的 Unit。從這個意義上說,Target 這個概念類似于"狀態(tài)點",啟動某個 Target 就好比啟動到某種狀態(tài)。 傳統(tǒng)的init啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。 1、Target命令 查看當前系統(tǒng)的所有 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與傳統(tǒng) 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文件設置)現(xiàn)在被默認的 Target 取代,位置是/etc/systemd/system/default.target,通常符號鏈接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。 (2)啟動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現(xiàn)在則存放在/lib/systemd/system和/etc/systemd/system目錄。 (3)配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄?,F(xiàn)在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄里面的修改可以覆蓋原始設置。 七、日志管理 Systemd 統(tǒng)一管理所有 Unit 的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內(nèi)核日志和應用日志)。日志的配置文件是/etc/systemd/journald.conf。 1、journalctl功能強大,用法非常多。
2、查看指定優(yōu)先級(及其以上級別)的日志,共有8級
|
|