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