1.1 Controlling Services with systemctl 1.1.1 Introduction to systemd RHEL7 已經使用 systemd
取代原有的 init
& xinetd
,因此目前 ID=1 的 process 為 systemd,主要加入了下列新的特性:
平行處理,可加速系統開機
on-demand 啟動服務的能力
service 相依性的自動處理,避免造成系統長時間等待特定服務(例如:網路不通時不會把 network service 啟動)
可透過 Linux control group 追蹤相關的 process 的狀態
現在大多 service 的相關設定都被移到 /etc/sysconfig
目錄中了,只有某些 legacy services 才依然是以 shell-based 的形式存在
現在 RHEL7 中使用 systemctl
管理各式各樣的 systemd 物件,這些物件統稱為 units
,常看到的 units 會有:
Service units
(.service ):這就是系統服務了,通常會以 daemon 的形式存在
Socket Units
(.socket ):指的是 IPC socket,通常在有新的連線與 service 產生時,socket unit 會被傳給 daemon 處理
Path units
(.path ):用來 delay 特定 service,直到特定的檔案有所變化,例如:列印服務
若 system unit 狀態為 static
,表示無法被 enable,但可以被 enabled unit
自動啟用
1.1.2 Starting and stopping daemons on a running system restart
會改變 service 的 process ID;但 reload
則會維持 service 原有的 process ID
其他:systemctl 特別的指令
sudo systemctl --failed --type=service
:列出狀態為 failed 的 service
sudo systemctl list-dependencies [UNIT]
:列出指定 system unit 的相依關係
sudo systemctl list-dependencies --reverse [UNIT]
:列出指定 system unit 啟動所需要預先啟動的其他 system unit
1.2 Controlling the Boot Process 1.2.1 Selecting a systemd target 以下列出幾個重要的 systemd target:
graphical.target
:就是一般的圖形模式,也包含了文字介面
multi-user.target
:純文字模式
rescue.target
:要求用 root 身分登入,基本系統服務已經初始化完成
emergency.target
:要求用 root 身分登入,initramfs 已經執行完畢,並把 system root 以 read-only 的方式掛載
每個 target 之間會有某種程度的相依關係,例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ systemctl list-dependencies graphical.target | grep target graphical.target └─multi-user.target ├─basic.target │ ├─paths.target │ ├─slices.target │ ├─sockets.target │ ├─sysinit.target │ │ ├─cryptsetup.target │ │ ├─local-fs.target │ │ └─swap.target │ └─timers.target ├─getty.target ├─nfs.target └─remote-fs.target $ systemctl list-units --type =target --all UNIT LOAD ACTIVE SUB DESCRIPTION basic.target loaded active active Basic System cryptsetup.target loaded active active Encrypted Volumes emergency.target loaded inactive dead Emergency Mode final.target loaded inactive dead Final Step getty.target loaded active active Login Prompts graphical.target loaded active active Graphical Interface local-fs-pre.target loaded active active Local File Systems (Pre) local-fs.target loaded active active Local File Systems multi-user.target loaded active active Multi-User System network-online.target loaded inactive dead Network is Online ......
透過 systemctl isolate [TARGET_UNIT]
可以馬上變換不同的 target unit,假設目前在圖形模式下,執行指令 sudo systemctl isolate multi-user.target
可以切換到文字模式
Setting a default target default.target
為開機時所啟動的 target unit,這是個 symbolic link,指向真正的 target unit
1 2 3 4 5 6 7 $ ls -al /etc/systemd/system/default.target lrwxrwxrwx. 1 root root 40 Jul 11 2014 /etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target $ systemctl get-default graphical.target
當然也有指令可以設定 default target unit:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 $ sudo systemctl set-default multi-user.target rm '/etc/systemd/system/default.target' ln -s '/usr/lib/systemd/system/multi-user.target' '/etc/systemd/system/default.target' $ systemctl get-default multi-user.target `` > 開機時編輯開機設定,在 `linux16` 那一行的最後面加上 `systemd.unit=[TARGET_UNIT]` 也可以直接進入所指定的 target unit ---------------------------------------------------- Lab: Controlling Services and Daemons ===================================== - 設定開機時同時支援文字介面登入 & 圖形介面登入 - 設定 `rsyslog` service 開機時啟動 ```bash $ systemctl get-default multi-user.target [student@server0 ~]$ sudo systemctl set-default graphical.target rm '/etc/systemd/system/default.target' ln -s '/usr/lib/systemd/system/graphical.target' '/etc/systemd/system/default.target' [student@server0 ~]$ systemctl get-default graphical.target [student@server0 ~]$ systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; disabled) Active: inactive (dead) [student@server0 ~]$ sudo systemctl enable rsyslog.service ln -s '/usr/lib/systemd/system/rsyslog.service' '/etc/systemd/system/multi-user.target.wants/rsyslog.service' [student@server0 ~]$ sudo systemctl restart rsyslog.service [student@server0 ~]$ systemctl status rsyslog rsyslog.service - System Logging Service Loaded: loaded (/usr/lib/systemd/system/rsyslog.service; enabled) Active: active (running) since Sat 2016-05-21 17:21:24 JST; 2s ago Main PID: 31841 (rsyslogd) CGroup: /system.slice/rsyslog.service └─31841 /usr/sbin/rsyslogd -n