systemd cơ bản : Làm việc với Service, Unit, và Journal

Giới thiệu

Trong những năm gần đây, cộng đồng các nhà phát triển Linux đã chuyển dần từ các hệ thống init cũ như upstart, sysV sang systemd. Bộ công cụ của systemd cung cấp một giải pháp khởi động các daemon một cách nhanh chóng và mềm dẻo hơn. Hiểu một cách đơn giản, systemd là chương trình sẽ quản lý tất cả các chương trình còn lại từ lúc boot trở đi. systemd thường là process đầu tiên được chạy sau khi boot máy (có PID = 1).

Thay đổi sang systemd được khởi xướng từ đội ngũ phát triển của Debian – một distro vô cùng nổi tiếng về độ ổn định và trưởng thành (mature), do đó, bạn có thể yên tâm rằng systemd cũng sẽ hoạt động vô cùng ổn định như chính Debian vậy. Hiện nay systemd đã được sử dụng trong rất nhiều distro, có thể kể tên như Ubuntu (version > 15.04), Debian (v8 trở đi), CentOS 7 trở đi, Fedora (version > 15).Và một điều chắc chắn là systemd sẽ còn được hỗ trợ trong tương lai rất xa. Chính vì những lý do đó, việc bổ sung một chút kiến thức về init system này là điều nên làm.

Bài viết này sẽ đi nhanh vào một số lệnh cơ bản để thao tác với systemd.

Quản lý unit cơ bản

Đối tượng cơ bản mà một hệ thống systemd quản lý và “thao túng” là một “unit”. Unit bào gồm rất nhiều loại, nhưng loại phổ biến nhất là một “service” (nhận ra bằng đuôi file .service). Để quản lý service trên một hệ thống systemd, công cụ chủ yếu (và cũng là command chủ yếu) là systemctl(viết tắt của system control).

Tất cả các câu lệnh trong các init system hiện có đều có “bản sao” trong systemctl. Lấy ví dụ là unit nginx.service, ta sẽ có một số lệnh cơ bản như sau :
* Khởi động service :

sudo systemctl start nginx.service
  • Dừng service:
sudo systemctl stop nginx.service
  • Khởi động lại service:
sudo systemctl restart nginx.service
  • Reload service (mà không làm ảnh hưởng đến hoạt động bình thường của nó):
sudo systemctl reload nginx.service

Bật hoặc tắt các unit

Ở chế độ mặc định, hầu hết các systemd unit đều không được khởi động cùng với hệ thống. Để thay đổi chức năng này, bạn cần bật (enable) chúng lên. Những unit này sau khi được bật sẽ được gắn vào một “boot target” và sẽ được khởi động kèm khi target đó khởi động.
Để bật một service khởi động cùng với hệ thống :

sudo systemctl enable nginx.service

Và ngược lại

sudo systemctl disable nginx.service

Xem khái quát tình hình hệ thống

systemd có thể cung cấp cho chúng ta rất nhiều thông tin hữu ích về tình trạng hoạt động của hệ thống. Ví dụ, để xem tất cả các unit đang ở trạng thái “active” (hoạt động), bạn gõ :

systemctl list-units

Thực ra, trong trường hợp này, bạn có thể bỏ phần list-units đi vì nó là câu lệnh con mặc định của systemctl. Chú ý rằng lệnh này bạn không cần thực hiện với quyền sudo.
Để xem danh sách các unitsystemd đã load vào bộ nhớ, kể cả những unit hiện đang không active, bạn gõ:

systemctl list-units --all

Để xem danh sách tất cả các unit đã cài vào hệ thống, bao gồm cả những unitsystemd không load vào bộ nhớ:

systemctl list-unit-files

Xem log cơ bản

Một thành phần mang tên journald của systemd chịu trách nhiệm thu thập và quản lý nhật ký về tất cả các bộ phận của hệ thống. Đây thực chất là log của toàn bộ các ứng dụng và kernel.
Để xem tất cả log, theo thứ tự thời gian từ xa nhất về gần nhất:

journalctl

Mặc định, câu lệnh này cho phép bạn xem log của lần boot hiện tại và những lần boot trước nếu như nó được thiết lập để ghi lại tất cả các lần boot. Một số distro mặc định bật tính năng này, trong khi đó một số khác thì tắt để tiết kiệm bộ nhớ. Để bật tính năng này, bạn có thể sửa thông số Storage=persistent trong /etc/systemd/journald.conf hoặc tạo thư mục ghi journal bằng lệnh sudo mkdir -p /var/log/journal.
Nếu bạn chỉ cần xem log của lần boot hiện tại, thêm option -b:

journalctl -b

Để lọc ra log của kernel, dùng option -k

journalctl -k

Xem trạng thái của các unit

Trong khi những câu lệnh trên cho bạn biết về tình trạng của toàn bộ hệ thống, bạn cũng có thể xem thông tin về trạng thái của một unit nhất định bằng câu lệnh con status:

systemctl status nginx.service

Để xem log về một unit nào đó, sử dụng option -u cùng với tên của unit kèm lệnh journalctl :

journalctl -u nginx.service

Như mọi khi, bạn vẫn có thể lọc ra những thông tin trong lần boot hiện tại bằng cách sử dụng option -b :

journalctl -b -u nginx.service

Kiểm tra unit và các file của unit

Một unit file chứa các thông số để systemd có thể dùng để quản lý và chạy unit đó. Để xem toàn bộ nội dung của một unit file, gõ :

systemctl cat nginx.service

Để xem dependency tree của một unit (những thứ mà unit cần để có thể khởi động) :

systemctl list-dependencies nginx.service

Mặc định, câu lệnh này không mở rộng các nhánh con của dependency tree, bạn cần thêm flag --all để làm điều này:

systemctl list-dependencies --all nginx.service

Cuối cùng, để xem những thông số hệ thống và các thiết lập của unit:

systemctl show nginx.service

Chỉnh sửa unit

Nếu ban cần chỉnh sửa một unit, systemd cho phép bạn làm điều này bằng chính systemctl thay vì phải chỉnh sửa file gốc.
Để thêm một đoạn mã vào một unit file, gọi câu lệnh con edit từ systemctl :

sudo systemctl edit nginx.service

Nếu bạn muốn chỉnh sửa toàn bộ file, sử dụng flag --full:

sudo systemctl edit --full nginx.service

Chỉnh sửa xong, bạn hãy chạy sudo systemctl daemon-reload để nạp lại systemd và các thay đổi sẽ có hiệu lực.

Thao tác với Target (Runlevel)

Một chức năng khác của các init system là chuyển đổi server giữa các trạng thái hoạt động khác nhau. Những init system khác thường gọi đây là các “runlevel”, cho phép hệ thống hoạt động trên một runlevel suy nhất tại một thời điểm xác định.
Trong systemd, thay cho runleveltarget. Target bản chất là một synchronization point (điểm đồng bộ) mà server có thể dùng để đưa chính nó về một trạng thái nào đó. FAMILUG đã có một bài viết khá ngắn gọn và dễ hiểu giải thích về runlevels tại đây. Service và các unit files có thể được gắn với một targetnhiều target có thể cùng hoạt động một lúc.
Để xem tất cả các target đang tồn tại trên hệ thống, gõ:

systemctl list-unit-files --type=target

Để xem các targetsystemd sẽ khởi động khi boot (theo đó là các unit files gắn kèm với target đó):

systemctl get-default

Bạn có thể thay đổi target mặc định sẽ được khởi động khi boot bằng cách dùng option set-default:

sudo systemctl set-default multi-user.target

Để xem unit nào gắn với target nào, bạn gõ:

systemctl list-dependencies multi-user.target

Bạn có thể chỉnh sửa trạng thái hệ thống để chuyển đổi giữa các target bằng câu lệnh con isolate. Câu lệnh này sẽ dừng tất cả các unit không gắn với target được chỉ định lại (nhớ là trước khi chạy hãy kiểm tra xem có service quan trọng nào gắn với target khác hay không nhé)

sudo systemctl isolate multi-user.target

Tắt, khởi động lại server/VPS

Có một số target thông dụng mà bạn có thể sử dụng để làm các tác vụ cơ bản, như tắt – khởi động lại – boot vào chế độ rescue, lần lượt như sau :

sudo systemctl poweroff
sudo systemctl reboot
sudo systemctl rescue

Tips: Câu lệnh sudo poweroff hay sudo reboot thường là lệnh tắt cho những câu lệnh trên.

Để lại comment