Tôi gặp vấn đề tương tự khi kiểm tra các vở kịch Ansible của tôi yêu cầu systemd. Và như bạn đã nói, docker có vẻ như là cách tiếp cận tốt nhất ở đây vì việc đưa lên và xuống một container dễ dàng hơn nhiều so với một máy ảo.
Trước hết, hình ảnh cơ sở / archlinux không được dùng nữa - thay vào đó bạn nên sử dụng archlinux / base . Sau đó, để chạy systemd hoàn toàn không có đặc quyền, cần thực hiện một số điều:
- cung cấp biến "conrainer =", vì vậy systemd sẽ không thử thực hiện một số thứ mà nó thường khởi động máy phần cứng
- systemd tích cực sử dụng cgroups, vì vậy liên kết hệ thống tệp mount / sys / fs / cgroup từ máy chủ
- không cần gắn kết / sys / fs / cầu chì nhưng giúp tránh các sự cố với phần mềm phụ thuộc vào cầu chì
- systemd nghĩ rằng sử dụng tmpfs ở mọi nơi là một cách tiếp cận tốt, nhưng việc chạy không được ưu tiên khiến nó không thể gắn tmpfs ở bất cứ nơi nào nó muốn, vì vậy hãy cài đặt tmpfs vào / tmp, / run và / run / lock
- là bit cuối cùng bạn cần chỉ định sysinit.target làm đơn vị mặc định để khởi động thay vì multi-user.target hoặc bất cứ điều gì, vì bạn thực sự không muốn bắt đầu những thứ đồ họa bên trong một container
Dòng lệnh kết quả là
docker run \
--entrypoint=/usr/lib/systemd/systemd \
--env container=docker \
--mount type=bind,source=/sys/fs/cgroup,target=/sys/fs/cgroup \
--mount type=bind,source=/sys/fs/fuse,target=/sys/fs/fuse \
--mount type=tmpfs,destination=/tmp \
--mount type=tmpfs,destination=/run \
--mount type=tmpfs,destination=/run/lock \
archlinux/base --log-level=info --unit=sysinit.target
Nếu chúng ta đang nói về việc chạy dịch vụ cụ thể ở đó như ntpd từ ví dụ của bạn, bạn sẽ cần thêm
--cap-add=SYS_TIME
nếu không, ntpd sẽ thất bại với quyền từ chối vì không ai muốn một bộ chứa để đặt thời gian hệ thống theo mặc định.
Ps tôi đã dành khá nhiều thời gian để tìm hiểu cách systemd hành xử và quản lý để làm cho nó hoạt động trên số lượng hình ảnh hệ điều hành. Tôi đã mô tả kinh nghiệm của tôi trong một bài viết Chạy systemd trong container docker . Nó là tiếng Nga nhưng tôi tin rằng google dịch nên hoạt động trong trình duyệt của bạn. Cảm ơn
ENTRYPOINT
hệ thống được xác định trước không có yếu tố nào trong đó. Nếu bạn đang tìm kiếm một loại tích hợp container nào đó với systemd, bạn có thể xem xét việc tạo một dịch vụ