Skip to the content.

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:

  1. /etc/systemd/system
  2. /run/systemd/system
  3. /usr/lib/systemd/system
  4. /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 filetarget 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:

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:

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.)