
systemd là gì? Trình quản lý dịch vụ và tiến trình khởi động trên Linux
systemd là gì? systemd là trình quản lý tiến trình và dịch vụ tiêu chuẩn trên các bản phân phối Linux hiện đại, thay thế cho SysVinit và các script khởi động cũ. Nó khởi động đầu tiên với vai trò tiến trình số 1, đồng thời cung cấp một cơ chế giám sát, ghi log tập trung và quản lý tài nguyên tập trung cho toàn bộ dịch vụ trên máy. Bài viết này đi từ cấu trúc thành phần, giải thích các loại unit, và chỉ ra những lệnh thực tế bạn dùng hằng ngày để chẩn đoán sự cố khởi động.

Vì sao systemd thay thế được hệ thống cũ
Cách khởi động kiểu SysV dựa trên một ý tưởng đơn giản nhưng kém hiệu quả: mỗi dịch vụ là một script shell nằm trong thư mục /etc/init.d, các script này chạy tuần tự theo số thứ tự được gán. Hệ quả là thời gian khởi động bị kéo dài bởi chính những dịch vụ không liên quan, và mỗi script phải tự viết logic chờ, khởi động lại, ghi log riêng.
systemd giải quyết bằng hai thay đổi cấu trúc. Thứ nhất, systemd nạp các unit song song, chỉ chờ đúng phụ thuộc thật sự. Thứ hai, mỗi unit là một mô tả khai báo, không phải một đoạn code thủ tục: bạn khai báo điều gì cần chạy, cần sau ai, và cần bao nhiêu tài nguyên, thay vì viết từng bước.
systemd với cgroups: ghép cặp hoàn hảo
systemd không chỉ quản lý tiến trình, mà còn gắn mỗi tiến trình vào một control group để kernel thực thi các giới hạn. Tài liệu cgroup v2 của nhân Linux mô tả cơ chế thống nhất này, cho phép giới hạn và theo dõi bộ nhớ, CPU và số tiến trình của từng nhóm.
Đây là điểm mạnh thực tế. Trước đây, việc đảm bảo tiến trình con tiếp tục chạy sau khi tiến trình cha thoát là một thủ thuật lạ mà nhiều script quên mất. systemd xử lý việc này ở tầng hệ thống, kèm khả năng đặt giới hạn bộ nhớ, điều kiện lỗi và thời gian khởi động tối đa cho mỗi dịch vụ.

Các loại unit quan trọng nhất
Mọi thứ systemd quản lý đều là unit, được định danh bằng hậu tố đặc trưng loại. Biết đọc tên unit là kỹ năng cơ bản nhất khi chẩn đoán hệ thống.
| Loại | Hậu tố | Vai trò |
|---|---|---|
| Service | .service |
Dịch vụ chạy nền, ví dụ sshd.service |
| Socket | .socket |
Lắng nghe socket, kích hoạt service theo yêu cầu |
| Target | .target |
Nhóm các unit, tương đương runlevel cũ |
| Timer | .timer |
Lịch chạy định kỳ một service khác |
| Mount | .mount |
Gắn hệ thống tệp |
| Device | .device |
Thiết bị phần cứng được nhận diện |
| Path | .path |
Kích hoạt unit khi một đường dẫn thay đổi |
| Slice | .slice |
Nhóm cgroup để giới hạn tài nguyên theo nhóm |
Cấu hình systemd được đặt ở ba nơi: thư mục hệ thống /usr/lib/systemd/system do gói phần mềm cung cấp, thư mục quản trị /etc/systemd/system do quản trị viên tạo, và thư mục tạm /run/systemd/system cho thay đổi lúc chạy. Khi cùng một tên xuất hiện ở nhiều nơi, systemd ưu tiên /etc hơn /usr/lib. Nhờ đó, thay một tệp cấu hình từ gói bằng tệp riêng của bạn là cách override an toàn mà không cần sửa tệp gốc.
Chẩn đoán dịch vụ không lên: quy trình thực tế
Khi một dịch vụ không khởi động, hãy đi theo thứ tự từ trạng thái tổng quan xuống chi tiết, thay vì đoán ngẫu nhiên.
Bước 1: Kiểm tra trạng thái tổng thể
Lệnh đầu tiên luôn là kiểm tra unit cụ thể, xem nó đang ở trạng thái nào, đã bật hay chưa, và lỗi gần nhất là gì. Trạng thái failed kèm dòng Result cho biết tiến trình thoát theo kiểu nào, có phải do lỗi cấu hình hay bị giết bởi hệ thống.
Bước 2: Đọc log
systemd gom log của mọi dịch vụ về một nơi, nên bạn không cần biết tệp log nằm đâu. Lệnh lọc theo tên đơn vị cho phép xem ngay những dòng cuối cùng của chính service đó, kèm tiến độc lạ chỉ với một tên, đủ để thấy nguyên nhân phổ biến nhất là sai đường dẫn tệp hoặc cổng đã bị chiếm.
Bước 3: Phân tích thời gian khởi động
Nếu máy khởi động chậm, công cụ phân tích sẽ liệt kê các unit theo thời gian thực tế, từ đơn vị khởi động hệ thống cho tới từng dịch vụ. Từ báo cáo này bạn thấy ngay unit nào là thủ phạm thay vì phải đoán. Tương tự, cây cgroup cho biết nhóm tài nguyên nào đang dùng bao nhiêu, hữu ích khi bạn muốn xem dịch vụ nào ăn CPU.
Quản lý dịch vụ hằng ngày
Sau khi chỉnh sửa một tệp unit trong /etc/systemd/system, systemd cần được yêu cầu nạp lại cấu hình trước khi áp dụng, nếu không nó vẫn dùng cấu hình cũ trong RAM. Bạn cũng cần tải lại daemon. Khi tạo unit mới, phải thông báo cho systemd biết để nó quét thư mục cấu hình, vì systemd không tự theo dõi nội dung tệp.
Ba thao tác quản lý cơ bản là khởi động lại, dừng và tạm dừng một dịch vụ. Bốn lệnh này phân biệt rõ giữa việc thao tác một lần với việc vĩnh viễn: có lệnh tương ứng để bật hoặc tắt service khởi động cùng máy.
Vì sao không nên chỉnh sửa unit do gói phần mềm tạo
Đây là sai lầm phổ biến nhất với người mới. Nếu bạn sửa trực tiếp một tệp unit nằm trong /usr/lib/systemd/system, lần nâng cấp gói phần mềm tới tệp đó sẽ ghi đè thay đổi của bạn mà không có cảnh báo. Cách đúng là tạo một tệp override cùng tên trong /etc/systemd/system, chứa duy nhất các chỉ thị bạn muốn đổi, rồi tải lại systemd. Bản override sẽ hòa với bản gốc, chỉ ghi đè những trường bạn khai báo.
Cùng lý do đó, hãy tránh viết script tắt một dịch vụ thủ công rồi khởi động lại thủ công sau mỗi lần vào desktop. Nếu quy trình đó đủ phức tạp để cần script, hãy mô tả nó bằng một unit hoặc một timer đúng nghĩa để hệ thống tự lo phần điều phối.
Tài liệu đầy đủ nằm trong trang hướng dẫn systemd(1) trên freedesktop.org, và trang chủ dự án tại systemd.io giới thiệu các tính năng mới hơn như cơ chế boot, quản lý người dùng và các tính năng hậu container. Nếu cần đi sâu vào phần giới hạn tài nguyên, hãy ghép với tài liệu cgroup v2 của nhân đã nêu ở trên, vì phần lớn khả năng giới hạn đó do kernel thực thi chứ không phải systemd tự tính.
