Làm thế nào để bắt đầu một dịch vụ systemd trước khi bắt đầu kết nối mạng?


11

Tôi đang cố gắng thiết lập một dịch vụ mới (trong Debian Jessie) cần thiết lập một số gắn kết nơi cấu hình mạng được lưu trữ và do đó dịch vụ này phải hoàn thành trước khi bắt đầu dịch vụ mạng.

Tôi đã thử như sau:

[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
#Before=network-pre.target
Before=networking.service

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=networking.service

Sử dụng systemd-analyze plottôi có thể thấy rằng dịch vụ của tôi bắt đầu, nhưng networking.servicebắt đầu sớm hơn khoảng 3 giây:

nhập mô tả hình ảnh ở đây

Rõ ràng cấu hình của tôi là sai, nhưng tôi đang gặp khó khăn trong việc tìm kiếm vấn đề ... Bất kỳ trợ giúp nào đều được đánh giá cao ..

Cập nhật

Tôi hiện đã giải quyết nó bằng cách thay đổi cấu hình dịch vụ để bắt đầu trước local-fs.targetthay vì networking.service:

[Unit]
DefaultDependencies=no
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
Before=local-fs.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
RequiredBy=local-fs.target

Tuy nhiên, tôi muốn hiểu tại sao cấu hình đầu tiên của tôi không hoạt động như mong đợi ...?


Do cách hệ thống hoạt động, thứ tự thời gian theo nghĩa đen trong đó mọi thứ chạy có thể không đáng kể. Khi kết nối mạng, nó có thành công theo các tệp trong thư mục đó không?
Tom Hunt

Tôi không chắc là tôi hiểu câu hỏi của bạn. Dù sao, /etc/network/interfacescó tham chiếu đến ip-upcác tập lệnh nằm trong một phân vùng khác. Phân vùng đó được gắn bằng một kịch bản phức tạp /opt/intermodul-mounts/start.shphải được chạy trước khi mạng đã được thiết lập. Hiện tại, các ip-uptập lệnh không thực sự bắt đầu vì chúng không thể truy cập được khi khởi động. Chạy service networking restartsau đó sẽ hiển thị tất cả các giao diện chính xác.
Udo G

Câu trả lời:


8

network-pre.target là mục tiêu có thể được sử dụng để đặt hàng dịch vụ trước khi bất kỳ giao diện mạng nào được định cấu hình. Mục đích chính của nó là để sử dụng với các dịch vụ tường lửa muốn thiết lập tường lửa trước khi bất kỳ giao diện mạng nào hoạt động. Đây là một đơn vị thụ động: bạn không thể khởi động trực tiếp và không bị dịch vụ quản lý mạng kéo vào, mà bởi dịch vụ muốn chạy trước nó.

Bạn muốn sử dụng network-pre.targetnếu bạn muốn thiết lập một cái gì đó trước khi mạng bắt đầu

Các dịch vụ muốn được chạy trước khi mạng được định cấu hình nên đặt Before = network-pre.target và cũng đặt Wants = network-pre.target để kéo nó vào.

Bạn nên đặt chúng dưới [Unit]mục:

Before=network-pre.target
Wants=network-pre.target

Tài liệu tham khảo


1
Xin chào @edwardtorvalds, tôi đã thực hiện chính xác điều này cho một số thiết lập cấu hình mạng, nhưng thiết bị dường như không bao giờ chạy. Câu trả lời systemctl is-enabled <unit>là luôn luôn static. Tất nhiên, tôi không thể kích hoạt nó vì không có WantedBy=. Rốt cuộc, nó muốn gì? Đây là một cái gì đó mà một số thiết lập trước khi mạng nên tải.
deitch

bạn có thể thử muốn bởi = remote-fs.target hoặc mount-fs.target.
Edward Torvalds

2
Cảm ơn. Tôi đã kết thúc làm Before=network-pre.targetWants=network-pre.targetvà cho [Install]chúng tôi đã làm WantedBy=network.target. Phần cuối cùng buộc nó phải được yêu cầu bởi mạng, trước đây đặt nó theo thứ tự. Tuy nhiên, đó là một nỗi đau
deitch

vì bạn chắc chắn có đầu óc xung quanh systemd tốt hơn tôi nhiều, bạn có thể nhìn vào q khác tôi có không? unix.stackexchange.com/questions/277783/ Quảng Vẫn cố gắng tìm ra cách để làm điều đó.
deitch

Tôi bối rối vì tôi không có kinh nghiệm với phân vùng được mã hóa, nếu bạn có thể đơn giản làm ơn hãy làm như vậy
Edward Torvalds

3

Như được thực hiện trong Debian Jessie, gói netfilter-continent (cho phép tải các quy tắc iptables trước khi mạng kết thúc) có một dịch vụ netfilter-continent.service trông giống như:

# https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
# based on the netfilter-persistent package
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no

Before=network-pre.target
Wants=network-pre.target

Wants=systemd-modules-load.service local-fs.target
After=systemd-modules-load.service local-fs.target

Conflicts=shutdown.target
Before=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop

[Install]
WantedBy=multi-user.target

Tại sao nó lại mâu thuẫn với shutdown.target?!
Alexis Wilke

1

Sai lầm rất đơn giản và một trong những điều chính tôi luôn trộn lẫn: Bạn trộn BeforeRequiredBy. Điều đó không đi cùng nhau. Những người khác là chính xác về mục tiêu.


0
[Unit]
Description=mount/repair remaining filesystems (all persistent fs beyond "/")
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/opt/intermodul-mounts/start.sh
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=basic.target

Làm một cái gì đó dọc theo các dòng này sẽ đảm bảo rằng đơn vị này đã chạy trước mạng, nhưng sau khi hầu hết các thiết lập quan trọng khác đã xảy ra.

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.