Centos7特性——systemd
Centos7特性——systemd
理解Linux啟動(dòng)過程
在我們打開Linux電腦的電源后第一個(gè)啟動(dòng)的進(jìn)程就是init。分配給init進(jìn)程的PID是1。它是系統(tǒng)其他所有進(jìn)程的父進(jìn)程。當(dāng)一臺(tái)Linux電腦啟動(dòng)后,處理器會(huì)先在系統(tǒng)存儲(chǔ)中查找BIOS,之后BIOS會(huì)檢測(cè)系統(tǒng)資源然后找到第一個(gè)引導(dǎo)設(shè)備,通常為硬盤,然后會(huì)查找硬盤的主引導(dǎo)記錄(MBR),然后加載到內(nèi)存中并把控制權(quán)交給它,以后的啟動(dòng)過程就由MBR控制。
主引導(dǎo)記錄會(huì)初始化引導(dǎo)程序(Linux上有兩個(gè)著名的引導(dǎo)程序,GRUB和LILO,80%的Linux系統(tǒng)在用GRUB引導(dǎo)程序),這個(gè)時(shí)候GRUB或LILO會(huì)加載內(nèi)核模塊。內(nèi)核會(huì)馬上查找/sbin下的“init”程序并執(zhí)行它。從這里開始init成為了Linux系統(tǒng)的父進(jìn)程。init讀取的第一個(gè)文件是/etc/inittab,通過它init會(huì)確定我們Linux操作系統(tǒng)的運(yùn)行級(jí)別。它會(huì)從文件/etc/fstab里查找分區(qū)表信息然后做相應(yīng)的掛載。然后init會(huì)啟動(dòng)/etc/init.d里指定的默認(rèn)啟動(dòng)級(jí)別的所有服務(wù)/腳本。所有服務(wù)在這里通過init一個(gè)一個(gè)被初始化。在這個(gè)過程里,init每次只啟動(dòng)一個(gè)服務(wù),所有服務(wù)/守護(hù)進(jìn)程都在后臺(tái)執(zhí)行并由init來管理。
關(guān)機(jī)過程差不多是相反的過程,首先init停止所有服務(wù),最后階段會(huì)卸載文件系統(tǒng)。
以上提到的啟動(dòng)過程有一些不足的地方。而用一種更好的方式來替代傳統(tǒng)init的需求已經(jīng)存在很長時(shí)間了。也產(chǎn)生了許多替代方案。其中比較著名的有Upstart,Epoch,Muda和Systemd。而Systemd獲得最多關(guān)注并被認(rèn)為是目前最佳的方案。
理解Systemd
開發(fā)Systemd的主要目的就是減少系統(tǒng)引導(dǎo)時(shí)間和計(jì)算開銷。Systemd(系統(tǒng)管理守護(hù)進(jìn)程),最開始以GNU GPL協(xié)議授權(quán)開發(fā),現(xiàn)在已轉(zhuǎn)為使用GNU LGPL協(xié)議,它是如今討論最熱烈的引導(dǎo)和服務(wù)管理程序。如果你的Linux系統(tǒng)配置為使用Systemd引導(dǎo)程序,它取替?zhèn)鹘y(tǒng)的SysV init,啟動(dòng)過程將交給systemd處理。Systemd的一個(gè)核心功能是它同時(shí)支持SysV init的后開機(jī)啟動(dòng)腳本。
Systemd引入了并行啟動(dòng)的概念,它會(huì)為每個(gè)需要啟動(dòng)的守護(hù)進(jìn)程建立一個(gè)套接字,這些套接字對(duì)于使用它們的進(jìn)程來說是抽象的,這樣它們可以允許不同守護(hù)進(jìn)程之間進(jìn)行交互。Systemd會(huì)創(chuàng)建新進(jìn)程并為每個(gè)進(jìn)程分配一個(gè)控制組(cgroup)。處于不同控制組的進(jìn)程之間可以通過內(nèi)核來互相通信。systemd處理開機(jī)啟動(dòng)進(jìn)程的方式非常漂亮,和傳統(tǒng)基于init的系統(tǒng)比起來優(yōu)化了太多。讓我們看下Systemd的一些核心功能。
·????????和init比起來引導(dǎo)過程簡化了很多
·????????Systemd支持并發(fā)引導(dǎo)過程從而可以更快啟動(dòng)
·????????通過控制組來追蹤進(jìn)程,而不是PID
·????????優(yōu)化了處理引導(dǎo)過程和服務(wù)之間依賴的方式
·????????支持系統(tǒng)快照和恢復(fù)
·????????監(jiān)控已啟動(dòng)的服務(wù);也支持重啟已崩潰服務(wù)
·????????包含了systemd-login模塊用于控制用戶登錄
·????????支持加載和卸載組件
·????????低內(nèi)存使用痕跡以及任務(wù)調(diào)度能力
·????????記錄事件的Journald模塊和記錄系統(tǒng)日志的syslogd模塊
Systemd同時(shí)也清晰地處理了系統(tǒng)關(guān)機(jī)過程。它在/usr/lib/systemd/目錄下有三個(gè)腳本,分別叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。這幾個(gè)腳本會(huì)在用戶選擇關(guān)機(jī),重啟或待機(jī)時(shí)執(zhí)行。在接收到關(guān)機(jī)事件時(shí),systemd首先卸載所有文件系統(tǒng)并停止所有內(nèi)存交換設(shè)備,斷開存儲(chǔ)設(shè)備,之后停止所有剩下的進(jìn)程。
systemd基本工具
監(jiān)視和控制systemd的主要命令是systemctl。該命令可用于查看系統(tǒng)狀態(tài)和管理系統(tǒng)及服務(wù)。詳見man1 systemctl。
注意:
§? 在 systemctl 參數(shù)中添加 -H <用戶名>@<主機(jī)名> 可以實(shí)現(xiàn)對(duì)其他機(jī)器的遠(yuǎn)程控制。該過程使用ssh鏈接。
§? systemadm是systemd 的官方圖形前端
分析系統(tǒng)狀態(tài)
輸出激活的單元:
1.??? $?systemctl
以下命令等效:
1.??? $?systemctl?list-units
輸出運(yùn)行失敗的單元:
1.??? $?systemctl?--failed
所有可用的單元文件存放在 /usr/lib/systemd/system/ 和/etc/systemd/system/ 目錄(后者優(yōu)先級(jí)更高)。查看所有已安裝服務(wù):
1.??? $?systemctl?list-unit-files
使用單元unit
一個(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)。詳情參閱 man 5 systemd.unit。
使用 systemctl 控制單元時(shí),通常需要使用單元文件的全名,包括擴(kuò)展名(例如sshd.service)。但是有些單元可以在systemctl中使用簡寫方式。
§? 如果無擴(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)記, (e.g. 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 文件是否存在(如果存在,應(yīng)該就是直接使用這個(gè)文件,而不是模板實(shí)例化了)。大多數(shù)情況下,包換 @ 標(biāo)記都意味著這個(gè)文件是模板。如果一個(gè)模板單元沒有實(shí)例化就調(diào)用,該調(diào)用會(huì)返回失敗,因?yàn)槟0鍐卧械?%I 指示符沒有被替換。
立即激活單元:
1.??? #?systemctl?start?<單元>
立即停止單元:
1.??? #?systemctl?stop?<單元>
重啟單元:
1.??? #?systemctl?restart?<單元>
命令單元重新讀取配置:
1.??? #?systemctl?reload?<單元>
輸出單元運(yùn)行狀態(tài):
1.??? $?systemctl?status?<單元>
檢查單元是否配置為自動(dòng)啟動(dòng):
1.??? $?systemctl?is-enabled?<單元>
開機(jī)自動(dòng)激活單元:
1.??? #?systemctl?enable?<單元>
注意: 如果服務(wù)沒有Install段落,一般意味著應(yīng)該通過其它服務(wù)自動(dòng)調(diào)用它們。如果真的需要手動(dòng)安裝,可以直接連接服務(wù),如下(將foo替換為真實(shí)的服務(wù)名):
1.??? #?ln?-s?/usr/lib/systemd/system/foo.service?/etc/systemd/system/graphical.target.wants/
取消開機(jī)自動(dòng)激活單元:
1.??? #?systemctl?disable?<單元>
顯示單元的手冊(cè)頁(必須由單元文件提供):
1.??? #?systemctl?help?<單元>
重新載入 systemd,掃描新的或有變動(dòng)的單元:
1.??? #?systemctl?daemon-reload
電源管理
安裝 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密碼。
重啟:
1.??? $?systemctl?reboot
退出系統(tǒng)并停止電源:
1.??? $?systemctl?poweroff
待機(jī):
1.??? $?systemctl?suspend
休眠:
1.??? $?systemctl?hibernate
混合休眠模式(同時(shí)休眠到硬盤并待機(jī)):
1.??? $?systemctl?hybrid-sleep
編寫單元文件
systemd單元文件的語法來源于 XDG桌面入口配置文件.desktop文件,最初的源頭則是Microsoft Windows的.ini文件。單元文件可以從兩個(gè)地方加載,優(yōu)先級(jí)從低到高分別是:
§? /usr/lib/systemd/system/: 軟件包安裝的單元
§? /etc/systemd/system/: 系統(tǒng)管理員安裝的單元
注意: 當(dāng)systemd運(yùn)行在用戶模式下時(shí),使用的加載路徑是完全不同的。
單元文件的語法,可以參考系統(tǒng)已經(jīng)安裝的單元,也可以參考man systemd.service中的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)方式可通過配置文件[Service] 段中的 Type= 參數(shù)進(jìn)行設(shè)置。
Type=simple(默認(rèn)值):systemd認(rèn)為該服務(wù)將立即啟動(dòng)。服務(wù)進(jìn)程不會(huì)fork。如果該服務(wù)要啟動(dòng)其他服務(wù),不要使用此類型啟動(dòng),除非該服務(wù)是socket激活型。
Type=forking:systemd認(rèn)為當(dāng)該服務(wù)進(jìn)程fork,且父進(jìn)程退出后服務(wù)啟動(dòng)成功。對(duì)于常規(guī)的守護(hù)進(jìn)程(daemon),除非你確定此啟動(dòng)方式無法滿足需求,使用此類型啟動(dòng)即可。使用此啟動(dòng)類型應(yīng)同時(shí)指定 PIDFile=,以便systemd能夠跟蹤服務(wù)的主進(jìn)程。
Type=oneshot:這一選項(xiàng)適用于只執(zhí)行一項(xiàng)任務(wù)、隨后立即退出的服務(wù)。可能需要同時(shí)設(shè)置RemainAfterExit=yes 使得 systemd 在服務(wù)進(jìn)程退出之后仍然認(rèn)為服務(wù)處于激活狀態(tài)。
Type=notify:與 Type=simple 相同,但約定服務(wù)會(huì)在就緒后向 systemd 發(fā)送一個(gè)信號(hào)。這一通知的實(shí)現(xiàn)由 libsystemd-daemon.so提供。
Type=dbus:若以此方式啟動(dòng),當(dāng)指定的 BusName 出現(xiàn)在DBus系統(tǒng)總線上時(shí),systemd認(rèn)為服務(wù)就緒。
Type=idle: systemd會(huì)等待所有任務(wù)(Jobs)處理完成后,才開始執(zhí)行idle類型的單元。除此之外,其他行為和Type=simple 類似。
type的更多解釋可以參考?systemd.service(5)。
修改現(xiàn)存單元文件
要更改由軟件包提供的單元文件,先創(chuàng)建名為 /etc/systemd/system/<單元名>.d/ 的目錄(如 /etc/systemd/system/httpd.service.d/),然后放入*.conf 文件,其中可以添加或重置參數(shù)。這里設(shè)置的參數(shù)優(yōu)先級(jí)高于原來的單元文件。例如,如果想添加一個(gè)額外的依賴,創(chuàng)建這么一個(gè)文件即可:
/etc/systemd/system/<unit>.d/customdependency.conf
[Unit]
Requires=<新依賴>
After=<新依賴>
其它舉例,
/etc/systemd/system/unit.d/customexec.conf
?
[Service]
ExecStartExecStart=
ExecStart=new?command
想知道為什么修改 ExecStart 前必須將其置空
下面是自動(dòng)重啟服務(wù)的一個(gè)例子:
/etc/systemd/system/unit.d/restart.conf
?
[Service]
Restart=always
RestartSec=30
然后運(yùn)行以下命令使更改生效:
#?systemctl?daemon-reload
#?systemctl?restart?<單元>
此外,把舊的單元文件從 /usr/lib/systemd/system/ 復(fù)制到/etc/systemd/system/,然后進(jìn)行修改,也可以達(dá)到同樣效果。在/etc/systemd/system/ 目錄中的單元文件的優(yōu)先級(jí)總是高于/usr/lib/systemd/system/ 目錄中的同名單元文件。注意,當(dāng) /usr/lib/ 中的單元文件因軟件包升級(jí)變更時(shí),/etc/ 中自定義的單元文件不會(huì)同步更新。此外,你還得執(zhí)行 systemctlreenable <unit>,手動(dòng)重新啟用該單元。因此,建議使用前面一種利用 *.conf 的方法。
小貼士: 用 systemd-delta 命令來查看哪些單元文件被覆蓋、哪些被修改。系統(tǒng)維護(hù)的時(shí)候需要及時(shí)了解哪些單元已經(jīng)有了更新
單元配置文件的 vim 語法高亮支持
可從官方倉庫安裝 vim-systemd 軟件包,使 unit 配置文件在 Vim 下支持語法高亮。
目標(biāo)(target)
啟 動(dòng)級(jí)別(runlevel)是一個(gè)舊的概念?,F(xiàn)在,systemd 引入了一個(gè)和啟動(dòng)級(jí)別功能相似又不同的概念——目標(biāo)(target)。不像數(shù)字表示的啟動(dòng)級(jí)別,每個(gè)目標(biāo)都有名字和獨(dú)特的功能,并且能同時(shí)啟用多個(gè)。一些 目標(biāo)繼承其他目標(biāo)的服務(wù),并啟動(dòng)新服務(wù)。systemd 提供了一些模仿 sysvinit 啟動(dòng)級(jí)別的目標(biāo),仍可以使用舊的 telinit 啟動(dòng)級(jí)別 命令切換。
獲取當(dāng)前目標(biāo)
不要使用 runlevel 命令了:
$?systemctl?list-units?--type=target
創(chuàng)建新目標(biāo)
在 Fedora 中,啟動(dòng)級(jí)別 0、1、3、5、6 都被賦予特定用途,并且都對(duì)應(yīng)一個(gè) systemd 的目標(biāo)。然而,沒有什么很好的移植用戶定義的啟動(dòng)級(jí)別(2、4)的方法。要實(shí)現(xiàn)類似功能,可以以原有的啟動(dòng)級(jí)別為基礎(chǔ),創(chuàng)建一個(gè)新的目標(biāo)/etc/systemd/system/<新目標(biāo)>(可以參考 /usr/lib/systemd/system/graphical.target),創(chuàng)建 /etc/systemd/system/<新目標(biāo)>.wants 目錄,向其中加入額外服務(wù)的鏈接(指向 /usr/lib/systemd/system/ 中的單元文件)。
SysV 啟動(dòng)級(jí)別 | Systemd 目標(biāo) | 注釋 |
0 | runlevel0.target, poweroff.target | 中斷系統(tǒng)(halt) |
1, s, single | runlevel1.target, rescue.target | 單用戶模式 |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用戶自定義啟動(dòng)級(jí)別,通常識(shí)別為級(jí)別3。 |
3 | runlevel3.target, multi-user.target | 多用戶,無圖形界面。用戶可以通過終端或網(wǎng)絡(luò)登錄。 |
5 | runlevel5.target, graphical.target | 多用戶,圖形界面。繼承級(jí)別3的服務(wù),并啟動(dòng)圖形界面服務(wù)。 |
6 | runlevel6.target, reboot.target | 重啟 |
emergency | emergency.target | 急救模式(Emergency shell) |
目標(biāo)表
切換啟動(dòng)級(jí)別/目標(biāo)
systemd 中,啟動(dòng)級(jí)別通過“目標(biāo)單元”訪問。通過如下命令切換:
#?systemctl?isolate?graphical.target
該命令對(duì)下次啟動(dòng)無影響。等價(jià)于telinit 3 或 telinit 5。
修改默認(rèn)啟動(dòng)級(jí)別/目標(biāo)
開機(jī)啟動(dòng)進(jìn)的目標(biāo)是 default.target,默認(rèn)鏈接到 graphical.target (大致相當(dāng)于原來的啟動(dòng)級(jí)別5)。可以通過內(nèi)核參數(shù)更改默認(rèn)啟動(dòng)級(jí)別:
小貼士: 可以省略擴(kuò)展名 .target。
?systemd.unit=multi-user.target (大致相當(dāng)于級(jí)別3)
?systemd.unit=rescue.target (大致相當(dāng)于級(jí)別1)
另一個(gè)方法是修改 default.target
可以通過systemctl 修改它:
#?systemctl?enable?multi-user.target
命令執(zhí)行情況由 systemctl 顯示:鏈接/etc/systemd/system/default.target 被創(chuàng)建,指向新的默認(rèn)啟動(dòng)級(jí)別。該方法當(dāng)且僅當(dāng)目標(biāo)配置文件中有以下內(nèi)容時(shí)有效:
[Install]
Alias=default.target
目前,multi-user.target、graphical.target 都包含這段內(nèi)容。
臨時(shí)文件
/usr/lib/tmpfiles.d/ 和 /etc/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何創(chuàng)建、清理、刪除臨時(shí)文件和目錄,這些文件和目錄通常存放在 /run 和 /tmp 中。配置文件名稱為 /etc/tmpfiles.d/<program>.conf。此處的配置能覆蓋 /usr/lib/tmpfiles.d/ 目錄中的同名配置。
臨時(shí)文件通常和服務(wù)文件同時(shí)提供,以生成守護(hù)進(jìn)程需要的文件和目錄。例如 Samba 服務(wù)需要目錄 /run/samba 存在并設(shè)置正確的權(quán)限位,就象這樣:
/usr/lib/tmpfiles.d/samba.conf
D?/run/samba?0755?root?root
此外,臨時(shí)文件還可以用來在開機(jī)時(shí)向特定文件寫入某些內(nèi)容。比如,要禁止系統(tǒng)從USB設(shè)備喚醒,利用舊的 /etc/rc.local 可以用 echo USBE > /proc/acpi/wakeup,而現(xiàn)在可以這么做:
/etc/tmpfiles.d/disable-usb-wake.conf
w?/proc/acpi/wakeup?-?-?-?-?USBE
詳情參見 man 5 tmpfiles.d。
注意: 該方法不能向 /sys 中的配置文件添加參數(shù),因?yàn)?systemd-tmpfiles-setup 有可能在相關(guān)模塊加載前運(yùn)行。這種情況下,需要首先通過 modinfo <模塊名> 確認(rèn)需要的參數(shù),并在 /etc/modprobe.d 下的一個(gè)文件中設(shè)置改參數(shù)。另外,還可以使用 udev 規(guī)則,在設(shè)備就緒時(shí)設(shè)置相應(yīng)屬性。
定時(shí)器
定時(shí)器是以 .timer 為后綴的配置文件,記錄由system的里面由時(shí)間觸發(fā)的動(dòng)作, 定時(shí)器可以替代 cron 的大部分功能。
日志
systemd提供了自己日志系統(tǒng)(logging system),稱為 journal. 使用 systemd 日志,無需額外安裝日志服務(wù)(syslog)。讀取日志的命令:
#?journalctl
默認(rèn)情況下(當(dāng) Storage= 在文件 /etc/systemd/journald.conf 中被設(shè)置為 auto),日志記錄將被寫入 /var/log/journal/。該目錄是 systemd 軟件包的一部分。若被刪除,systemd 不會(huì)自動(dòng)創(chuàng)建它,直到下次升級(jí)軟件包時(shí)重建該目錄。如果該目錄缺失,systemd 會(huì)將日志記錄寫入 /run/systemd/journal。這意味著,系統(tǒng)重啟后日志將丟失。
Tip: 如果 /var/log/journal/ 位于btrfs 文件系統(tǒng),應(yīng)該考慮對(duì)這個(gè)目錄禁用寫入時(shí)復(fù)制
過濾輸出
journalctl可以根據(jù)特定字段過濾輸出,例如:
顯示本次啟動(dòng)后的所有日志:
#?journalctl?-b
不過,一般大家更關(guān)心的不是本次啟動(dòng)后的日志,而是上次啟動(dòng)時(shí)的(例如,剛剛系統(tǒng)崩潰了)??梢允褂?-b 參數(shù):
journalctl -b -0 顯示本次啟動(dòng)的信息
journalctl -b -1 顯示上次啟動(dòng)的信息
journalctl -b -2 顯示上上次啟動(dòng)的信息 journalctl -b -2
Show all messages from date (and optional time):
#?journalctl?--since="2012-10-3018:17:16"
Show all messages since 20 minutes ago:
#?journalctl?--since?"20?min?ago"
顯示最新信息
#?journalctl?-f
顯示特定程序的所有消息:
#?journalctl?/usr/lib/systemd/systemd
顯示特定進(jìn)程的所有消息:
#?journalctl?_PID=1
顯示指定單元的所有消息:
#?journalctl?-u?netcfg
Show kernel ring buffer:
#?journalctl?-k
Show auth.log equivalent by filtering on syslog facility:
#?journalctl?-f?-l?SYSLOG_FACILITY=10
詳情參閱man journalctl、man systemd.journal-fields,以及Lennert的這篇博文
日志大小限制
如果按上面的操作保留日志的話,默認(rèn)日志最大限制為所在文件系統(tǒng)容量的 10%,即:如果 /var/log/journal 儲(chǔ)存在 50GiB 的根分區(qū)中,那么日志最多存儲(chǔ) 5GiB 數(shù)據(jù)??梢孕薷?/etc/systemd/journald.conf 中的 SystemMaxUse 來指定該最大限制。如限制日志最大 50MiB:
SystemMaxUse=50M
詳情參見 man journald.conf.
配合syslog使用
systemd提供了 socket /run/systemd/journal/syslog,以兼容傳統(tǒng)日志服務(wù)。所有系統(tǒng)信息都會(huì)被傳入。要使傳統(tǒng)日志服務(wù)工作,需要讓服務(wù)鏈接該 socket,而非 /dev/log(官方說明)。Arch 軟件倉庫中的 syslog-ng 已經(jīng)包含了需要的配置。
設(shè)置開機(jī)啟動(dòng) syslog-ng:
#?systemctl?enable?syslog-ng
這里有一份很不錯(cuò)的journalctl指南。
Forward journald to /dev/tty12
In /etc/systemd/journald.conf enable the following:
1.????? ForwardToConsole=yes
2.????? TTYPath=/dev/tty12
3.????? MaxLevelConsole=info
重啟journald:
1.????? #?systemctl?restart?systemd-journald
特殊問題
關(guān)機(jī)/重啟十分緩慢
如果關(guān)機(jī)特別慢(甚至跟死機(jī)了一樣),很可能是某個(gè)拒不退出的服務(wù)在作怪。systemd 會(huì)等待一段時(shí)間,然后再嘗試殺死它。請(qǐng)閱讀這篇文章,確認(rèn)你是否是該問題受害者。
短時(shí)進(jìn)程無日志記錄
若 journalctl -u foounit.service 沒有顯示某個(gè)短時(shí)進(jìn)程的任何輸出,那么改用 PID 試試。例如,若 systemd-modules-load.service 執(zhí)行失敗,那么先用 systemctl status systemd-modules-load 查詢其PID(比如是123),然后檢索該 PID 相關(guān)的日志 journalctl -b _PID=123。運(yùn)行時(shí)進(jìn)程的日志元數(shù)據(jù)(諸如_SYSTEMD_UNIT 和 _COMM)被亂序收集在/proc 目錄。要修復(fù)該問題,必須修改內(nèi)核,使其通過套接字連接來提供上述數(shù)據(jù),該過程類似于SCM_CREDENTIALS。
診斷啟動(dòng)問題
使用如下內(nèi)核參數(shù)引導(dǎo): systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M
禁止在程序崩潰時(shí)轉(zhuǎn)儲(chǔ)內(nèi)存
要使用老的內(nèi)核轉(zhuǎn)儲(chǔ),創(chuàng)建下面文件:
1.????? /etc/sysctl.d/49-coredump.conf
2.????? ?
3.????? kernel.core_pattern?=?core
4.????? kernel.core_uses_pid?=?0
然后運(yùn)行:
1.????? #?/usr/lib/systemd/systemd-sysctl
同樣可能需要執(zhí)行"unlimit"設(shè)置文件大小:
1.????? $?ulimit?-c?unlimited
?
轉(zhuǎn)載于:https://blog.51cto.com/13155479/1968197
總結(jié)
以上是生活随笔為你收集整理的Centos7特性——systemd的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS 5.X 开机启动流程
- 下一篇: 2463: [中山市选2009]谁能赢呢