一、systemd
Systemd從字面意思上看,應該是系統守護進程的意思,所有的系統服務都是有Systemd來啟動的,它的PID是1,取代原來CentOS6的init.d。
Systemd 並不是一個命令,而是一組命令,涉及到系統管理的方方面面,它包括了:systemctl、systemd-analyze、hostnamectl、localectl、 timedatectl、loginctl等多個管理工具。
CentOS7的systemd服務管理方式和centOS6的init的管理方式已經有了很大區別。最大的區別就是systemd是常駐內存的,因此執行速度比較快,並且實現了並發式的服務啟動,解決了服務的依賴性問題。
systemctl命令
systemctl是 Systemd 的主命令,用於管理系統和服務狀態。
systemctl poweroff #系統關機
systemctl reboot #重新開機
systemctl suspend #進入暫停模式
systemctl hibernate #進入休眠模式
systemctl rescue #強制進入救援模式
systemctl emergency #強制進入緊急救援模式
二、Unit
Systemd 可以管理所有系統資源。不同的資源統稱為 Unit(單位)。
2.1 unit類型
Unit 一共分成12種類型:
類型 | 含義 |
---|---|
Service unit | 系統服務 |
Target unit | 多個 Unit 構成的一個組 |
Device Unit | 硬件設備 |
Mount Unit | 文件系統的掛載點 |
Automount Unit | 自動掛載點 |
Path Unit | 文件或路徑 |
Scope Unit | 不是由 Systemd 啟動的外部進程 |
Slice Unit | 進程組 |
Snapshot Unit | Systemd 快照,可以切回某個快照 |
Socket Unit | 進程間通信的 socket |
Swap Unit | swap 文件 |
Timer Unit | 定時器 |
unit管理
#命令:systemctl [command] [unit]
#command主要包含:
start:啟動unit
stop:關閉unit
restart:重啟unit
reload:重載unit的配置
enable:設置下次開機時,unit會被啟動
disable:設置下次開機時,unit不會被啟動
is-active :目前有沒有正在運行中
is-enable :開機時有沒有默認要啟用這個unit
show:顯示某個 Unit 的所有底層參數
2.3 單個unit狀態查看
#命令:systemctl [command] [unit]
#command主要包含:
status:目前后面接的這個 unit 的狀態,會列出有沒有正在執行、開機默認執行否、登錄等信息等。
is-active :目前有沒有正在運行中
is-enable :開機時有沒有默認要啟用這個unit
is-failed:啟動失敗的unit
show:顯示某個 Unit 的所有底層參數
#status顯示的unit狀態類型
#Loaded是下次開機啟動的狀態,有以下幾種基本狀態:
enabled:這個daemon將在開機時被執行
disabled:這個daemon在開機時不會被執行
static:這個daemon不可以自己啟動(enable不可),不過可能會被其他的enabled的服務來喚醒(依賴的服務)
mask:這個daemon無論如何都無法被啟動,因為已經被強制注銷(非刪除)。可通過 systemctl unmask 方式改回原本狀態。
#Active是當前的狀態,有以下幾種基本狀態:
active (running):正有一只或多只程序正在系統中執行的意思,舉例來說,正在執行中的vsftpd就是這種模式。 active (exited):僅執行一次就正常結束的服務,目前並沒有任何程序在系統中執行。
active (waiting):正在執行當中,不過還再等待其他的事件才能繼續處理。
inactive:這個服務目前沒有運行的意思。
范例
范例一:看看目前 atd 這個服務的狀態為何?
[root@study ~]# systemctl status atd.service
atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)
Active: active (running) since Mon 2015-08-10 19:17:09 CST; 5h 42min ago
Main PID: 1350 (atd)
CGroup: /system.slice/atd.service
└─1350 /usr/sbin/atd -f
Aug 10 19:17:09 study.centos.vbird systemd[1]: Started Job spooling tools.
# Loaded:這行在說明,開機的時候這個 unit 會不會啟動,enabled 為開機啟動,disabled 開機不會啟動
# Active:現在這個 unit 的狀態是正在執行(running)或沒有執行 (dead)
2.4 當前系統的所有unit狀態
systemctl list-units # 列出正在運行的 Unit
systemctl list-units --all # 列出所有Unit,包括沒有找到配置文件的或者啟動失敗的
systemctl list-units --all --state=inactive # 列出所有沒有運行的 Unit
systemctl list-units --failed # 列出所有加載失敗的 Unit
systemctl list-units --type=service # 列出所有正在運行的、類型為 service 的 Unit
2.5 依賴關系
systemctl list-dependencies [unit] #列出unit依賴
systemctl list-dependencies --all [unit] #展開顯示依賴關系
systemctl list-dependencies [unit] [--reverse] #反向查詢依賴,unit被誰依賴
三、Target
啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。
簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動里面所有的 Unit。從這個意義上說,Target 這個概念類似於"狀態點",啟動某個 Target 就好比啟動到某種狀態。
傳統的init啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。例如
默認啟動圖形tatget,這個target又依賴了multi-user.target等其他target。
3.1 target管理
$ systemctl list-unit-files --type=target # 查看當前系統的所有 Target
$ systemctl list-dependencies multi-user.target # 查看一個 Target 包含的所有 Unit
$ systemctl get-default # 查看啟動時的默認 Target
$ sudo systemctl set-default multi-user.target # 設置啟動時的默認 Target
$ sudo systemctl isolate multi-user.target #切換 Target
graphical.target:就是文字加上圖形界面,這個項目已經包含了下面的 multi-user.target. multi-user.target:純文本模式.
rescue.target:在無法使用root登陸的情況下,systemd在開機時會多加一個額外的暫時系統,與你原本的系統無關。
emergency.target:緊急處理系統的錯誤,還是需要使用root登陸的情況,在無法使用rescue.target 時,可以嘗試使用這種模式.
shutdown.target:就是關機的流程。
getty.target:可以設置你需要幾個tty之類的,如果想要降低tty的項目,可以修改這個配置文件.
3.2 Target 與 傳統 RunLevel 的聯系和區別
傳統Runlevel | target name ->軟鏈接 |
---|---|
Runlevel 0 | runlevel0.target -> poweroff.target |
Runlevel 1 | runlevel1.target -> rescue.target |
Runlevel 2 | runlevel2.target -> multi-user.target |
Runlevel 3 | runlevel3.target -> multi-user.target |
Runlevel 4 | runlevel4.target -> multi-user.target |
Runlevel 5 | runlevel5.target -> graphical.target |
Runlevel 6 | runlevel6.target -> reboot.target |
systemd與init進程的主要差別如下
1.默認的 RunLevel(在/etc/inittab文件設置)現在被默認的 Target 取代,位置是/etc/systemd/system/default.target,通常符號鏈接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。
2.啟動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。
3.配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄。現在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄里面的修改可以覆蓋原始設置。