溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

CentOS 7中systemd管理的示例分析

發(fā)布時間:2021-07-19 12:48:51 來源:億速云 閱讀:230 作者:小新 欄目:系統(tǒng)運維

這篇文章給大家分享的是有關(guān)CentOS 7中systemd管理的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

CentOS系統(tǒng)啟動流程:

POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs --> /sbin/init

innit程序:

CentOS 5:SysV init

CetnOS 6:  Upstart

CentOS 7 : Systemd

Systemd新特性:

系統(tǒng)Sys V init和LSB init scripts兼容

系統(tǒng)引導(dǎo)時實現(xiàn)服務(wù)并行啟動;采用socket / D-Bus activation等技術(shù)啟動服務(wù);為了減少系統(tǒng)啟動時間,systemd的目標是:盡可能啟動更少的進程;盡可能將更多的進程并行啟動;

按需激活進程;Systemd可以提供按需啟動的能力,只有在某個服務(wù)被真正請求的時候才啟動它。當(dāng)該服務(wù)結(jié)束,systemd可以關(guān)閉它,等待下次需要時再次啟動它。

能夠?qū)ο到y(tǒng)進行快照和恢復(fù);

啟動掛載點和自動掛載點的管理:

Systemd自助管理系統(tǒng)上的掛載點,以便能夠在系統(tǒng)啟動時自動掛載它們。且兼容/etc/fstab文件;

實現(xiàn)事務(wù)依賴關(guān)系管理:

systemd 維護一個"事務(wù)一致性"的概念,保證所有相關(guān)的服務(wù)都可以正常啟動而不會出現(xiàn)互相依賴,以至于死鎖的情況。

基于內(nèi)生依賴關(guān)系定義服務(wù)控制邏輯;

system利用Linux內(nèi)核的特性即CGroup來完成進程跟蹤的任務(wù)。當(dāng)停止服務(wù)時,通過查詢CGroup,systemd可以確保找到所有的相關(guān)進程,從而干凈地停止服務(wù);

日志服務(wù):systemd自帶日志服務(wù)journald,該日志服務(wù)的設(shè)計初衷是克服現(xiàn)有的syslog服務(wù)的缺點。

System的基本概念

單元的概念:

系統(tǒng)初始化需要做的事情非常多。需要啟動后臺服務(wù),比如啟動 SSHD 服務(wù);需要做配置工作,比如掛載文件系統(tǒng)。這個過程中的每一步都被 systemd 抽象為一個配置單元,即 unit。可以認為一個服務(wù)是一個配置單元;一個掛載點是一個配置單元;一個交換分區(qū)的配置是一個配置單元;等等。systemd 將配置單元歸納為以下一些不同的類型。然而,systemd 正在快速發(fā)展,新功能不斷增加。所以配置單元類型可能在不久的將來繼續(xù)增加。

service:代表一個后臺服務(wù)進程,比如mysqld。這是常用的一類;

socket:此類配置單元封裝系統(tǒng)和互聯(lián)網(wǎng)中的一個套接字。當(dāng)下,systemd支持流式、數(shù)據(jù)包和連續(xù)包的AF_INET、AF_INET6、AF_UNIX socket。每一個套接字配置單元都有一個相應(yīng)的服務(wù)配置單元 。相應(yīng)的服務(wù)在第一個"連接"進入套接字時就會啟動(例如:nscd.socket 在有新連接后便啟動 nscd.service)。

device :此類配置單元封裝一個存在于 Linux 設(shè)備樹中的設(shè)備。每一個使用 udev 規(guī)則標記的設(shè)備都將會在 systemd 中作為一個設(shè)備配置單元出現(xiàn)。

mount :此類配置單元封裝文件系統(tǒng)結(jié)構(gòu)層次中的一個掛載點。Systemd 將對這個掛載點進行監(jiān)控和管理。比如可以在啟動時自動將其掛載;可以在某些條件下自動卸載。Systemd 會將/etc/fstab 中的條目都轉(zhuǎn)換為掛載點,并在開機時處理。

automount :此類配置單元封裝系統(tǒng)結(jié)構(gòu)層次中的一個自掛載點。每一個自掛載配置單元對應(yīng)一個掛載配置單元 ,當(dāng)該自動掛載點被訪問時,systemd 執(zhí)行掛載點中定義的掛載行為。

swap: 和掛載配置單元類似,交換配置單元用來管理交換分區(qū)。用戶可以用交換配置單元來定義系統(tǒng)中的交換分區(qū),可以讓這些交換分區(qū)在啟動時被激活。

target :此類配置單元為其他配置單元進行邏輯分組。它們本身實際上并不做什么,只是引用其他配置單元而已。這樣便可以對配置單元做一個統(tǒng)一的控制。這樣就可以實現(xiàn)大家都已經(jīng)非常熟悉的運行級別概念。比如想讓系統(tǒng)進入圖形化模式,需要運行許多服務(wù)和配置命令,這些操作都由一個個的配置單元表示,將所有這些配置單元組合為一個目標(target),就表示需要將這些配置單元全部執(zhí)行一遍以便進入目標所代表的系統(tǒng)運行狀態(tài)。 (例如:multi-user.target 相當(dāng)于在傳統(tǒng)使用 SysV 的系統(tǒng)中運行級別 3)

timer:定時器配置單元用來定時觸發(fā)用戶定義的操作,這類配置單元取代了 atd、crond 等傳統(tǒng)的定時服務(wù)。

snapshot :與 target 配置單元相似,快照是一組配置單元。它保存了系統(tǒng)當(dāng)前的運行狀態(tài)。

依賴關(guān)系:

雖然 systemd 將大量的啟動工作解除了依賴,使得它們可以并發(fā)啟動。但還是存在有些任務(wù),它們之間存在天生的依賴,不能用"套接字激活"(socket activation)、D-Bus activation 和 autofs 三大方法來解除依賴(三大方法詳情見后續(xù)描述)。比如:掛載必須等待掛載點在文件系統(tǒng)中被創(chuàng)建;掛載也必須等待相應(yīng)的物理設(shè)備就緒。為了解決這類依賴問題,systemd 的配置單元之間可以彼此定義依賴關(guān)系。

Systemd 用配置單元定義文件中的關(guān)鍵字來描述配置單元之間的依賴關(guān)系。比如:unit A 依賴 unit B,可以在 unit B 的定義中用"require A"來表示。這樣 systemd 就會保證先啟動 A 再啟動 B。

Systemd事務(wù):

Systemd 能保證事務(wù)完整性。Systemd 的事務(wù)概念和數(shù)據(jù)庫中的有所不同,主要是為了保證多個依賴的配置單元之間沒有環(huán)形引用。 存在循環(huán)依賴,那么 systemd 將無法啟動任意一個服務(wù)。此時systemd 將會嘗試解決這個問題,因為配置單元之間的依賴關(guān)系有兩種:required是強依賴;want 則是弱依賴,systemd 將去掉 wants 關(guān)鍵字指定的依賴看看是否能打破循環(huán)。如果無法修復(fù),systemd會報錯。

Systemd 能夠自動檢測和修復(fù)這類配置錯誤,極大地減輕了管理員的排錯負擔(dān)。

Target和運行級別:

systemd 用目標(target)替代了運行級別的概念,提供了更大的靈活性,如您可以繼承一個已有的目標,并添加其它服務(wù),來創(chuàng)建自己的目標。下表列舉了 systemd 下的目標和常見 runlevel 的對應(yīng)關(guān)系:

CentOS 7中systemd管理的示例分析

Systemd 的并發(fā)啟動原理

如前所述,在 Systemd 中,所有的服務(wù)都并發(fā)啟動,比如Avahi、D-Bus、livirtd、X11、HAL 可以同時啟動。乍一看,這似乎有點兒問題,比如 Avahi 需要syslog 的服務(wù),Avahi 和syslog 同時啟動,假設(shè) Avahi 的啟動比較快,所以syslog 還沒有準備好,可是 Avahi 又需要記錄日志,這豈不是會出現(xiàn)問題?

Systemd 的開發(fā)人員仔細研究了服務(wù)之間相互依賴的本質(zhì)問題,發(fā)現(xiàn)所謂依賴可以分為三個具體的類型,而每一個類型實際上都可以通過相應(yīng)的技術(shù)解除依賴關(guān)系。

并發(fā)啟動原理之一:解決 socket 依賴

絕大多數(shù)的服務(wù)依賴是套接字依賴。比如服務(wù)A 通過一個套接字端口S1 提供自己的服務(wù),其他的服務(wù)如果需要服務(wù)A,則需要連接S1。因此如果服務(wù)A 尚未啟動,S1就不存在,其他的服務(wù)就會得到啟動錯誤。所以傳統(tǒng)地,人們需要先啟動服務(wù)A,等待它進入就緒狀態(tài),再啟動其他需要它的服務(wù)。Systemd認為,只要我們預(yù)先把S1 建立好,那么其他所有的服務(wù)就可以同時啟動而無需等待服務(wù)A 來創(chuàng)建S1 了。如果服務(wù)A 尚未啟動,那么其他進程向S1 發(fā)送的服務(wù)請求實際上會被Linux 操作系統(tǒng)緩存,其他進程會在這個請求的地方等待。一旦服務(wù)A 啟動就緒,就可以立即處理緩存的請求,一切都開始正常運行。

那么服務(wù)如何使用由 init 進程創(chuàng)建的套接字呢?

Linux 操作系統(tǒng)有一個特性,當(dāng)進程調(diào)用fork 或者exec 創(chuàng)建子進程之后,所有在父進程中被打開的文件句柄(file descriptor) 都被子進程所繼承。套接字也是一種文件句柄,進程A 可以創(chuàng)建一個套接字,此后當(dāng)進程A 調(diào)用 exec啟動一個新的子進程時,只要確保該套接字的close_on_exec 標志位被清空,那么新的子進程就可以繼承這個套接字。子進程看到的套接字和父進程創(chuàng)建的套接字是同一個系統(tǒng)套接字,就仿佛這個套接字是子進程自己創(chuàng)建的一樣,沒有任何區(qū)別。

這個特性以前被一個叫做 inetd 的系統(tǒng)服務(wù)所利用。Inetd 進程會負責(zé)監(jiān)控一些常用套接字端口,比如Telnet,當(dāng)該端口有連接請求時,inetd才啟動 telnetd 進程,并把有連接的套接字傳遞給新的telnetd 進程進行處理。這樣,當(dāng)系統(tǒng)沒有telnet 客戶端連接時,就不需要啟動telnetd 進程。Inetd可以代理很多的網(wǎng)絡(luò)服務(wù),這樣就可以節(jié)約很多的系統(tǒng)負載和內(nèi)存資源,只有當(dāng)有真正的連接請求時才啟動相應(yīng)服務(wù),并把套接字傳遞給相應(yīng)的服務(wù)進程。

和 inetd 類似,systemd 是所有其他進程的父進程,它可以先建立所有需要的套接字,然后在調(diào)用exec 的時候?qū)⒃撎捉幼謧鬟f給新的服務(wù)進程,而新進程直接使用該套接字進行服務(wù)即可。

并發(fā)啟動原理之二:解決 D-Bus 依賴

D-Bus 是 desktop-bus 的簡稱,是一個低延遲、低開銷、高可用性的進程間通信機制。它越來越多地用于應(yīng)用程序之間通信,也用于應(yīng)用程序和操作系統(tǒng)內(nèi)核之間的通信。很多現(xiàn)代的服務(wù)進程都使用D-Bus取代套接字作為進程間通信機制,對外提供服務(wù)。比如簡化Linux 網(wǎng)絡(luò)配置的NetworkManager 服務(wù)就使用D-Bus 和其他的應(yīng)用程序或者服務(wù)進行交互:郵件客戶端軟件evolution 可以通過D-Bus 從NetworkManager 服務(wù)獲取網(wǎng)絡(luò)狀態(tài)的改變,以便做出相應(yīng)的處理。

D-Bus 支持所謂"busactivation"功能。如果服務(wù)A 需要使用服務(wù) B 的 D-Bus 服務(wù),而服務(wù) B 并沒有運行,則 D-Bus 可以在服務(wù) A 請求服務(wù) B 的 D-Bus 時自動啟動服務(wù) B。而服務(wù) A 發(fā)出的請求會被 D-Bus 緩存,服務(wù) A 會等待服務(wù) B 啟動就緒。利用這個特性,依賴D-Bus 的服務(wù)就可以實現(xiàn)并行啟動。

并發(fā)啟動原理之三:解決文件系統(tǒng)依賴

系統(tǒng)啟動過程中,文件系統(tǒng)相關(guān)的活動是最耗時的,比如掛載文件系統(tǒng),對文件系統(tǒng)進行磁盤檢查(fsck),磁盤配額檢查等都是非常耗時的操作。在等待這些工作完成的同時,系統(tǒng)處于空閑狀態(tài)。那些想使用文件系統(tǒng)的服務(wù)似乎必須等待文件系統(tǒng)初始化完成才可以啟動。但是systemd 發(fā)現(xiàn)這種依賴也是可以避免的。

Systemd 參考了 autofs 的設(shè)計思路,使得依賴文件系統(tǒng)的服務(wù)和文件系統(tǒng)本身初始化兩者可以并發(fā)工作。autofs可以監(jiān)測到某個文件系統(tǒng)掛載點真正被訪問到的時候才觸發(fā)掛載操作,這是通過內(nèi)核automounter 模塊的支持而實現(xiàn)的。比如一個open()系統(tǒng)調(diào)用作用在"/misc/cd/file1"的時候,/misc/cd 尚未執(zhí)行掛載操作,此時 open()調(diào)用被掛起等待,Linux 內(nèi)核通知 autofs,autofs 執(zhí)行掛載。這時候,控制權(quán)返回給open()系統(tǒng)調(diào)用,并正常打開文件。

Systemd 集成了 autofs 的實現(xiàn),對于系統(tǒng)中的掛載點,比如/home,當(dāng)系統(tǒng)啟動的時候,systemd 為其創(chuàng)建一個臨時的自動掛載點。在這個時刻/home真正的掛載設(shè)備尚未啟動好,真正的掛載操作還沒有執(zhí)行,文件系統(tǒng)檢測也還沒有完成??墒悄切┮蕾囋撃夸浀倪M程已經(jīng)可以并發(fā)啟動,他們的open()操作被內(nèi)建在systemd 中的autofs 捕獲,將該open()調(diào)用掛起(可中斷睡眠狀態(tài))。然后等待真正的掛載操作完成,文件系統(tǒng)檢測也完成后,systemd將該自動掛載點替換為真正的掛載點,并讓open()調(diào)用返回。由此,實現(xiàn)了那些依賴于文件系統(tǒng)的服務(wù)和文件系統(tǒng)本身同時并發(fā)啟動。

當(dāng)然對于"/"根目錄的依賴實際上一定還是要串行執(zhí)行,因為systemd 自己也存放在/之下,必須等待系統(tǒng)根目錄掛載檢查好。

不過對于類似/home 等掛載點,這種并發(fā)可以提高系統(tǒng)的啟動速度,尤其是當(dāng)/home是遠程的 NFS 節(jié)點,或者是加密盤等,需要耗費較長的時間才可以準備就緒的情況下,因為并發(fā)啟動,這段時間內(nèi),系統(tǒng)并不是完全無事可做,而是可以利用這段空余時間做更多的啟動進程的事情,總的來說就縮短了系統(tǒng)啟動時間。

Systemd 的使用

下面針對技術(shù)人員的不同角色來簡單地介紹一下 systemd 的使用。本文只打算給出簡單的描述,讓您對 systemd 的使用有一個大概的理解。具體的細節(jié)內(nèi)容太多,即無法在一篇短文內(nèi)寫全。還需要讀者自己去進一步查閱 systemd的文檔。

Unit 文件的編寫

開發(fā)人員開發(fā)了一個新的服務(wù)程序,比如httpd,就需要為其編寫一個配置單元文件以便該服務(wù)可以被systemd 管理,類似UpStart 的工作配置文件。在該文件中定義服務(wù)啟動的命令行語法,以及和其他服務(wù)的依賴關(guān)系等。

此外我們之前已經(jīng)了解到,systemd 的功能繁多,不僅用來管理服務(wù),還可以管理掛載點,定義定時任務(wù)等。這些工作都是由編輯相應(yīng)的配置單元文件完成的。我在這里給出幾個配置單元文件的例子。

下面是 SSH 服務(wù)的配置單元文件,服務(wù)配置單元文件以.service為文件名后綴。

[root@kalaguiyin system]# cat/usr/lib/systemd/system/sshd.service 

[Unit]

Description=OpenSSH server daemon

After=network.target sshd-keygen.service

Wants=sshd-keygen.service

#[unit]部分,描述信息

[Service]

EnvironmentFile=/etc/sysconfig/sshd

ExecStart=/usr/sbin/sshd -D $OPTIONS

ExecReload=/bin/kill -HUP $MAINPID

KillMode=process

Restart=on-failure

RestartSec=42s

#[service]定義,ExecStartPre定義啟動服務(wù)之前應(yīng)該運行的命令;

#ExecStart 定義啟動服務(wù)的具體命令行語法。

[Install]

WantedBy=multi-user.target

#[install]部分:WangtedBy表明這個服務(wù)是在多用戶模式下所需要的。

那我們就來看下multi-user.target 吧:

[root@kalaguiyin system]# catmulti-user.target

[Unit]

Description=Multi-User System

Documentation=man:systemd.special(7)

Requires=basic.target

Conflicts=rescue.service rescue.target

After=basic.target rescue.servicerescue.target

AllowIsolate=yes

# Requires 定義表明 multi-user.target 啟動的時候 basic.target 也必須被啟動;另外 basic.target 停止的時# 候,multi-user.target 也必須停止。如果您接著查看 basic.target 文件,會發(fā)現(xiàn)它又指定了 sysinit.target 

# 其他的單元必須隨之啟動。同樣 sysinit.target 也會包含其他的單元。采用這樣的層層鏈接的結(jié)構(gòu),最終所# 有需要支持多用戶模式的組件服務(wù)都會被初始化啟動好。

[Install]

Alias=default.target

#  Alias 定義,即定義本單元的別名,這樣在運行 systemctl 的時候就可以使用這個別名來引用本單元。

此外在/etc/systemd/system 目錄下還可以看到諸如*.wants 的目錄,放在該目錄下的配置單元文件等同于在[Unit]小節(jié)中的 wants 關(guān)鍵字,即本單元啟動時,還需要啟動這些單元。比如您可以簡單地把您自己寫的 foo.service 文件放入 multi-user.target.wants 目錄下,這樣每次都會被默認啟動了。

[root@kalaguiyin system]# pwd

/etc/systemd/system

[root@kalaguiyin system]# ls

basic.target.wants                          display-manager.service

bluetooth.target.wants                       getty.target.wants

dbus-org.bluez.service                       graphical.target.wants

printer.target.wants                                             sockets.target.wants

spice-vdagentd.target.wants                                            default.target    sysinit.target.wants                                              default.target.wants

再讓我們來看看sys-kernel-debug.mout文件,這個文件定義了一個文件掛載點:

[root@kalaguiyin system]# cat

sys-kernel-debug.mount

[Unit]

Description=Debug File System

Documentation=https://www.kernel.org/doc/Documentation/filesystems/debugfs.txt

Documentation=http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems

DefaultDependencies=no

ConditionPathExists=/sys/kernel/debug

Before=sysinit.target

[Mount]

What=debugfs

Where=/sys/kernel/debug

Type=debugfs

這個配置單元文件定義了一個掛載點。掛載配置單元文件有一個[Mount]配置小節(jié),里面配置了 What,Where 和Type 三個數(shù)據(jù)項。這都是掛載命令所必須的,例子中的配置等同于下面這個掛載命令:

mount –t debugfs /sys/kernel/debug debugfs

Systemd系統(tǒng)管理:

systemd 的主要命令行工具是 systemctl。

多數(shù)管理員應(yīng)該都已經(jīng)非常熟悉系統(tǒng)服務(wù)和 init 系統(tǒng)的管理,比如 service、chkconfig以及 telinit 命令的使用。systemd 也完成同樣的管理任務(wù),只是命令工具systemctl 的語法有所不同而已。

啟動服務(wù)

systemctl start httpd.service 如圖1:

CentOS 7中systemd管理的示例分析

停止服務(wù)

systemctl stop httpd.service  如圖2:

CentOS 7中systemd管理的示例分析

重啟服務(wù)

systemctl restarthttpd.service  如圖3:

CentOS 7中systemd管理的示例分析

重載服務(wù)

systemctl reloadhttpd.service

條件式重啟

systemctl condrestarthttpd.service

狀態(tài)查看

systemctl statushttpd.service

列出可以啟動或停止的服務(wù)列表。

systemctl list-unit-files –type=service

設(shè)置服務(wù)為開機啟動

chkconfig httpd on

systemctl enablehttpd.service

取消服務(wù)開機啟動;

systemctl disablehttpd.service

檢查一個服務(wù)在當(dāng)前環(huán)境下被配置為啟用還是禁用。

systemctl is-enabledhttpd.service;echo $?

輸出在各個運行級別下服務(wù)的啟用和禁用情況

systemctl list-unit-files –type=service

列出某服務(wù)在哪些運行級別下啟用和禁用。

ls /etc/lib/systemd/system/*.wants/httpd.service

改變用戶運行級別:

systemctl isolatemulti-user.target

multi-user.target   ==  第3運行級別

graphical.target    ==  第5運行級別

runlevel3.target 符號鏈接,指向multi-user.target

runlevel5.target 符號鏈接,指向graphical.target

改變默認運行級別:

[root@kalaguiyinsystem]# systemctl set-default multi-user.target 

rm'/etc/systemd/system/default.target'

ln -s'/usr/lib/systemd/system/multi-user.target''/etc/systemd/system/default.target'

上述操作的實質(zhì)是刪除/usr/lib/systemd/system/default.target,然后將目標級別的target文件鏈接至/etc/systemd/system/default.target文件;

CentOS 7中systemd管理的示例分析

systemd 已經(jīng)不僅僅是一個初始化系統(tǒng)了:

systemd 還負責(zé)系統(tǒng)其他的管理配置,比如配置網(wǎng)絡(luò),Locale 管理,管理系統(tǒng)內(nèi)核模塊加載等。

Systemd 出色地替代了sysvinit 的所有功能,但它并未就此自滿。因為init 進程是系統(tǒng)所有進程的父進程這樣的特殊性,systemd 非常適合提供曾經(jīng)由其他服務(wù)提供的功能,比如定時任務(wù) (以前由 crond 完成) ;會話管理 (以前由 ConsoleKit/PolKit 等管理) 。

感謝各位的閱讀!關(guān)于“CentOS 7中systemd管理的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI