- Nitro là một bộ giám sát tiến trình và hệ thống init siêu nhỏ gọn có thể áp dụng cho cả môi trường nhúng, máy chủ, máy tính để bàn và container
- Chỉ lưu trạng thái hệ thống trong RAM, nên vẫn hoạt động trơn tru trên hệ thống tệp chỉ đọc, đồng thời cung cấp thiết kế hướng sự kiện nhanh và hiệu quả
- Cách cấu hình là cấu trúc thư mục script đơn giản, cho phép quản lý dịch vụ mà không cần tệp cấu hình phức tạp hay quy trình build bổ sung
- Hỗ trợ các tính năng tối ưu cho container và môi trường nhúng như dịch vụ tham số hóa, khởi động lại bền vững, và ghi log đáng tin cậy theo từng dịch vụ
- Bảo đảm tính linh hoạt và khả năng kiểm soát cao với điều khiển từ xa qua công cụ nitroctl, điều khiển hoạt động dựa trên tín hiệu
Tổng quan
Nitro là một bộ giám sát tiến trình siêu nhỏ gọn có thể dùng làm pid 1 trên Linux
Các lĩnh vực ứng dụng chính như sau
- init cho các máy Linux với nhiều mục đích khác nhau như nhúng, desktop, máy chủ
- init của Linux initramfs
- init trong môi trường container như Docker/Podman/LXC/Kubernetes
- daemon giám sát chạy không cần đặc quyền trên hệ thống POSIX
Cấu hình sử dụng cấu trúc script dựa trên thư mục, vị trí mặc định là /etc/nitro
Yêu cầu
- Cần kernel hỗ trợ Unix socket
- Cần
tmpfshoặc thư mục/runcó thể ghi
Ưu điểm so với các hệ thống khác
- Toàn bộ thông tin trạng thái chỉ được giữ trong RAM, nên có thể chạy trên hệ thống tệp gốc chỉ đọc mà không cần thủ thuật riêng
- Cung cấp hiệu quả nhờ cơ chế hoạt động hướng sự kiện, không polling
- Không có cấp phát bộ nhớ động trong lúc chạy
- Không tiêu tốn file descriptor vô hạn
- Chỉ cần một binary self-contained duy nhất (có thể thêm binary điều khiển dưới dạng tùy chọn)
- Không cần chuyển đổi hay biên dịch tệp cấu hình, dịch vụ chỉ là thư mục đơn giản chứa script
- Hỗ trợ chuỗi khởi động lại dịch vụ và ghi log
- Vẫn hoạt động bình thường ngay cả khi đồng hồ hệ thống không chính xác
- Có thể chạy trên FreeBSD thông qua
/etc/ttys - Có thể tạo binary static siêu nhỏ khi dùng musl libc
Quản lý dịch vụ
-
Mỗi thư mục dịch vụ (mặc định nằm trong
/etc/nitro) có thể chứa các tệp sausetup: script (tùy chọn) được chạy trước khi khởi động dịch vụ; chỉ khi kết thúc bình thường (0) thì dịch vụ mới được phép khởi độngrun: script vận hành dịch vụ; dịch vụ được coi là còn sống miễn là script này chưa kết thúc; nếu chưa triển khai thì được xử lý như dịch vụ one-shotfinish: script (tùy chọn) chạy sau khirunkết thúc; nhận trạng thái thoát và giá trị tín hiệu làm đối sốlog: symbolic link trỏ tới thư mục dịch vụ khác, nối đầu ra củarunvào đầu vào của dịch vụ đó bằng pipe (có thể dùng cho chuỗi ghi log)down: nếu tệp này tồn tại thì nitro mặc định sẽ không đưa dịch vụ này lên- Nếu tên thư mục kết thúc bằng
@thì sẽ bị bỏ qua và có thể dùng làm dịch vụ tham số hóa - Tên dịch vụ phải dưới 64 ký tự và không được chứa ký tự
/,,, hoặc xuống dòng
-
Tiện ích
chpstcủa runit rất hữu ích khi viết scriptrun
Dịch vụ đặc biệt
LOG: dịch vụ mặc định để ghi log cho mọi dịch vụ không có liên kếtlogSYS:SYS/setupđược chạy trước khi mọi dịch vụ khởi động, có thể dùng để triển khai thứ tự khởi động dịch vụSYS/finish: chạy trước khi bước vào giai đoạn tắt toàn bộSYS/final: chạy sau khi mọi tiến trình đã kết thúcSYS/fatal: được chạy thay vì thoát khi xảy ra lỗi nghiêm trọng (nếu có)SYS/reincarnate: được chạy thay cho shutdown, có thể dùng chẳng hạn để tái triển khai initramfs
Dịch vụ tham số hóa
- Thư mục dịch vụ kết thúc bằng
@sẽ bị nitro bỏ qua, nhưng vẫn có thể được chỉ định trực tiếp qua symbolic link hoặc lệnhnitroctl - Tham số phía sau
@sẽ được truyền làm đối số đầu tiên cho từng script- Ví dụ: nếu có symbolic link
agetty@/runvàagetty@tty1thì sẽ chạyagetty@/run tty1 - Khi nhập
nitroctl up agetty@tty2thì có thể chạyagetty@/run tty2(không phụ thuộc việc thư mục có tồn tại hay không)
- Ví dụ: nếu có symbolic link
Chế độ hoạt động
- Toàn bộ vòng đời gồm ba giai đoạn: khởi động, chạy dịch vụ (giám sát), tắt máy
- Khởi động: nếu tồn tại dịch vụ đặc biệt
SYSthì chạy từsetup, sau đó chạy mọi dịch vụ non-down - Khi dịch vụ kết thúc thì sẽ được khởi động lại; tuy nhiên nếu lần khởi động lại gần nhất diễn ra quá nhanh thì sẽ chờ 2 giây
- Có thể gửi tín hiệu tắt qua
nitroctl ReboothoặcShutdown- Khi đó chuỗi xử lý là
SYS/finish→ SIGTERM cho mọi dịch vụ (chờ tối đa 7 giây) → SIGKILL →SYS/final→ chuỗi tắt
- Khi đó chuỗi xử lý là
- Trong trường hợp dùng cho container hoặc bộ giám sát không đặc quyền thì chỉ kết thúc các tiến trình
- Khởi động: nếu tồn tại dịch vụ đặc biệt
Điều khiển bằng nitroctl
- Công cụ CLI nitroctl cho phép điều khiển nitro từ xa
Ví dụ lệnh:
- list: hiển thị danh sách dịch vụ, trạng thái, PID, uptime, trạng thái thoát gần nhất
- up/down/start/stop/restart: điều khiển khởi động, dừng, khởi động lại dịch vụ
- Gửi tín hiệu: p(SIGSTOP), c(SIGCONT), h(SIGHUP), a(SIGALRM), i(SIGINT), q(SIGQUIT), 1(SIGUSR1), 2(SIGUSR2), t(SIGTERM), k(SIGKILL)
- pidof: in ra PID của dịch vụ được chỉ định
- rescan: đọc lại thư mục dịch vụ, phản ánh các dịch vụ được thêm hoặc xóa
- Shutdown/Reboot: tắt hoặc khởi động lại toàn bộ hệ thống
Điều khiển bằng tín hiệu
- Có thể điều khiển bằng cách gửi trực tiếp tín hiệu tới tiến trình nitro
- SIGHUP: quét lại dịch vụ (
rescan) - SIGINT: khởi động lại
- SIGTERM: tắt (nếu nitro không phải pid 1)
- SIGHUP: quét lại dịch vụ (
Nitro với vai trò init trên Linux
- Nitro là binary tự chứa có thể khởi động trực tiếp làm Linux pid 1
- Có thể mount
/dev,/runkhi cần; các xử lý khác được thực hiện trongSYS/setup - Sự kiện Ctrl-Alt-Del sẽ kích hoạt quá trình khởi động lại một cách có trật tự
Sử dụng Nitro làm init trong container Docker
- Nitro có thể được build tĩnh để dễ dàng đưa vào container
- Cần có
/runtrong container để dùng đường dẫn socket mặc định - Nếu bind mount control socket thì có thể điều khiển từ xa bằng nitroctl từ bên ngoài
Nitro trên FreeBSD
- Có thể để FreeBSD init giám sát nitro bằng cách thêm dòng sau vào
/etc/ttys/etc/nitro "/usr/local/sbin/nitro" "" on
Tác giả
- Leah Neukirchen leah@vuxu.org
Lời cảm ơn
- Được phát triển dựa trên việc phân tích chi tiết các hệ thống giám sát tiến trình hiện có như daemontools, freedt, runit, perp, s6
Giấy phép
- Giấy phép 0BSD (xem chi tiết trong tệp LICENSE)
Chưa có bình luận nào.