Nix는 NixOS가 아닌 시스템에서 SystemD 모듈을 어떻게 관리합니까?

Nix는 NixOS가 아닌 시스템에서 SystemD 모듈을 어떻게 관리합니까?

nix-envUbuntu 호스트에 SystemD를 사용하여 패키지를 설치한다고 가정합니다 . Ubuntu의 SystemD가 Nix 패키지의 SystemD 모듈을 인식하도록 하려면 어떻게 해야 합니까?

.serviceNix가 설치한 파일을 찾아 심볼릭 링크로 연결해 보겠습니다 /lib/systemd/system/.아파치 카프카팩.

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

여기서는 Nix의 서비스 구성 이름을 기반으로 서비스 이름을 추측합니다.패키지 정의. 이 구성이 SystemD 서비스 파일이 되는 방법과 위치를 설명하는 문서를 찾을 수 없습니다.

그래도 작동하지 않자 Nix가 어딘가에 이 서비스 파일을 생성했음이 틀림없다고 가정하고 본격적으로 조사를 시작했습니다. 하지만 이제는 그것이 존재하는지 궁금해지기 시작했습니다. 그렇다면 Nix 패키지 관리자가 설치한 SystemD 모듈이 NixOS 외부에서 작동해야 할까요? 그렇다면 어떻게 작동하게 만들까요?

답변1

NixOS에서는 environment.systemPackages = [ package ];패키지의 systemd 단위를 사용하여 시스템에 설치할 수 있습니다.입증하다

의 단위는 /nix/store/hash-package/lib/systemd/system에 복사된 /run/current-system/sw/lib/systemd/system후 systemd에서 추가 서비스 디렉터리로 사용됩니다.

따라서 루트로 패키지를 설치할 때 서비스 유닛을 사용하려면 반드시 서비스 유닛을 /root/.nix-profile/lib/systemd/system추가로 제공해야 합니다 /etc/systemd/system.

NixOS를 사용하고 있으므로 완전히 테스트되지 않았습니다.

답변2

장소*. 제공하다문서

어디에 관해서는*. 제공하다Eelco Dolstra(Nix 주 작성자)가 최근에 찾은 파일비슷한 질문에 답변함:

많은 패키지가 실제로 systemd 단위를 제공합니다. 예를 들면 다음과 같습니다.

$ 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

따라서 포크("Nix 패키지"의 공식 이름)를 구축하는 방법에 따라*. 제공하다파일은 결과 디렉토리에서 사용할 수 있어야 합니다 $out/lib/systemd/system/. ( $out사용하는 옵션에 따라 다른 값을 대체해야 할 수도 있습니다 nix-build.)

구체적으로,그것을 사용할 때닉스 환경-i(귀하의 경우처럼) 조사해야 합니다~/.nix-프로필/당신의 것 $out. 예를 들어, 내 컴퓨터 중 하나에서:

$ 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

Ubuntu의 systemd에서 서비스 활성화

질문의 이 부분에 관해서는 현재 이 작업을 수행하는 방법을 잘 모르겠지만 귀하가 설명하는 것과 비슷한 것을 구성하고 싶습니다.

다음과 같은 추가 "부분"이 필요할 수 있다고 생각합니다.

  • 이 디렉토리를 인식할 수 있도록 Ubuntu 시스템 구성이 일부 변경되었습니다 ~.nixprofile/.... (BTW: 이 파일은 실제로 sudo 액세스 권한을 갖는 것과 동일하므로 이를 위해 일부 특수 사용자를 만들어야 한다고 생각합니다.)
  • systemctl enable --now $SERVICENix가 제공하는 모든 서비스에서 실행할 수 있는 일부 "활성화" 스크립트.
    • enabledServices = [ ... ];이상적으로는 Nix가 구축한 모든 서비스가 자동으로 활성화되는 것은 아니며, 다른 목록 과 같은 일부 추가 목록에 나열된 서비스만 활성화되어야 합니다 .
    • 이상적으로 "활성화" 스크립트는 이전에 Nix에서 활성화되었지만 지금은 누락된 서비스를 비활성화해야 합니다 enabledServices(아마도 경로에서 로드된 systemctl의 활성 서비스를 확인하여 .../.nix-profile/...?)
    • 아니면 위의 작업을 중간 "nixos-guest.target" 항목으로 수행할 수도 있습니다 systemctl daemon-reload.

답변3

생각하다 nix-env- systemd는 NixOS에서도 설치된 패키지를 찾을 수 없습니다.체계서비스가 아니었다면 결함이라고 생각했을 것입니다. (을 위한사용자서비스 말이 되지만 지원 상태를 모르겠습니다. )

답변4

다음과 같은 파일을 만듭니다 ~/.config/systemd/user.conf(사용자 이름을 바꿔야 합니다).

[Manager]
ManagerEnvironment="XDG_DATA_DIRS=/home/your_user/.nix-profile/share:/usr/local/share:/usr/share"

이는 시작 시 XDG_DATA_DIRS프로세스 환경에 주입되어 systemd --userNix 시스템 단위 파일을 에서 다운로드할 수 있습니다 ~/.nix-profile/share/systemd/user.

바라보다man 5 systemd-user.conf그리고man 5 systemd.unit더 많은 정보를 알고 싶습니다.

관련 정보