Các tập tin đơn vị được liên kết Systemd trên đĩa được gắn không tải được


8

Chúng tôi có một ứng dụng nội bộ với các dịch vụ systemd mà chúng tôi muốn triển khai bên ngoài các thư mục systemd thông thường (/ etc / systemd / system và / usr / lib / systemd / system). Vị trí đó nằm trên một đĩa khác (/ mnt / data trong ví dụ).

Dịch vụ systemd được kích hoạt bởi:

systemctl enable /mnt/data/sprinterd.service

tạo liên kết tượng trưng trong / etc / systemd / system

lrwxrwxrwx. 1 root root   27 Jun 20 22:47 sprinterd.service -> /mnt/data/sprinterd.service

Sau khi khởi động lại, dịch vụ không được tải vì không thể tìm thấy tệp đơn vị. Từ tạp chí, đầu tiên là một lỗi mà dịch vụ không tải được, sau đó là sự gắn kết của đĩa nơi đặt thiết bị.

Cannot add dependency job for unit sprinterd.service, ignoring: Unit sprinterd.service failed to load: No such file or directory.
systemd[1]: Mounted /mnt/data.

Từ / etc / fstab:

/dev/disk/by-uuid/c55e944f-5c63-48ad-8cd2-bd32d7b35c82 /mnt/data auto nosuid,nodev,nofail,x-gvfs-show 0 0

Để hoàn thiện tệp đơn vị dịch vụ:

[Unit]
Description=sprinterd

[Service]
Type=simple
Environment=TERM=linux
ExecStart=/srv/s1.erp/bin/sprinterd
Restart=always
RestartSec=5
KillSignal=SIGKILL

[Install]
WantedBy=multi-user.target

Tôi đã thử nghiệm điều này trên RHEL 7 và trên openSuSE 13.2.

Được hỗ trợ để có một tệp đơn vị dịch vụ hệ thống trên một đĩa khác ngoài / etc hoặc / usr? Làm thế nào có thể thay đổi thứ tự thực hiện giữa việc gắn đĩa và tải các tệp đơn vị systemd?


Requires=mnt-data.mount...
jasonwryan

Không, vẫn vậy. việc gắn / mnt / dữ liệu xảy ra sau khi systemd tải tập tin đơn vị.
nickvane

Tôi nghĩ rằng Request, After và RequestMountFor được tính đến khi dịch vụ được khởi động, nhưng không phải khi nó được tải.
nickvane

6
Vấn đề là các tệp trong / etc / systemd là các liên kết tượng trưng và vì vậy khi systemd khởi động, nó cố gắng đọc và phân tích chúng trước khi bất kỳ hệ thống tệp nào được gắn kết; bởi vì hệ thống tệp không được gắn kết, symlink không tham chiếu đến tệp hợp lệ và do đó dịch vụ không được tải. Tôi rất muốn biết câu trả lời cho điều này vì tôi có các đơn vị tôi muốn được tải từ máy chủ NFS và gặp phải vấn đề tương tự; đến nay tôi đã phải sao chép thiết bị vào phân vùng gốc và cho phép :-(
Stephen Harris

@StephenHarris Đó là systemdvới bạn, Stephen. Tôi đang gặp chính xác cùng một vấn đề cũng có.
alecov

Câu trả lời:



2

Như được giải thích bởi @StephenHarris, vấn đề là tại thời điểm systemd cố gắng đọc đơn vị, tệp chưa được liên kết tượng trưng chưa có sẵn


Để chỉ có systemd tải lại các đơn vị sau khi nó được gắn kết:

[Unit]
Description=reloads units stored in /mnt/data
DefaultDependencies=no
After=mnt-data.mount
Requires=mnt-data.mount

[Service]
Type=oneshot
ExecStart=/bin/systemctl daemon-reload

[Install]
WantedBy=local-fs.target

Điều này sẽ khiến các đơn vị trở nên khả dụng, vì lần này mục tiêu của các liên kết tượng trưng được gắn kết.

Nhưng vào thời điểm đó, danh sách các công việc cần được chạy để đạt đến default.target đã được xây dựng và dịch vụ sẽ không được bắt đầu.


Để có nó cũng khởi động lại dịch vụ của bạn:

[Unit]
Description=restart unit stored in /mnt/data
Requires=mnt-data.mount

[Service]
Type=oneshot
ExecStart=/bin/systemctl daemon-reload
ExecStartPost=/bin/systemctl start sprinterd.service

[Install]
WantedBy=multi-user.target

Lựa chọn thay thế:

  • Tôi đã thử nghiệm với ExecStart=& ExecStartPost=, nhưng rõ ràng nó sẽ hoạt động với ExecStartPre=&ExecStart=
  • nếu đó là tất cả khoảng 1 đơn vị, bạn cũng có thể: ExecStart=/bin/systemctl enable /mnt/data/sprinterd.servicethay vì tải lại daemon
  • nếu có nhiều dịch vụ, hãy tải lại daemon , sau đó bắt đầu một đơn vị sử dụng ConsistsOf=hoặc PartOf=để tải tất cả nhiều dịch vụ.
  • Nếu NFS của nó (hoặc hệ thống nối mạng khác), tất nhiên local-fs.targetkhông phải là tùy chọn Cài đặt tốt nhất của bạn, rõ ràng.

Đối với cách tiếp cận kiểu SysVinit kiểu cũ hơn , hãy đặt các lệnh systemctl bên trong /etc/rc.localchmod +xtệp đó.

Và sau đó hãy đăng một cách lén lút vào danh sách gửi thư của Devuan về cách bạn cần SysVInit để sửa lỗi b0rked SystemD ;-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.