systemd là gì? Quản lý dịch vụ và tiến trình khởi động trên Linux

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.

Sơ đồ cgroups v1 và cgroups v2 hệ thống phân cấp thống nhất của nhân Linux do systemd quản lý

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

Sơ đồ các thành phần của systemd: manager daemon, các tiện ích journalctl, analyze, cgls và nhóm target

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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Mã tận là gì? Kỹ thuật sửa lỗi truyền thông số hiệu quả

Mã tận (Convolutional code) là một lớp mã sửa lỗi tạo ra các ký hiệu kiểm tra bằng cách trượt một hàm đa thức Boolean trên dòng dữ liệu. Nhờ…

Xem thêm

tmux là gì? Terminal multiplexer cho lập trình viên dòng lệnh

tmux là gì? Terminal multiplexer cho lập trình viên dòng lệnh Nhiều cửa sổ tmux cùng chạy song song, mỗi cửa sổ chia thành nhiều pane chạy lệnh khác nhau…

Xem thêm

Sidecar pattern là gì? Kiến trúc tách phụ trợ khỏi ứng dụng chính

Sidecar pattern là gì? Kiến trúc tách phụ trợ khỏi ứng dụng chính Sidecar pattern (mẫu xe bên cánh) là một mẫu kiến trúc phần mềm trong đó các chức…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất