Nix quản lý các mô-đun SystemD trên một NixOS như thế nào?


8

Giả sử tôi sử dụng nix-envđể cài đặt gói sử dụng SystemD, trên máy chủ Ubuntu. Cần phải làm gì để SystemD của Ubuntu biết về các mô-đun SystemD đến từ các gói Nix?

Hãy thử tìm Nix cài đặt .servicetập tin, và symlinking chúng từ /lib/systemd/system/, cho Apache Kafka gói.

nix-env -i apache-kafka
sudo systemctl start apache-kafka # Failed to start apache-kafka.service: Unit apache-kafka.service not found.
sudo updatedb && locate apache-kafka.service # No dice
locate kafka | grep service # Just a bunch of `.nix` files

Ở đây, tôi đoán tên dịch vụ dựa trên tên cấu hình dịch vụ trong định nghĩa gói Nix . Tôi chưa thể tìm thấy bất kỳ tài liệu nào mô tả cách thức và nơi cấu hình đó trở thành tệp dịch vụ SystemD.

Khi nó không hoạt động, tôi bắt đầu thực sự đào bới, với giả định rằng ở đâu đó, Nix phải tạo tệp dịch vụ này. Nhưng bây giờ, tôi bắt đầu nghi ngờ rằng nó tồn tại. Vì vậy, các mô-đun SystemD được cài đặt bởi trình quản lý gói Nix có nghĩa vụ phải hoạt động bên ngoài NixOS không, và nếu vậy, làm thế nào để chúng tôi làm cho chúng hoạt động?


1
Ý bạn là .servicetập tin thay vì .systemtập tin?
Mark Stosberg

có vẻ như github.com/rycee/home-manager có thể xử lý các dịch vụ ở một mức độ nào đó, mặc dù tôi không gặp rắc rối với nó nhiều (chưa)
Ben Creasy

Bạn có thể giải quyết điều này? Rất thích nghe những gì bạn đã học, bởi vì SystemD không có trong bất kỳ tài liệu hướng dẫn nào (ngoại trừ một phần ngắn gọn trong phần NixOS ).
toraritte

Tôi đã có thể tìm ra rằng nixos / mô-đun / system / boot / systemd.nix kết hợp các tệp dịch vụ bằng các hàm trợ giúp từ nixos / mô-đun / hệ thống / boot / systemd-lib.nix , nhưng chưa có đầu mối nào để sử dụng thông tin này.
toraritte

Câu trả lời:


8

Trên NixOS, có thể sử dụng environment.systemPackages = [ package ];để cài đặt các đơn vị systemd của gói vào hệ thống. Bằng chứng

Các đơn vị /nix/store/hash-package/lib/systemd/systemđược sao chép vào /run/current-system/sw/lib/systemd/system, sau đó được systemd sử dụng như một thư mục dịch vụ bổ sung.

Vì vậy, nếu bạn muốn sử dụng các đơn vị dịch vụ khi cài đặt gói làm root, hãy chắc chắn rằng đường dẫn /root/.nix-profile/lib/systemd/systemđược sử dụng bởi systemd ngoài /etc/systemd/system. Ngoài ra, hãy chắc chắn rằng phái sinh cung cấp cho các đơn vị.

Hoàn toàn chưa được kiểm tra, vì tôi đang dùng NixOS


5

Vị trí của các tệp * .service

Về vị trí của các tệp * .service , Eelco Dolstra (tác giả chính của Nix) gần đây đã trả lời một câu hỏi tương tự :

Nhiều gói thực tế cung cấp các đơn vị systemd, ví dụ:

$ nix-build -A utillinux.bin

$ ls -l ./result-bin/lib/systemd/system/
total 16
-r--r--r-- 2 root root 155 Jan  1  1970 fstrim.service
-r--r--r-- 5 root root 170 Jan  1  1970 fstrim.timer
-r--r--r-- 2 root root 248 Jan  1  1970 uuidd.service
-r--r--r-- 2 root root 185 Jan  1  1970 uuidd.socket

Vì vậy, tùy thuộc vào cách bạn xây dựng đạo hàm (tên chính thức cho "gói Nix"), các tệp * .service sẽ có sẵn trong $out/lib/systemd/system/thư mục kết quả . (Trường hợp $outbạn có thể cần thay thế các giá trị khác nhau, tùy thuộc vào tùy chọn bạn sử dụng nix-build.)

Cụ thể, khi sử dụng nix-env -i (như trong trường hợp của bạn), bạn nên xem xét ~ / .nix-profile / như của bạn $out. Ví dụ: trên một trong các máy của tôi:

$ ls -l ~/.nix-profile/lib/systemd/system/
total 8
-r--r--r-- 1 akavel akavel 268 sty  1  1970 nix-daemon.service
-r--r--r-- 1 akavel akavel 235 sty  1  1970 nix-daemon.socket

Kích hoạt các dịch vụ trong systemd của Ubuntu

Về phần câu hỏi này, tôi không chắc chắn làm thế nào để làm điều này vào lúc này, nhưng tôi quan tâm đến việc cấu hình một cái gì đó tương tự như những gì bạn mô tả.

Tôi nghĩ có thể cần thêm các "bộ phận" sau:

  • một số thay đổi trong cấu hình hệ thống Ubuntu để làm cho nó biết về ~.nixprofile/...thư mục; (bằng cách này: tôi tin rằng một số người dùng đặc biệt nên được tạo cho việc này, vì những tệp đó sau đó sẽ tương đương hiệu quả với việc có quyền truy cập sudo)
  • một số tập lệnh "kích hoạt" sẽ chạy systemctl enable --now $SERVICEtrên tất cả các dịch vụ do Nix cung cấp;
    • lý tưởng, không phải tất cả các dịch vụ được xây dựng bởi Nix đều phải được bật tự động, chỉ những dịch vụ được liệt kê trong một số danh sách bổ sung, như enabledServices = [ ... ];hoặc một cái gì đó;
    • lý tưởng là tập lệnh "kích hoạt" sẽ vô hiệu hóa các dịch vụ được kích hoạt trước đây từ Nix, nhưng hiện tại đã bị thiếu enabledServices(có thể bằng cách kiểm tra các dịch vụ đang hoạt động trong systemctl được tải từ đường dẫn .../.nix-profile/...?)
    • hoặc có thể ở trên có thể được thực hiện với một số điều 'nixos-guest.target' trung gian, cộng với systemctl daemon-reload?

2

Có vẻ như bạn có hai câu hỏi:

  1. Nix cài đặt tập tin ở đâu?
  2. Các tập tin systemd cần được đặt ở đâu để chúng hoạt động?

nixGói của bạn gần như chắc chắn là một định dạng lưu trữ nén như .ziphoặc a .tar.gz, nhưng với một phần mở rộng khác. Bạn có thể kiểm tra loại tệp bằng cách tải xuống gói Nix, sau đó sử dụng filecông cụ:

 file ./my-nix-package

Giả sử nó sử dụng .ziphoặc .tar.gzđịnh dạng, sau đó bạn có thể sử dụng lệnh ziphoặc liên quan tarđể liệt kê nội dung của gói. Thông thường nội dung gói che phủ hệ thống tệp, vì vậy điều này sẽ xác nhận cho bạn nếu có .servicetệp trong gói và nơi có thể được cài đặt.

Nix cũng có thể có lệnh đóng gói để trả lời câu hỏi "tất cả các tệp thuộc về packakge này ở đâu?".

Câu trả lời cho câu hỏi thứ hai của bạn là trong man systemd.unit. systemdsẽ tìm các tệp đơn vị hệ thống systemd trong các thư mục sau, thứ tự ưu tiên này:

   /etc/systemd/system/*
   /run/systemd/system/*
   /lib/systemd/system/*

Nếu Nix hoạt động tốt, nó sẽ cài đặt systemdcác tệp vào /lib/systemd/system. Nếu nó đã cài đặt một .servicetệp ở một nơi khác, thì bạn nên sao chép hoặc liên kết nó vào /etc/systemd/system- Chỉ người quản lý gói mới nên sửa đổi các tệp trong /lib/systemd/system.


Vâng, bố cục thư mục của Nix là đối cực của những gì POSIX sẽ coi là "cư xử tốt". Thật đáng ngạc nhiên, phần lớn nó hoạt động khá tốt trên hệ thống POSIX cổ điển. Mục tiêu khác nhau, điểm mạnh khác nhau, vấn đề khác nhau.
Dan Ross

Kế hoạch của tôi là liên kết các tệp được quản lý Nix từ một trong các thư mục SystemD thông thường. Một cái gì đó mà Nix sẽ không tự động làm, bởi vì điều đó sẽ đánh bại mục tiêu hỗ trợ cài đặt gói phần mềm xung đột; bộ sưu tập các tệp dịch vụ của hệ thống máy chủ là một dạng trạng thái toàn cầu / singleton.
Dan Ross

2

Tôi nghĩ rằng nix-env các gói đã cài đặt không được systemd tìm thấy ngay cả trên NixOS - và nói về các dịch vụ hệ thống , tôi sẽ coi đó là một lỗ hổng nếu nó khác. (Đối với dịch vụ người dùng, điều này sẽ có ý nghĩa nhưng tôi không biết trạng thái hỗ trợ.)


Có, tôi không mong đợi SystemD lưu trữ trên các tệp được cài đặt Nix, vì lý do đó. Điều thực sự khiến tôi phải lo lắng, đó là thực tế là Nix dường như không tạo ra các tệp dịch vụ ở bất cứ đâu - giống như nó đang sử dụng SystemD mà không có bất kỳ tệp nào của SystemD hoạt động. Tôi cho rằng tôi nên hỏi xung quanh về IRC hoặc Slack hoặc bất cứ điều gì cộng đồng nhà phát triển địa phương sử dụng.
Dan Ross
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.