Làm cách nào để có được systemd để bắt đầu tập lệnh mount ZFS của tôi trước khi làm bất cứ điều gì khác?


7

Ngay bây giờ tôi đang sử dụng zfsonlinux trên Fedora 19, và nó hoạt động rất tốt. Gắn kết hoạt động khi khởi động theo kế hoạch bằng cách sử dụng initscript (bao gồm zfs) mà hệ thống gọi, nhưng có một lỗ hổng khá quan trọng: ZFS được gắn cách, WAY quá muộn trong khi khởi động, đến mức truyền và các dịch vụ khác bị mất mà không có / zfs gắn kết và không thể phục hồi, do đó làm hỏng chúng.

Những gì tôi đang theo là một cách để systemd kích hoạt kịch bản trước khi làm bất cứ điều gì khác. Tôi biết cách thực hiện bằng cách sử dụng initscripts (chỉ cần đặt nó ở mức thấp hơn, giả sử là 2), nhưng tôi không có khả năng sương mù nhất khi thực hiện nó với hệ thống đích của systemd.

Tôi đã thử thiết lập mọi thứ trong các dịch vụ yêu cầu zfs, nhưng nó không hoạt động, chặn Type = idle (nhưng phải có cách tốt hơn để thực hiện bất kể):

Requires=network.target
After=zfs
Type=idle

Và để tham khảo, đây là bản in được cung cấp bởi Fedora . Do bản chất của cách ZFS gắn kết trên linux (?), Tôi không thể chỉ nhập một mục vào fstab và được thực hiện với nó, nó phải được gắn kết bằng các lệnh.


chưa được kiểm tra nhưng tôi tin rằng bạn cần cập nhật multi-user.target để phụ thuộc vào dịch vụ của mình, giả sử rằng các dịch vụ khác của bạn bắt đầu sau nhiều người dùng.
BitsOfNix

@ alexandre-alves Tôi không chắc chắn nếu mục tiêu có thể bắn Initscript (nếu họ có thể, sau đó đập vỡ), và lý tưởng tôi muốn tránh phải viết lại toàn bộ gắn kịch bản để làm cho nó systemd sẵn sàng
vịt.

Chỉ là một suy nghĩ, nhưng có thể là dịch vụ zfs của bạn được coi là một daemon, thay vì một nhiệm vụ? Tức là kịch bản đã bắt đầu trước các dịch vụ khác phụ thuộc vào nó, nhưng chưa hoàn thành?
MvG

Điều này có thể có bất cứ điều gì với quy tắc udev của bạn? Tôi sẵn sàng đặt cược có một số kết nối
mikeerv

Câu trả lời:


1

systemdcó một chỉ thị cụ thể cho trường hợp này, được gọi là RequiredMountsFor; thấy man systemd.directives.

Việc sử dụng sẽ là RequiresMountsFor=[mountpoint], ví dụ RequiresMountsFor=/zfs.

Câu hỏi chính có thể là liệu bạn có thực sự cần phản ánh một điều kiện "bất cứ điều gì khác", như trạng thái Q của bạn không. Tôi nghĩ ý tưởng là sử dụng các phụ thuộc này một cách chọn lọc nhất có thể để hỗ trợ tìm ra trình tự tối ưu và song song tối đa.


-1

Tôi sẽ cố gắng trả lời tốt nhất có thể, không quen thuộc với systemd.

Kịch bản được cung cấp chỉ là một tiêu chuẩn, vì vậy bạn luôn có thể bắt đầu với nó script_name start.

Từ những gì tôi đã thấy trong các trang hướng dẫn của systemd, bạn có thể xác định các phụ thuộc và cách tốt nhất là sử dụng các mục tiêu cụ thể trước và sau. Nhìn vào các tập tin có một bí danh từ runlevel 2 3 và 4 để luôn là multiuser.target.

nếu bạn thực hiện các phụ thuộc danh sách systemctl basic.target, bạn có thể dễ dàng tìm ra nơi bạn muốn dịch vụ của mình bắt đầu.

[Unit]
Description=my Service
Before=basic.target 
After=local-fs.target

[Service]
Type=simple
ExecStart=/path/to/script start
ExecStop=/path/to/script stop

lưu ví dụ tập tin /usr/lib/systemd/myservice.service. systemctl cho phép myservice.service.

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.