Tìm hiểu bổ xung về systemd.
I. Unit file.
1. Unit file là gì?
Unit file trên hệ thống là các file xác định cách mà systemd sẽ khởi động và chạy. Mỗi file tương úng với mỗi hoạt động hay thành phần hay một đơn vị riêng lẻ nào trong systemd. Mỗi unit file là một file văn bản đơn giản dùng để miêu tả một đơn vị, nó làm gì, nó cần gì để chạy trước hay sau nó, và như thông tin khác. Unit file được lưu trữ ở một số thư mục khác nhau trong hệ thống:
- /etc/systemd/system
- /run/systemd/system
- /usr/lib/systemd/system
- /lib/systemd/system
Ngoài các unit file của hệ thống, Systemd còn quản lý tài nguyên theo người dùng. Unit file của mỗi người dùng được lưu ở /etc/systemd/user, /run/systemd/user, và /lib/systemd/user,..
Có thể sử dụng lệnh systemctl để xem chi tiết về các unit file. Lệnh sau đây liệt kê tất cả các unit file trong hệ thống:
systemctl list-unit-files
Có nhiều unit file trong hệ thống nhưng system unit file và target unit file là 2 file phổ biến nhất cho người sở hữu hệ thống tương tác. Để liệt kê các unit file của mỗi loại, dùng lệnh systemctl
:
systemctl list-unit-files --type service
systemctl list-unit-files --type target
2. Service units
Service unit là đơn vị mà mô tả một tiến trình mà systemd có thể khởi động, giám sát và quản lý. System unit là unit phổ biến nhất được sử dụng hàng ngày. Nó được quản lý bởi root sử dụng systemctl
:
sudo systemctl [command] NAME.service
Một số lệnh phôt biến:
- start: dùng để khởi động một service.
- stop: dùng để dừng một service.
- status: được dùng để xem trạng thái của một service
- restart: khởi động lại(dừng và khởi động) một service
- enable: tạo symlink cho service unit đến một số folder xác định để có thể khởi động service khi boot.
- disable: unlink unit để nó không khởi dộng cùng hệ thống.
Ví dụ về unit file sshd.service. Nó cho phép systemd quản lý tiến trình daemon sshd.
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service
Wants=sshd-keygen.service
[Service]
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
2. Target units.
Target unit được sử dụng để kết nối và nhóm các unit khác lại để mô tả một trạng thái mà hệ thống mong muốn. Các unit đó thường là các services unit, các targer unit cũng sẽ được thêm vào nhóm. Ví dụ, multi-user.target unit file:
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
Target unit không chứa lệnh để chạy, nó hoạt động để kết nối các unit khác. Trong ví dụ trên:
- multi-user.target yêu cầu *basic.target chạy thành công khi mà multi-user.target chạy
- Nếu rescue.service hay rescue.target chạy thì sẽ kiến unit này dừng lại.
- multi-user.target khởi động sau khi basic.target hoạt động và sau đó rescue.service và rescue.target sẽ chạy.
Target unit nhóm các unit lại với nhau không chỉ với nội dung trong unit file, target cũng có thể có thư mục .want. để chứa liên kết đến các unit mà được chạy cùng với target. Ví dụ multi-user.target có thư mục multi-user.target.wants. để chứa các unit chạy khi multi-user.target chạy.
Một số tài liệu về unit
# man systemd.unit
# man systemd.service
# man systemd.target
...
3.Tạo service với Systemd
Phần trên mình đã nói về việc các service của systemd được quản lý trong các file cấu hình riêng biệt. Vì vậy, chúng ta hoàn toàn có thể tạo ra một file service của chúng ta để phục vụ một công việc nào đó. Mình sẽ ví dụ với một file cấu hình đơn giản như sau
# Location: /etc/systemd/system/simple-echo.service
[Unit]
Description=Simple Echo
[Service]
Type = forking
ExecStart = /usr/local/bin/simple-echo start
ExecStop = /usr/local/bin/simple-echo stop
ExecReload = /usr/local/bin/simple-echo restart
[Install]
WantedBy = multi-user.target
Và đây là file thực thi của dịch vụ
#!/bin/bash
# Location: /usr/local/bin/simple-echo
function echo_start () {
echo "Echo: starting service ..."
sleep 1
echo "Echo: starting done"
}
function echo_stop () {
echo "Echo: stopping service ..."
sleep 1
echo "Echo: stopping done"
}
function echo_status () {
echo "Echo service"
}
case "$1" in
'start')
echo_start
;;
'stop')
echo_stop
;;
'restart')
echo_start
sleep 1
echo_stop
;;
'status')
echo_status
;;
*)
echo "Usage: $0 {start|stop|status|restart}" >&2
;;
esac
Và giờ ta có thể thử với các câu lệnh systemctl status simple-echo hoặc systemctl start simple-echo, nếu các câu lệnh này không báo lỗi thì quá trình tạo một service đơn giản đã thành công. (Đây chỉ một file cấu hình đơn giản của service, thực chất không có chương trình nào khác được thực thi.)