systemd是一個(gè) Linux 系統(tǒng)基礎(chǔ)組件的集合,提供了一個(gè)系統(tǒng)和服務(wù)管理器,運(yùn)行為 PID 1 并負(fù)責(zé)啟動(dòng)其它程序。功能包括:支持并行化任務(wù);同時(shí)采用 socket 式與 D-Bus 總線式激活服務(wù);按需啟動(dòng)守護(hù)進(jìn)程(daemon);利用 Linux 的 cgroups 監(jiān)視進(jìn)程;支持快照和系統(tǒng)恢復(fù);維護(hù)掛載點(diǎn)和自動(dòng)掛載點(diǎn);各服務(wù)間基于依賴關(guān)系進(jìn)行精密控制。systemd 支持 SysV 和 LSB 初始腳本,可以替代 sysvinit。除此之外,功能還包括日志進(jìn)程、控制基礎(chǔ)系統(tǒng)配置,維護(hù)登陸用戶列表以及系統(tǒng)賬戶、運(yùn)行時(shí)目錄和設(shè)置,可以運(yùn)行容器和虛擬機(jī),可以簡(jiǎn)單的管理網(wǎng)絡(luò)配置、網(wǎng)絡(luò)時(shí)間同步、日志轉(zhuǎn)發(fā)和名稱解析等。 systemd 基本工具監(jiān)視和控制systemd的主要命令是systemctl。該命令可用于查看系統(tǒng)狀態(tài)和管理系統(tǒng)及服務(wù)。詳見systemctl(1)。、 提示:在 systemctl 參數(shù)中添加 -H <用戶名>@<主機(jī)名> 可以實(shí)現(xiàn)對(duì)其他機(jī)器的遠(yuǎn)程控制。該功能使用 SSH 連接。 分析系統(tǒng)狀態(tài)顯示 系統(tǒng)狀態(tài): 所有可用的單元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目錄(后者優(yōu)先級(jí)更高)。查看所有已安裝服務(wù): 顯示 cgroup slice, 內(nèi)存和父 PID: 使用單元一個(gè)單元配置文件可以描述如下內(nèi)容之一:系統(tǒng)服務(wù)(.service)、掛載點(diǎn)(.mount)、sockets(.sockets) 、系統(tǒng)設(shè)備(.device)、交換分區(qū)(.swap)、文件路徑(.path)、啟動(dòng)目標(biāo)(.target)、由 systemd 管理的計(jì)時(shí)器(.timer)。詳情參閱 systemd.unit(5)。 使用 systemctl 控制單元時(shí),通常需要使用單元文件的全名,包括擴(kuò)展名(例如 sshd.service )。但是有些單元可以在 systemctl 中使用簡(jiǎn)寫方式。 如果無擴(kuò)展名,systemctl 默認(rèn)把擴(kuò)展名當(dāng)作 .service 。例如 netcfg 和 netcfg.service 是等價(jià)的。 掛載點(diǎn)會(huì)自動(dòng)轉(zhuǎn)化為相應(yīng)的 .mount 單元。例如 /home 等價(jià)于 home.mount 。 設(shè)備會(huì)自動(dòng)轉(zhuǎn)化為相應(yīng)的 .device 單元,所以 /dev/sda2 等價(jià)于 dev-sda2.device 。 注意:有一些單元的名稱包含一個(gè) @ 標(biāo)記(例如: name@string.service ),這意味著它是模板單元 name@.service 的一個(gè) 實(shí)例。 string 被稱作實(shí)例標(biāo)識(shí)符,在 systemctl 調(diào)用模板單元時(shí),會(huì)將其當(dāng)作一個(gè)參數(shù)傳給模板單元,模板單元會(huì)使用這個(gè)傳入的參數(shù)代替模板中的 %I 指示符。 在實(shí)例化之前,systemd 會(huì)先檢查 name@string.suffix 文件是否存在(如果存在,就直接使用這個(gè)文件,而不是模板實(shí)例化)。大多數(shù)情況下,包含 @ 標(biāo)記都意味著這個(gè)文件是模板。如果一個(gè)模板單元沒有實(shí)例化就調(diào)用,該調(diào)用會(huì)返回失敗,因?yàn)槟0鍐卧械?%I 指示符沒有被替換。 提示:
立即激活單元: 立即停止單元: 重啟單元: 輸出單元運(yùn)行狀態(tài): 電源管理安裝 polkit 后才能以普通用戶身份使用電源管理。 如果你正登錄在一個(gè)本地的 systemd-logind 用戶會(huì)話,且當(dāng)前沒有其它活動(dòng)的會(huì)話,那么以下命令無需 root 權(quán)限即可執(zhí)行。否則(例如,當(dāng)前有另一個(gè)用戶登錄在某個(gè) tty ), systemd 將會(huì)自動(dòng)請(qǐng)求輸入root密碼。 重啟: $ systemctl reboot $ systemctl poweroff $ systemctl suspend $ systemctl hibernate $ systemctl hybrid-sleep 編寫單元文件systemd 單元文件的語法來源于 XDG 桌面項(xiàng)配置文件.desktop文件,最初的源頭則是Microsoft Windows的.ini文件。單元文件可以從多個(gè)地方加載,systemctl show --property=UnitPath 可以按優(yōu)先級(jí)從低到高顯示加載目錄: /usr/lib/systemd/system/ :軟件包安裝的單元 /etc/systemd/system/ :系統(tǒng)管理員安裝的單元 注意:當(dāng) systemd 運(yùn)行在用戶模式下時(shí),使用的加載路徑是完全不同的。 systemd 單元名僅能包含 ASCII 字符,下劃線和點(diǎn)號(hào)和有特殊意義的字符(’@’, '-’)。其它字符需要用 C-style “\x2d” 替換。參閱 systemd.unit(5) 和 systemd-escape(1) 。 單元文件的語法,可以參考系統(tǒng)已經(jīng)安裝的單元,也可以參考 systemd.service(5) 中的EXAMPLES章節(jié)。 提示: 以 # 開頭的注釋可能也能用在 unit-files 中,但是只能在新行中使用。不要在 systemd 的參數(shù)后面使用行末注釋, 否則 unit 將會(huì)啟動(dòng)失敗。 處理依賴關(guān)系使用 systemd 時(shí),可通過正確編寫單元配置文件來解決其依賴關(guān)系。典型的情況是,單元 A 要求單元 B 在 A 啟動(dòng)之前運(yùn)行。在此情況下,向單元 A 配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依賴關(guān)系是可選的,可添加 Wants=B 和 After=B 。請(qǐng)注意 Wants= 和 Requires= 并不意味著 After= ,即如果 After= 選項(xiàng)沒有制定,這兩個(gè)單元將被并行啟動(dòng)。 依賴關(guān)系通常被用在服務(wù)(service)而不是目標(biāo)(target)上。例如, network.target 一般會(huì)被某個(gè)配置網(wǎng)絡(luò)接口的服務(wù)引入,所以,將自定義的單元排在該服務(wù)之后即可,因?yàn)?network.target 已經(jīng)啟動(dòng)。 服務(wù)類型編寫自定義的 service 文件時(shí),可以選擇幾種不同的服務(wù)啟動(dòng)方式。啟動(dòng)方式可通過配置文件
修改現(xiàn)存單元文件為了避免和 pacman 沖突,不應(yīng)該直接編輯軟件包提供的文件。有兩種方法可以不改動(dòng)原始文件就做到修改單元文件:創(chuàng)建一個(gè)優(yōu)先級(jí)更高的本地單元文件或創(chuàng)建一個(gè)片段,應(yīng)用到原始單元文件之上。兩種方法都需要在修改后重新加載單元,用 # systemctl daemon-reload 提示:
替換單元文件要替換 # systemctl reenable unit 或者運(yùn)行: # systemctl edit --full unit 這將會(huì)在記事本中打開 注意:即使 Pacman 更新了新的單元文件,軟件包中的版本也不會(huì)被使用,所以這個(gè)方式會(huì)增加系統(tǒng)維護(hù)的難度,推薦使用下面一種方法。 附加配置片段要附加配置片段,先創(chuàng)建名為 # systemctl edit unit 這將會(huì)在編輯器中打開文件 Note:并不是所有參數(shù)都會(huì)被子配置文件覆蓋。例如要修改 重置到軟件包版本要回退單元的變更,使用 # systemctl revert unit 示例例如,如果想添加一個(gè)額外的依賴,創(chuàng)建如下文件即可: /etc/systemd/system/<unit>.d/customdependency.conf [Unit] Requires=<新依賴> After=<新依賴> 要修改一個(gè)非 /etc/systemd/system/unit.d/customexec.conf [Service] ExecStart= ExecStart=new command 修改 下面是自動(dòng)重啟服務(wù)的一個(gè)例子: /etc/systemd/system/unit.d/restart.conf [Service] Restart=always RestartSec=30 目標(biāo)(target)運(yùn)行級(jí)別(runlevel)是一個(gè)舊的概念?,F(xiàn)在,systemd 引入了一個(gè)和運(yùn)行級(jí)別功能相似又不同的概念——目標(biāo)(target)。不像數(shù)字表示的啟動(dòng)級(jí)別,每個(gè)目標(biāo)都有名字和獨(dú)特的功能,并且能同時(shí)啟用多個(gè)。一些目標(biāo)繼承其他目標(biāo)的服務(wù),并啟動(dòng)新服務(wù)。systemd 提供了一些模仿 sysvinit 運(yùn)行級(jí)別的目標(biāo),仍可以使用舊的 獲取當(dāng)前目標(biāo)不要使用 $ systemctl list-units --type=target 創(chuàng)建自定義目標(biāo)在 sysvinit中有明確定義的運(yùn)行級(jí)別(如:0、1、3、5、6)與 systemd中特定的 目標(biāo)存在一一對(duì)應(yīng)的關(guān)系。然而,對(duì)于用戶自定義運(yùn)行級(jí)別(2、4)卻沒有。如需要同樣功能,建議你以原有運(yùn)行級(jí)別所對(duì)應(yīng)的 systemd 目標(biāo)為基礎(chǔ),新建一個(gè) “SysV 運(yùn)行級(jí)別” 與 “systemd 目標(biāo)” 對(duì)照表
切換當(dāng)前運(yùn)行目標(biāo)systemd中,運(yùn)行目標(biāo)通過“目標(biāo)單元”訪問。通過如下命令切換: # systemctl isolate graphical.target 該命令僅更改當(dāng)前運(yùn)行目標(biāo),對(duì)下次啟動(dòng)無影響。這等價(jià)于sysvinit中的 更改開機(jī)默認(rèn)啟動(dòng)目標(biāo)開機(jī)啟動(dòng)的目標(biāo)是 用 systemctl檢查當(dāng)前的默認(rèn)啟動(dòng)目標(biāo): # systemctl get-default 用 systemctl修改 $ systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target. 另一方法是向bootloader添加內(nèi)核參數(shù):
默認(rèn)目標(biāo)順序Systemd 根據(jù)下面順序選擇
臨時(shí)文件
臨時(shí)文件通常和服務(wù)文件同時(shí)提供,以生成守護(hù)進(jìn)程需要的文件和目錄。例如 Samba 服務(wù)需要目錄 /usr/lib/tmpfiles.d/samba.conf D /run/samba 0755 root root 此外,臨時(shí)文件還可以用來在開機(jī)時(shí)向特定文件寫入某些內(nèi)容。比如,要禁止系統(tǒng)從USB設(shè)備喚醒,利用舊的 /etc/tmpfiles.d/disable-usb-wake.conf w /proc/acpi/wakeup - - - - USBE 詳情參見 注意:該方法不能向 定時(shí)器一個(gè)定時(shí)器是一個(gè)以 注意:定時(shí)器很大程度上可取代 掛載因?yàn)?systemd 也負(fù)責(zé)按 systemd擴(kuò)展了 fstab 的傳統(tǒng)功能,提供了額外的掛載選項(xiàng)。例如可以確保一個(gè)掛載僅在網(wǎng)絡(luò)已經(jīng)連接時(shí)進(jìn)行,或者僅當(dāng)另外一個(gè)分區(qū)已掛載時(shí)再掛載。這些選項(xiàng)通常以 automounting也是一個(gè)例子,可以在使用時(shí),而不是啟動(dòng)時(shí)掛載分區(qū),詳情請(qǐng)參考 fstab#Automount with systemd。 GPT 分區(qū)自動(dòng)掛載在 GPT 分區(qū)磁盤系統(tǒng)上,systemd-gpt-auto-generator(8) 會(huì)按照 可探測(cè)分區(qū)規(guī)范 進(jìn)行掛載??梢栽? 要禁用自動(dòng)掛載,請(qǐng)修改分區(qū)的 類型 GUID 或設(shè)置分區(qū)屬性 63 位 “不自動(dòng)掛載”,詳情參考 gdisk#Prevent GPT partition automounting。 Tips and tricksRunning services after the network is upTo delay a service after the network is up, include the following dependencies in the .servicefile: /etc/systemd/system/foo.service [Unit] ...Wants=network-online.targetAfter=network-online.target ... The network wait service of the particular application that manages the network, must also be enabled so that
For more detailed explanations see Running services after the network is up in the systemd wiki. Enable installed units by default** Reason:How does it work with instantiated units? (Discuss in Talk:Systemd (簡(jiǎn)體中文)#) Arch Linux ships with If this behavior is not desired, simply create a symlink from Note:Enabling all units by default may cause problems with packages that contain two or more mutually exclusive units. systemctl presetis designed to be used by distributions and spins or system administrators. In the case where two conflicting units would be enabled, you should explicitly specify which one is to be disabled in a preset configuration file as specified in the manpage for Sandboxing application environmentsA unit file can be created as a sandbox to isolate applications and their processes within a hardened virtual environment. systemd leverages namespaces, white-/blacklisting of Capabilities, and control groups to container processes through an extensive execution environment configuration. The enhancement of an existing systemd unit file with application sandboxing typically requires trial-and-error tests accompanied by the generous use of strace, stderr and journalctl error logging and output facilities. You may want to first search upstream documentation for already done tests to base trials on. Some examples on how sandboxing with systemd can be deployed:
疑難解答尋找錯(cuò)誤這個(gè)例子中的失敗的服務(wù)是 1.通過 systemd尋找啟動(dòng)失敗的服務(wù): $ systemctl --state=failed systemd-modules-load.service loaded failed failed Load Kernel Modules 或者使用 systemd消息: $ journalctl -fp err 2.我們發(fā)現(xiàn)了啟動(dòng)失敗的 $ systemctl status systemd-modules-load systemd-modules-load.service - Load Kernel Modules Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static) Active: failed (Result: exit-code) since So 2013-08-25 11:48:13 CEST; 32s ago Docs: man:systemd-modules-load.service(8). man:modules-load.d(5) Process: 15630 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=1/FAILURE) 如果沒列出 3.現(xiàn)在得到了 PID ,你就可以進(jìn)一步探查錯(cuò)誤的詳細(xì)信息了.通過下列的命令收集日志,PID 參數(shù)是你剛剛得到的 $ journalctl -b _PID=15630 -- Logs begin at Sa 2013-05-25 10:31:12 CEST, end at So 2013-08-25 11:51:17 CEST. -- Aug 25 11:48:13 mypc systemd-modules-load[15630]: Failed to find module 'blacklist usblp'Aug 25 11:48:13 mypc systemd-modules-load[15630]: Failed to find module 'install usblp /bin/false' 4.我們發(fā)現(xiàn)有些內(nèi)核模塊的配置文件不正確,因此在 $ ls -Al /etc/modules-load.d/ ... -rw-r--r-- 1 root root 79 1. Dez 2012 blacklist.conf -rw-r--r-- 1 root root 1 2. M?r 14:30 encrypt.conf -rw-r--r-- 1 root root 3 5. Dez 2012 printing.conf -rw-r--r-- 1 root root 6 14. Jul 11:01 realtek.conf -rw-r--r-- 1 root root 65 2. Jun 23:01 virtualbox.conf ... 5.錯(cuò)誤消息 /etc/modules-load.d/blacklist.conf # blacklist usblp# install usblp /bin/false 6.最后重新啟動(dòng) # systemctl start systemd-modules-load 如果服務(wù)成功啟動(dòng),不會(huì)有任何輸出.如果你還是遇到了錯(cuò)誤,回到步驟三,獲得新的 PID 來跟蹤日志并解決錯(cuò)誤. 可以像這樣確認(rèn)服務(wù)成功啟動(dòng): $ systemctl status systemd-modules-load systemd-modules-load.service - Load Kernel Modules Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static) Active: active (exited) since So 2013-08-25 12:22:31 CEST; 34s ago Docs: man:systemd-modules-load.service(8) man:modules-load.d(5) Process: 19005 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=0/SUCCESS) Aug 25 12:22:31 mypc systemd[1]: Started Load Kernel Modules. 診斷啟動(dòng)問題使用如下內(nèi)核參數(shù)引導(dǎo): 更多有關(guān)調(diào)試的信息,參見該文。 診斷一個(gè)服務(wù)如果某個(gè) systemd服務(wù)的工作狀況不合預(yù)期,希望調(diào)試的話,設(shè)置 在此服務(wù)的配置文件片段中加入: [Service] Environment=SYSTEMD_LOG_LEVEL=debug 或者等價(jià)的,臨時(shí)編輯系統(tǒng)單元文件,例如:
重啟 systemd-networkd服務(wù),用 關(guān)機(jī)/重啟十分緩慢如果關(guān)機(jī)特別慢(甚至跟死機(jī)了一樣),很可能是某個(gè)拒不退出的服務(wù)在作怪。systemd 會(huì)等待一段時(shí)間,然后再嘗試殺死它。請(qǐng)閱讀這篇文章,確認(rèn)你是否是該問題受害者。 短時(shí)進(jìn)程無日志記錄若 禁止在程序崩潰時(shí)轉(zhuǎn)儲(chǔ)內(nèi)存要使用老的內(nèi)核轉(zhuǎn)儲(chǔ),創(chuàng)建下面文件: /etc/sysctl.d/49-coredump.conf kernel.core_pattern = core kernel.core_uses_pid = 0 然后運(yùn)行: # /usr/lib/systemd/systemd-sysctl 同樣可能需要執(zhí)行“unlimit”設(shè)置文件大?。?/p> $ ulimit -c unlimited 更多信息請(qǐng)參閱 sysctl.d 和 /proc/sys/kernel 文檔。 啟動(dòng)的時(shí)間太長(zhǎng)不少用戶用了 有些用戶的問題是 systemd-tmpfiles-setup.service 在啟動(dòng)時(shí)啟動(dòng)失敗從 systemd 219 開始, 參閱 Access Control Lists#Enabling ACL 獲得如何包含 啟動(dòng)時(shí)顯示的 systemd 版本和安裝版本不一致需要 重新生成 initramfs。 提示:可以使用 pacman 鉤子在更新 systemd時(shí)重新生成 initramfs。參考 這個(gè)帖子 和 Pacman#Hooks. 禁用遠(yuǎn)程機(jī)器的 emergency 模式如果遠(yuǎn)程機(jī)器位于云主機(jī),emergency 模式會(huì)導(dǎo)致系統(tǒng)無法遠(yuǎn)程連接,可以通過下面方式禁用緊急模式: # systemctl mask emergency.service # systemctl mask emergency.target 轉(zhuǎn)載于:https://blog.51cto.com/19910312/2379860 |
|