1.1 簡介 systemd是linux系統(tǒng)的系統(tǒng)和服務(wù)管理器,,它兼容之前的SysV init腳本,并提供一系列的其他特色:啟動(dòng)時(shí)系統(tǒng)服務(wù)的并行啟動(dòng)、按需啟動(dòng)服務(wù)、支持系統(tǒng)狀態(tài)快照,、基于服務(wù)依賴的控制邏輯。 systemd引入systemd units概念,,這些units是通過一些配置文件代表的,。以下列出所有的systemd units類型: Unit Type File Extension Description ------------------------------------------------------------------ Service unit .service 系統(tǒng)服務(wù) Target unit .target 一組systemd units Automount unit .automount 文件系統(tǒng)的自動(dòng)掛載點(diǎn) ------------------------------------------------------------------- Device unit .device 由內(nèi)核識別的設(shè)備文件 Mount unit .mount 文件系統(tǒng)掛載點(diǎn) Path unit .path 文件系統(tǒng)中的文件或者目錄 ------------------------------------------------------------------- Scope unit .scope 外部創(chuàng)建的進(jìn)程 Slice unit .slice 一組管理系統(tǒng)進(jìn)程的分級組織的units Snapshot unit .snapshot 存儲(chǔ)的系統(tǒng)管理器狀態(tài) Socket unit .socket 進(jìn)程間通信套接字 ------------------------------------------------------------------- Swap unit .swap 交換設(shè)備或者文件 Timer unit .timer systemd定時(shí)器 Systemd unit存儲(chǔ)位置: 文件夾 描述 /usr/lib/systemd/system/ 利用RPM包安裝的軟件產(chǎn)生的Systemd unit /run/systemd/system/ 運(yùn)行時(shí)產(chǎn)生的Systemd units,該文件夾優(yōu)先于directory with installed service units /etc/systemd/system/ 系統(tǒng)管理員創(chuàng)造的systemd units,,該文件夾優(yōu)先于運(yùn)行時(shí)units 1.1.1 主要特點(diǎn) 也就是以上列出的系統(tǒng)支持的unit類型對應(yīng)的啟動(dòng)特點(diǎn),。 1.1.2 兼容性 systemd對于runlevels的支持是比較局限的。它僅提供一些target units文件,,這些文件可以對應(yīng)runlevels中的運(yùn)行級別,。但是,并不是所有的運(yùn)行級別都能一一對應(yīng),因此盡管可以用runlevel命令,,但并不建議這么做,。 systemctl工具并不支持定制命令,這在SysV int啟動(dòng)腳本中是可以的,。systemctl工具并不能與非systemd啟動(dòng)的服務(wù)進(jìn)行交流,當(dāng)用systemd啟動(dòng)一個(gè)系統(tǒng)服務(wù)時(shí),,它會(huì)存儲(chǔ)該服務(wù)主要進(jìn)程的ID并跟蹤,,systemctl利用這個(gè)PID來管理這個(gè)服務(wù),而當(dāng)用戶在命令行直接啟動(dòng)一個(gè)服務(wù)時(shí),,systemctl并不能判斷該服務(wù)的狀態(tài)也不能停止該服務(wù),。 系統(tǒng)服務(wù)并不能從標(biāo)準(zhǔn)輸入讀取信息,當(dāng)systemd啟動(dòng)一個(gè)服務(wù),,它會(huì)把該服務(wù)的標(biāo)準(zhǔn)輸入連接到/dev/null來防止與用戶直接交流,。 系統(tǒng)服務(wù)并不能從用戶以及他們的對話中繼承任何環(huán)境(包括HOME、PATH等環(huán)境變量),,每一個(gè)服務(wù)都運(yùn)行在新的執(zhí)行環(huán)境中,。 所有針對服務(wù)的操作都遵守默認(rèn)5min的超時(shí),以防服務(wù)發(fā)生問題導(dǎo)致系統(tǒng)死機(jī),。 1.2 管理系統(tǒng)服務(wù)
早期版本的RHEL采用SysV init或Upstart,,利用/etc/rc.d/init.d/文件夾中的啟動(dòng)腳本,這些啟動(dòng)腳本通常是bash腳本,,并且允許管理員控制服務(wù)的狀態(tài),。在systemd控制的系統(tǒng)中,這些啟動(dòng)腳本被service units替代,。 以.service后綴的系統(tǒng)units與啟動(dòng)腳本完成相似的功能,,為了view、start,、stop,、restart、enable,、disable一項(xiàng)系統(tǒng)服務(wù),,可以用systemctl命令。當(dāng)然之前的service和chkconfig命令也是可用的,,但是不建議使用,。 為了清晰明了,該部分采用全名(帶有.service后綴): systemctl stop bluetooth.service 當(dāng)處理系統(tǒng)服務(wù)時(shí),,允許省略文件后綴:systemctl工具當(dāng)面對一個(gè)沒有后綴的unit時(shí),,會(huì)默認(rèn)其為service unit,因此上一個(gè)命令與下面的等價(jià) systemctl stop bluetooth systemctl start name.service 啟動(dòng)服務(wù) systemctl stop name.service 關(guān)閉服務(wù) systemctl restart name.service 重啟服務(wù) systemctl try-restart name.service 當(dāng)系統(tǒng)運(yùn)行狀態(tài)則重啟該服務(wù) systemctl reload name.service 重新加載配置 systemctl status name.service 判斷服務(wù)狀態(tài) systemctl is-active name.servie 判斷服務(wù)是否在運(yùn)行 systemctl list-units --type service --all 列出所有服務(wù)的狀態(tài) systemctl enable name.service 開機(jī)自啟一項(xiàng)服務(wù) systemctl disable name.service 關(guān)閉開機(jī)自啟一項(xiàng)服務(wù) systemctl is-enabled name.service 判斷該服務(wù)是否enabled systemctl list-unit-files --type service 列出所有的服務(wù),并判斷其是否enabled systemctl list-dependencies --after 列出特定unit啟動(dòng)之前需要啟動(dòng)的服務(wù) systemctl list-dependencies --before 列出特定unit啟動(dòng)之后才啟動(dòng)的服務(wù) 1.2.1 列出服務(wù) 為了列出目前所有的service units,,用以下命令: systemctl list-units --type service 默認(rèn)情況下,,systemctl list-units命令示出活動(dòng)的units,如果想要列出任何狀態(tài)的units,,用以下命令: systemctl list-units --type service --all 列出所有安裝的服務(wù)以及它們的enable狀態(tài) systemctl list-unit-files --type service 1.2.2 顯示服務(wù)狀態(tài) 利用systemctl status name.service 會(huì)列出如下字段信息: Loaded 關(guān)于該系統(tǒng)服務(wù)unit是否已加載,、unit文件的絕對路徑、該unit是否時(shí)enabled狀態(tài) Active 顯示該服務(wù)是否在運(yùn)行,,并在其后有一個(gè)時(shí)間 Main PID 相應(yīng)系統(tǒng)服務(wù)的名字以及其PID Status 相應(yīng)系統(tǒng)服務(wù)的額外信息 Process 相應(yīng)進(jìn)程的額外信息 CGroup 相關(guān)控制組(cgroups)的額外信息 1.2.3 啟動(dòng)一項(xiàng)服務(wù) systemctl start name.service | | 1.2.6 自啟一項(xiàng)服務(wù) 為了是Apache HTTP 服務(wù)器在開機(jī)時(shí)自啟,,可以用root用戶運(yùn)行如下命令 systemctl enable httpd.service ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service' 1.2.7 取消服務(wù)開機(jī)自啟 systemctl disable name.service 該命令會(huì)把/usr/lib/systemd/system/name.service在/etc/systemd/system/文件夾以及其子文件夾中的鏈接刪除。此外,,你還可以通過mask來掩蔽一項(xiàng)服務(wù),,從而使其不能自啟或由其它服務(wù)啟動(dòng): systemctl mask name.service 該命令會(huì)把/etc/systemd/system/name.service這一文件替換為指向/dev/null的鏈接,若想取消: systemctl unmask name.service 1.3 Systemd targets systemd targets通過target units代表,,其具有.target后綴,,target存在的唯一目的就是通過一系列依賴性集合其它的systemd units。例如,,graphical.target unit就是用來開啟圖形會(huì)話,,啟動(dòng)諸如gdm.service,accounts-daemon.service的服務(wù),且激活multi-user.target unit runlevel0.target,poweroff.target 關(guān)機(jī) runlevel1.target,rescue.target 拯救模式,,單用戶模式 runlevel2.target,multi-user.target 字符界面多用戶 runlevel3.target,multi-user.target 字符界面多用戶 runlevel4.target,multi-user.target 字符界面多用戶 runlevel5.target,graphical.target 圖形界面多用戶 runlevel6.target,reboot.target 重啟 1.3.1 查看默認(rèn)target systemctl get-default 該命令查看/etc/systemd/system/default.target這一鏈接指向,。 1.3.2 查看目前target 以下命令查看當(dāng)前系統(tǒng)加載的target units: systemctl list-units --type target 1.3.3 改變默認(rèn)target systemctl set-default name.target 1.3.4 改變目前target systemctl isolate name.target 這一命令會(huì)啟動(dòng)name.target需要的所有服務(wù),并終止所有不需要的服務(wù),。 1.3.5 改變到拯救模式 systemctl rescue 這一命令與systemctl isolate rescue.target基本相同,,但是它會(huì)向目前登陸用戶發(fā)送信息,要想阻止信息發(fā)送,,可以用如下命令: systemctl --no-wall rescue 1.3.6 改變到救急模式 systemctl emergency 與拯救模式類似,,也會(huì)在進(jìn)入前向登陸用戶發(fā)送信息,也可以通過以下方式阻止信息發(fā)送: systemctl --no-wall emergency 1.4 關(guān)機(jī),、休眠,、睡眠 systemctl halt 關(guān)機(jī) systemctl poweroff 關(guān)機(jī)斷電 systemctl reboot 重啟 systemctl suspend 掛起 systemctl hibernate 休眠 systemctl hybrid-sleep 休眠并掛起 shutdown命令: 為了在一個(gè)特定的時(shí)間關(guān)機(jī)并對機(jī)器斷電,,可以用如下格式的命令: shutdown --poweroff hh:mm (hh:mm為24小時(shí)制時(shí)間格式) 當(dāng)然也可以用: shutdown --poweroff +m 在m分鐘后關(guān)機(jī) 如果想要取消關(guān)機(jī),,可以用: shutdown -c 1.5 在遠(yuǎn)程設(shè)備上操控systemd 除了可以在本機(jī)對systemd系統(tǒng)進(jìn)行控制外,其還允許你通過SSH協(xié)議連接到遠(yuǎn)程電腦上進(jìn)行操控,。但是遠(yuǎn)程主機(jī)必須得運(yùn)行sshd服務(wù),,你可以通過如下命令連接到該主機(jī)上: systemctl --host user_name@host_name command 除了前面部分需要加上--host user_name@host_name外,command是相同的 1.6 創(chuàng)建,、修改Systemd unit文件 Unit file具有如下形式: unit_name.type_extension 文件結(jié)構(gòu): [Unit] 描述與unit類型無關(guān)的信息,、對其它units的依賴 [unit type] 關(guān)于該unit類型的指引 [Install] 包含systemctl安裝命令(enable/disable) [Unit] Section: Description 針對該unit的描述,,該段文字會(huì)在systemctl status命令中顯示 Documentation 提供關(guān)于該unit的幫助文檔URIs After 定義unit啟動(dòng)順序,該unit會(huì)在該字段定義的unit啟動(dòng)后才啟動(dòng) Requires 配置依賴的服務(wù),,這里列出的unit會(huì)同時(shí)啟動(dòng) Wants 要求比Requires要若 Conflicts 沖突的units [Service] Section: Type simple 默認(rèn)值,; forking 該進(jìn)程啟動(dòng)后會(huì)產(chǎn)生一個(gè)子程序并成為服務(wù)的主進(jìn)程,父進(jìn)程隨之退出 oneshot 與simple相似,,但是該進(jìn)程會(huì)在后面的unit啟動(dòng)前關(guān)閉 dbus notify 隨后的units僅會(huì)在sd_notify()發(fā)送通知信息后啟動(dòng) idle ExecStart 指定unit啟動(dòng)后執(zhí)行的命令或腳本 ExecStop 指定unit結(jié)束后執(zhí)行的命令或腳本 ExecReload 指定unit重啟后執(zhí)行的命令或腳本 Restart 當(dāng)該項(xiàng)enabled,,則當(dāng)進(jìn)程退出后會(huì)重啟,當(dāng)然通過systemctl命令停止并不會(huì)重啟 RemainAfterExit 如果為True,,當(dāng)它退出后仍會(huì)認(rèn)為是活動(dòng)的,;默認(rèn)值為false,該字段對Type=oneshot很有用 [Install] Section Alias 提供該unit的別名,,不同別名通過空格間隔 RequiredBy 依賴該unit的units WantedBy 弱依賴units Also 指定會(huì)隨同該unit安裝或卸載的units 1.6.2 創(chuàng)建自定義unit文件 (1)準(zhǔn)備一個(gè)可執(zhí)行的自定義服務(wù),可以是一個(gè)腳本也可以是一個(gè)可執(zhí)行程序,。如果必須的話,,準(zhǔn)備一個(gè)包含該服務(wù)PID的PID文件。也可能會(huì)需要environment文件來儲(chǔ)存該服務(wù)用到的shell變量,。并確認(rèn)該腳本是可執(zhí)行的(chmod a+x)并且是非交互的,。 (2)在/etc/systemd/system/文件夾下創(chuàng)建一個(gè)unit文件,并確認(rèn)文件權(quán)限是正確的: touch /etc/systemd/system/name.service chmod 664 /etc/systemd/system/name.service (3) 打開該name.service文件并加入配置選項(xiàng),。下面是一個(gè)網(wǎng)絡(luò)相關(guān)的服務(wù)的例子: [Unit] Description=service_description After=network.target [Service] ExecStart=path_to_executable Type=forking PIDFile=path_to_pidfile [Install] WantedBy=default.target (4) 通知systemd有一個(gè)新的name.service文件存在,,運(yùn)行如下命令: systemctl daemon-reload systemctl start name.service 1.6.3 把SysV Init腳本轉(zhuǎn)變?yōu)閡nit文件 需要作復(fù)雜的變換:找到服務(wù)描述、服務(wù)依賴,、默認(rèn)target,、服務(wù)所用到的文件,這些過程比較復(fù)雜,,需要對啟動(dòng)腳本中的目的明確才行,。 1.6.4 修改現(xiàn)有的unit文件 安裝的服務(wù)的默認(rèn)unit文件一般儲(chǔ)存在/usr/lib/systemd/system/文件夾下,系統(tǒng)管理員不應(yīng)該直接修改這些文件,;任何自定義都要在/etc/systemd/system/文件夾下進(jìn)行,,根據(jù)所需要修改的程序,選擇以下方法中的一種即可: > 在/etc/systemd/system/unit.d/下建立一個(gè)文件夾,,這也是對大多數(shù)情況建議使用的方法,。這種方法允許對默認(rèn)配置增加額外的功能,而且能夠保持原來的unit文件,。 > 在/etc/systemd/system下拷貝/usr/lib/systemd/system中初始的unit文件,。這一拷貝將會(huì)覆蓋初始配置,因此軟件包更新的配置并不能自動(dòng)更新進(jìn)來,。這種方法經(jīng)常用在對配置需要做永久的改動(dòng),,而不論軟件包是否更新,。 如果想要復(fù)原默認(rèn)配置,那么只需要?jiǎng)h除以上創(chuàng)建的配置文件,,而后重啟系統(tǒng)或者運(yùn)行如下命令即可: systemctl daemon-reload daemon-reload選項(xiàng)會(huì)重新加載所有的unit文件并重新生成依賴樹,,你也可以利用如下方法達(dá)到同樣效果: init q 同樣,如果修改的unit文件屬于一個(gè)正在運(yùn)行的服務(wù),,那么服務(wù)必須重啟才能接受新的設(shè)置: systemctl restart name.service · 拓展默認(rèn)unit配置: 為了對默認(rèn)的unit文件增加一些額外的選項(xiàng),,首先需要在/etc/systemd/system/下創(chuàng)建配置文件夾: mkdir /etc/systemd/system/name.service.d 在上面的目錄中新建配置文件,記住文件后綴必須為.conf touch /etc/systemd/system/name.service.d/config_name.conf 然后在該文件中在相應(yīng)的字段中加入配置即可,。為了是修改生效,,需要執(zhí)行: systemctl daemon-reload systemctl restart name.service · 重寫默認(rèn)unit配置: 為了要對軟件包的配置作持久的更改,需要把unit文件拷貝到/etc/systemd/system/目錄下: cp /usr/lib/systemd/system/name.service /etc/systemd/system/name.service 然后對拷貝的文件做出需要的修改,。之后運(yùn)行: systemctl daemon-reload systemctl restart name.service |
|