CentOS 7 使用systemd替換了SysV。Systemd目的是要取代Unix時代以來一直在使用的init系統,兼容SysV和LSB的啟動腳本,而且夠在進程啟動過程中更有效地引導加載服務。
systemd的特性有:
systemd基本工具檢視和控制systemd的主要命令是systemctl。該命令可用于查看系統狀態和管理系統及服務。詳見man 1 systemctl。
小貼士: 在 systemctl 參數中添加 -H <用戶名>@<主機名> 可以實現對其他機器的遠程控制。該過程使用ssh鏈接。
注意: systemadm 是 systemd 的官方圖形前端。
分析系統狀態輸出激活的單元:
$ systemctl
以下命令等效:
$ systemctl list-units
輸出運行失敗的單元:
$ systemctl --failed
所有可用的單元文件存放在 /usr/lib/systemd/system/ 和 /etc/systemd/system/ 目錄(后者優先級更高)。查看所有已安裝服務:
$ systemctl list-unit-files
使用單元一個單元配置文件可以描述如下內容之一:系統服務(.service)、掛載點(.mount)、sockets(.sockets 、系統設備、交換分區/文件、啟動目標(target)、文件系統路徑、由 systemd 管理的計時器。詳情參閱 man 5 systemd.unit.
使用 systemctl 控制單元時,通常需要使用單元文件的全名,包括擴展名(例如 sshd.service)。但是有些單元可以在systemctl中使用簡寫方式。
立即激活單元:
# systemctl start <單元>
立即停止單元:
# systemctl stop <單元>
重啟單元:
# systemctl restart <單元>
命令單元重新讀取配置:
# systemctl reload <單元>
輸出單元運行狀態:
$ systemctl status <單元>
檢查單元是否配置為自動啟動:
$ systemctl is-enabled <單元>
開機自動激活單元:
# systemctl enable <單元>
注意: 如果服務沒有Install段落,一般意味著應該通過其它服務自動調用它們。如果真的需要手動安裝,可以直接連接服務,如下(將foo替換為真實的服務名):
# ln -s /usr/lib/systemd/system/foo.service /etc/systemd/system/graphical.target.wants/
取消開機自動激活單元:
# systemctl disable <單元>
顯示單元的手冊頁(必須由單元文件提供):
# systemctl help <單元>
重新載入 systemd,掃描新的或有變動的單元:
# systemctl daemon-reload
電源管理安裝 polkit 后才可使用電源管理。
如果你正登錄在一個本地的systemd-logind用戶會話,且當前沒有其它活動的會話,那么以下命令無需root權限即可執行。否則(例如,當前有另一個用戶登錄在某個tty),systemd 將會自動請求輸入root密碼。
重啟:
$ systemctl reboot
退出系統并停止電源:
$ systemctl poweroff
待機:
$ systemctl suspend
休眠:
$ systemctl hibernate
混合休眠模式(同時休眠到硬盤并待機):
$ systemctl hybrid-sleep
原生 systemd 配置文件
注意: 可能需要手動創建某些文件。所有文件的權限都是644,屬主 root,屬組 root。
虛擬控制臺可以用/etc/vconsole.conf 文件或者localectl 配置虛擬控制臺,包括鍵盤布局和控制臺字體。詳情請訪問 控制臺字體 和 鍵盤布局。
硬件時鐘systemd 默認硬件時鐘為協調世界時(UTC)。
小貼士: 推薦使用NTP服務來在線同步硬件時鐘。
硬件時鐘設定為地方時將硬件時鐘配置為地方時(不建議):
# timedatectl set-local-rtc true
重新調整為 UTC:
# timedatectl set-local-rtc false
如果設置成本地時間,處理夏令時有些麻煩。如果夏令時調整發生在關機時,下次啟動時時間會出現問題。最新的內核直接從實時時鐘芯片(RTC)讀取時間,不 使用 hwclock,內核把從 RTC 讀取的時間當作 UTC 處理。所以如果硬件時間是地方時,系統啟動一開始識別的時間是錯誤的,之后很快會進行矯正。這可能導致一些問題(尤其是時間倒退時)。
如果同時安裝了 Windows 操作系統(默認使用地方時),那么一般 RTC 會被設置為地方時。Windows 其實也能處理 UTC,需要修改注冊表。建議讓 Windows 使用 UTC,而非讓 Linux 使用地方時。Windows 使用 UTC 后,請記得禁用 Windows 的時間同步功能,以防 Windows 錯誤設置硬件時間。如上文所說,Linux 可以使用NTP服務來在線同步硬件時鐘。
內核模塊請訪問Kernel modules
文件系統掛載默認行為是:在啟動一個需要掛載特定分區的服務之前,系統自動檢查并掛載分區。/etc/fstab 中設定的網絡文件系統(如 NFS、Samba)無需配置即可正常工作,systemd 將確保網絡文件系統在網絡鏈接就緒后掛載。
詳情參閱:man 5 systemd.mount。
LVM如果裝有不通過 initramfs 激活的LVM卷,則需啟動 lvm-monitoring 服務(由 lvm2 軟件包提供):
# systemctl enable lvm-monitoring
ACPI 電源管理參閱 Power Management
臨時文件/usr/lib/tmpfiles.d/ 和 /etc/tmpfiles.d/ 中的文件描述了 systemd-tmpfiles 如何創建、清理、刪除臨時文件和目錄,這些文件和目錄通常存放在 /run 和 /tmp 中。配置文件名稱為 /etc/tmpfiles.d/<PRogram>.conf。此處的配置能覆蓋 /usr/lib/tmpfiles.d/ 目錄中的同名配置。
臨時文件通常和服務文件同時提供,以生成守護進程需要的文件和目錄。例如 Samba 服務需要目錄 /run/samba 存在并設置正確的權限位,就象這樣:
/usr/lib/tmpfiles.d/samba.confD /run/samba 0755 root root
此外,臨時文件還可以用來在開機時向特定文件寫入某些內容。比如,要禁止系統從USB設備喚醒,利用舊的 /etc/rc.local 可以用 echo USBE > /proc/acpi/wakeup,而現在可以這么做:
/etc/tmpfiles.d/disable-usb-wake.confw /proc/acpi/wakeup - - - - USBE
詳情參見 man 5 tmpfiles.d。
注意: 該方法不能向 /sys 中的配置文件添加參數,因為 systemd-tmpfiles-setup 有可能在相關模塊加載前運行。這種情況下,需要首先通過 modinfo <模塊名> 確認需要的參數,并在 /etc/modprobe.d 下的一個文件中設置改參數。另外,還可以使用 udev 規則,在設備就緒時設置相應屬性。
自己編寫 .service 文件systemd 的單元文件是受 XDG Desktop Entry .desktop 文件啟發而產生,而最初起源是 Windows 下的 .ini 文件。
處理依賴關系使用systemd時,可通過正確編寫單元配置文件來解決其依賴關系。典型的情況是,單元A要求單元B在A啟動之前運行。在此情況下,向單元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依賴關系是可選的,可添加 Wants=B 和 After=B。請注意 Wants= 和 Requires= 并不意味著 After=,即如果 After= 選項沒有制定,這兩個單元將被并行啟動。
依賴關系通常被用在服務(service)而不是目標(target)上。例如, network.target 一般會被某個配置網絡接口的服務引入,所以,將自定義的單元排在該服務之后即可,因為 network.target 已經啟動。
啟動方式編寫自定義的service文件時,可以選擇幾種不同的服務啟動方式。啟動方式可通過配置文件 [Service] 段中的 Type= 參數進行設置。具體的參數說明請參閱 man systemd.service 。
修改現存單元文件要更改由軟件包提供的單元文件,先創建名為 /etc/systemd/system/<單元名>.d/ 的目錄(如 /etc/systemd/system/httpd.service.d/),然后放入 *.conf 文件,其中可以添加或重置參數。這里設置的參數優先級高于原來的單元文件。例如,如果想添加一個額外的依賴,創建這么一個文件即可:
/etc/systemd/system/<unit>.d/customdependency.conf[Unit]Requires=<新依賴>After=<新依賴>
然后運行以下命令使更改生效:
# systemctl daemon-reload# systemctl restart <單元>
此外,把舊的單元文件從 /usr/lib/systemd/system/ 復制到 /etc/systemd/system/,然后進行修改,也可以達到同樣效果。在 /etc/systemd/system/ 目錄中的單元文件的優先級總是高于 /usr/lib/systemd/system/ 目錄中的同名單元文件。注意,當 /usr/lib/ 中的單元文件因軟件包升級變更時,/etc/ 中自定義的單元文件不會同步更新。此外,你還得執行 systemctl reenable <unit>,手動重新啟用該單元。因此,建議使用前面一種利用 *.conf 的方法。
小貼士: 可以用 systemd-delta 命令來查看哪些單元文件被覆蓋、哪些被修改。
單元配置文件的 vim 語法高亮支持可從官方倉庫安裝 vim-systemd 軟件包,使 unit 配置文件在 Vim 下支持語法高亮。
目標(target)啟動級別(runlevel)是一個舊的概念?,F在,systemd 引入了一個和啟動級別功能相似又不同的概念——目標(target)。不像數字表示的啟動級別,每個目標都有名字和獨特的功能,并且能同時啟用多個。一些目標繼承其他目標的服務,并啟動新服務。systemd 提供了一些模仿 sysvinit 啟動級別的目標,仍可以使用舊的 telinit 啟動級別 命令切換。獲取當前目標
不要使用 runlevel 命令了:
$ systemctl list-units --type=target
創建新目標在 Fedora 中,啟動級別 0、1、3、5、6 都被賦予特定用途,并且都對應一個 systemd 的目標。然而,沒有什么很好的移植用戶定義的啟動級別(2、4)的方法。要實現類似功能,可以以原有的啟動級別為基礎,創建一個新的目標 /etc/systemd/system/<新目標>(可以參考 /usr/lib/systemd/system/graphical.target),創建 /etc/systemd/system/<新目標>.wants 目錄,向其中加入額外服務的鏈接(指向 /usr/lib/systemd/system/ 中的單元文件)。
目標表
SysV 啟動級別 | Systemd 目標 | 注釋 |
---|---|---|
0 | runlevel0.target, poweroff.target | 中斷系統(halt) |
1, s, single | runlevel1.target, rescue.target | 單用戶模式 |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用戶自定義啟動級別,通常識別為級別3。 |
3 | runlevel3.target, multi-user.target | 多用戶,無圖形界面。用戶可以通過終端或網絡登錄。 |
5 | runlevel5.target, graphical.target | 多用戶,圖形界面。繼承級別3的服務,并啟動圖形界面服務。 |
6 | runlevel6.target, reboot.target | 重啟 |
emergency | emergency.target | 急救模式(Emergency shell) |
切換啟動級別/目標systemd 中,啟動級別通過“目標單元”訪問。通過如下命令切換:
# systemctl isolate graphical.target
該命令對下次啟動無影響。等價于telinit 3 或 telinit 5。
修改默認啟動級別/目標開機啟動進的目標是 default.target,默認鏈接到 graphical.target (大致相當于原來的啟動級別5)。可以通過內核參數更改默認啟動級別:
小貼士: 可以省略擴展名 .target。
另一個方法是修改 default.target。可以通過 systemctl 修改它:
# systemctl enable multi-user.target
命令執行情況由 systemctl 顯示:鏈接 /etc/systemd/system/default.target 被創建,指向新的默認啟動級別。該方法當且僅當目標配置文件中有以下內容時有效:
[Install]Alias=default.target
目前,multi-user.target、graphical.target 都包含這段內容。
日志systemd提供了自己日志系統(logging system),稱為 journal. 使用 systemd 日志,無需額外安裝日志服務(syslog)。讀取日志的命令:
# journalctl
默認情況下(當 Storage= 在文件 /etc/systemd/journald.conf 中被設置為 auto),日志記錄將被寫入 /var/log/journal/。該目錄是 systemd 軟件包的一部分。若被刪除,systemd 不會自動創建它,直到下次升級軟件包時重建該目錄。如果該目錄缺失,systemd 會將日志記錄寫入 /run/systemd/journal。這意味著,系統重啟后日志將丟失。
過濾輸出journalctl可以根據特定字段過濾輸出,例如:
顯示本次啟動后的所有日志:
# journalctl -b
不過,一般大家更關心的不是本次啟動后的日志,而是上次啟動時的(例如,剛剛系統崩潰了)。目前還沒有這項功能,正在 systemd-devel@lists.freedesktop.org 討論中。
目前的折中方案是:
# journalctl --since=today | tac | sed -n '/-- Reboot --/{n;:r;/-- Reboot --/q;p;n;b r}' | tac
以上命令輸出本日內的所有啟動信息。但要注意,如果日志很多,該命令執行時間會比較漫長。
動態跟蹤最新信息:
# journalctl -f
顯示特定程序的所有消息:
# journalctl /usr/lib/systemd/systemd
顯示特定進程的所有消息:
# journalctl _PID=1
顯示指定單元的所有消息:
# journalctl -u netcfg
詳情參閱man journalctl、man systemd.journal-fields
日志大小限制如果按上面的操作保留日志的話,默認日志最大限制為所在文件系統容量的 10%,即:如果 /var/log/journal 儲存在 50GiB 的根分區中,那么日志最多存儲 5GiB 數據??梢孕薷?/etc/systemd/journald.conf 中的 SystemMaxUse 來指定該最大限制。如限制日志最大 50MiB:
SystemMaxUse=50M
詳情參見 man journald.conf.
配合syslog使用systemd提供了 socket /run/systemd/journal/syslog,以兼容傳統日志服務。所有系統信息都會被傳入。要使傳統日志服務工作,需要讓服務鏈接該 socket,而非 /dev/log(官方說明)。Arch 軟件倉庫中的 syslog-ng 已經包含了需要的配置。
設置開機啟動 syslog-ng:
# systemctl enable syslog-ng
疑難解答 關機/重啟十分緩慢如果關機特別慢(甚至跟死機了一樣),很可能是某個拒不退出的服務在作怪。systemd 會等待一段時間,然后再嘗試殺死它。請閱讀這篇文章,確認你是否是該問題受害者。
短時進程無日志記錄若 journalctl -u foounit.service 沒有顯示某個短時進程的任何輸出,那么改用 PID 試試。例如,若 systemd-modules-load.service 執行失敗,那么先用 systemctl status systemd-modules-load 查詢其 PID(比如是123),然后檢索該 PID 相關的日志 journalctl -b _PID=123。運行時進程的日志元數據(諸如 _SYSTEMD_UNIT 和 _COMM)被亂序收集在 /proc 目錄。要修復該問題,必須修改內核,使其通過套接字連接來提供上述數據,該過程類似于 SCM_CREDENTIALS。
診斷啟動問題使用如下內核參數引導: systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M
禁止在程序崩潰時轉儲內存要使用老的內核轉儲,創建下面文件:
/etc/sysctl.d/49-coredump.confkernel.core_pattern = corekernel.core_uses_pid = 0
然后運行:
# /usr/lib/systemd/systemd-sysctl
同樣可能需要執行“unlimit”設置文件大小:
$ ulimit -c unlimited
原文:https://blog.linuxeye.com/400.html
新聞熱點
疑難解答