Đặt dịch vụ systemd để thực thi sau khi gắn kết fstab


33

Tôi đang làm việc với một systemd .servicetập lệnh được cho là bắt đầu sau khi vị trí mạng CIFS được gắn kết /etc/fstabđể /mnt/khởi động.

Kịch bản chờ đợi một kịch bản phụ thuộc OpenVPN khởi chạy trước, nhưng tôi cũng muốn nó chờ quá trình mount hoàn thành.

/etc/systemd/system/my-daemon.service :

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

Tôi đã cố gắng thêm systemd.mountvào dòng: After=network.target vpn-launch.service systemd.mountnhưng nó không mang lại kết quả như tôi mong đợi.


Nó có hoạt động nếu bạn thêm systemd-remount-fsvào Afterdanh sách của bạn ?
Eric Renouf

Câu trả lời:


40

một vị trí mạng CIFS được gắn kết thông qua /etc/fstabđể /mnt/khởi động.

Không có nó không phải là. Nhận điều này đúng, và phần còn lại rơi vào vị trí tự nhiên.

Gắn kết được xử lý bởi một đơn vị gắn kết systemd (được tạo) sẽ được đặt tên giống như mnt-wibble.mount. Bạn có thể thấy tên thực của nó trong đầu ra của systemctl list-units --type=mountlệnh. Bạn có thể nhìn vào nó một cách chi tiết giống như bất kỳ đơn vị nào khác systemctl status.

Rất đơn giản, sau đó: bạn phải ra lệnh cho đơn vị của bạn được bắt đầu sau khi đơn vị gắn kết đó được bắt đầu.

After = network.target vpn-launch.service mnt-wibble.mount

đọc thêm


10
Danh sách gắn kết với "systemctl list-units --type = mount"
nijave

Đối với những người theo dõi, "wibble" chỉ là một tên giả, như "foobar"
rogerdpack

17

Xin lỗi nhưng tôi chưa thể bình luận.

Giống như JdeBP đã nói, bạn nên đặt hàng trên mount hệ thống tập tin. Bạn có thể dự đoán tên của đơn vị gắn kết hoặc, ngoài ra, bạn có thể sử dụng (trong phần đơn vị):

RequestMountsFor = / perfect / path / of / mount

Tùy chọn này tạo ra các phụ thuộc cho các đơn vị * .mount thích hợp để làm cho đường dẫn có thể truy cập trước khi bắt đầu dịch vụ. Nó có thể không có trên tất cả các phiên bản systemd, nhưng tôi đã sử dụng nó trong máy CentOS 7 trong 6 tháng qua.


(Và sự khác biệt của bạn với vanilla systemd là ở đây .) Đi RequiresMountsFor=kèm với bộ cảnh báo riêng của nó. Với lỗi RedHat # 1088057Chris Siebenmann trong tay, bạn sẽ có thể trả lời superuser.com/questions/988734 . Đây cũng là một gắn kết CIFS trong câu hỏi này. Nhưng ý nghĩa là nó auto, may mắn thay.
JdeBP

@JdeBP Cảm ơn bạn đã bình luận. Tôi đã không nhận thức được sự cẩn thận và các vấn đề về tính năng đó.
Miguelbernadi

14

Mặc dù cả hai câu trả lời đều đúng, tôi muốn thêm hai xu của mình vào cuộc thảo luận, bởi vì khi tôi tìm nó, tôi đã thiếu một số hướng dẫn và ví dụ về cách tiến hành.

  1. Thêm hệ thống tập tin vào /etc/fstab
  2. Loại mount -agắn kết tất cả các hệ thống tập tin được đề cập trong fstab
  3. Tìm kiếm đơn vị systemd đã được tạo bằng:

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    (sẽ trả về một cái gì đó kết thúc bằng .mount)
  4. Thêm đơn vị gắn kết tìm thấy vào After=câu lệnh trong *.servicetệp

Dưới đây là một ví dụ về việc my-daemonkhởi động dịch vụ khi khởi động nhưng sau khi mạng sẵn sàng, một chia sẻ CIFS được gắn vào /mnt/cifsvpn-launchdịch vụ đã bắt đầu:

/ etc / fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

Lưu ý: Bạn có thể muốn thêm nofailvào tùy chọn fstab của mình (ví dụ: khi sử dụng ổ đĩa ngoài). Nếu không, máy của bạn sẽ không khởi động nếu thiết bị không được kết nối. Xem bài viết fstab của ArchWiki


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

Đừng quên bật dịch vụ để nó được khởi động khi khởi động: systemctl enable my-daemon

Lưu ý rằng điều này cũng hoạt động cho các hệ thống tập tin khác (NFS, HDD, v.v.).

Như đã đề cập, cả hai câu trả lời đều đúng và tôi khuyến khích mọi người đọc chúng nhưng đối với tôi một vài ví dụ sẽ giúp tôi tiết kiệm thời gian.

Cập nhật (2019-06-25):

  • đã thêm một lưu ý liên quan đến các tùy chọn fstab để ngăn khóa khởi động khi sử dụng ổ đĩa ngoài
  • thêm mnt-cifs.mountvào Requires=danh sách đó gây ra my-daemon.servicethất bại trong việc khởi động khi CIFS gắn kết không gắn thành công

Nói rõ hơn, "mnt-cifs.mount" là tên của đơn vị gắn kết cho điểm gắn kết cụ thể của bạn từ systemctl list-units --type=mountđâu?
smvlpr

1

@ bm-bergmotte: cảm ơn sự chỉ dẫn của bạn đã giúp tôi rất nhiều. Đối với tôi, nó chỉ hoạt động, nếu tôi đặt

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

Nếu tôi không đặt "mnt-cifs.mount" bên trong "Yêu cầu" (và theo thứ tự này) thì nó hoạt động để khởi động lại / khởi động, nhưng dù sao thì dịch vụ vẫn khởi động, nếu thiết bị không được gắn. Sau khi đặt thêm vào bên trong "" Yêu cầu ", dịch vụ sẽ gắn thiết bị trước khi khởi động thiết bị, nếu thiết bị không được gắn.


Bạn đúng rồi. Nếu việc gắn kết thất bại thì my-daemon.service vẫn được bắt đầu. After=chỉ ra lệnh. Requires=làm cho nó bắt buộc phải gắn kết cifs (xem câu trả lời của Sufiyan Ghori trên đó). Tôi sẽ cập nhật câu trả lời của tôi.
bm-bergmotte
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.