실행 파일이 서로 다른 nixpkg 커밋을 참조하는 서로 다른 Nixos 호스트 간에 이식 가능합니까?

실행 파일이 서로 다른 nixpkg 커밋을 참조하는 서로 다른 Nixos 호스트 간에 이식 가능합니까?

한 Nixos 호스트에서 다른 호스트로 실행 파일을 직접 복사하여 작동시키려고 합니다. 하나의 호스트에서만 작동/실행됩니다.

이전 호스트(작동하는 곳)에서:

[root@XenonKiloCranberry:~/blog]# ldd app
    linux-vdso.so.1 (0x00007fffd68fb000)
    libm.so.6 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libm.so.6 (0x00007f591bf32000)
    libpq.so.5 => /nix/store/sf3jq8d81gx6fmxsi0mhagpgsgpnxf6m-postgresql-9.6.12-lib/lib/libpq.so.5 (0x00007f591bd03000)

새 호스트에서 공유 라이브러리를 찾을 수 없습니다.

[root@XenonKiloCranberry:~/blog]# ldd /root/blog/app
    linux-vdso.so.1 (0x00007fff6cb89000)
    libm.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libm.so.6 (0x00007f927e00f000)
    libpq.so.5 => not found


그러나 libpq.so새 호스트의 postgresql-lib 디렉터리에서 파일을 보았습니다.

[root@XenonKiloCranberry:~/blog]# ll /nix/store/1m0kd7v8yvf5vdmd2jm16w4aal234114-postgresql-9.6.13-lib/lib/libpq.so
lrwxrwxrwx 1 root root 12 Jan  1  1970 /nix/store/1m0kd7v8yvf5vdmd2jm16w4aal234114-postgresql-9.6.13-lib/lib/libpq.so -> libpq.so.5.9
[root@XenonKiloCranberry:~/blog]# ll /nix/var/nix/profiles/system/sw/lib/libpq.so.5
lrwxrwxrwx 1 root root 80 Jan  1  1970 /nix/var/nix/profiles/system/sw/lib/libpq.so.5 -> /nix/store/1m0kd7v8yvf5vdmd2jm16w4aal234114-postgresql-9.6.13-lib/lib/libpq.so.5

[glibc gmp5 postgresql postgresql.lib zlib.dev zlib.out]내 에 패키지를 설치 했습니다 environment.systemPackages.

답변1

DT_RUNPATHNix에서 빌드한 패키지는 공유 라이브러리를 찾기 위해 ELF 파일의 항목을 사용하는 경우가 많습니다 . 예를 들어 다음을 사용하여 nix run -f . patchelf -c patchelf --print-rpath app항목을 볼 수 있습니다 . 귀하의 경우에는 다음과 같은 내용이 반환됩니다.

/nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib:/nix/store/sf3jq8d81gx6fmxsi0mhagpgsgpnxf6m-postgresql-9.6.12-lib/lib

이는 절대 경로이므로 라이브러리를 찾으려면 Nix 스토어에 관련 경로가 있어야 합니다.

nixpkgs프로그램을 빌드하는 데 사용된 커밋을 알고 있는 경우 nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.lib두 번째 컴퓨터에서 프로그램을 실행하여 라이브러리를 숨김에 추가할 수 있습니다. 하지만 GC 루트에 추가하지 않으면 가비지 수집기에 의해 지워질 수 있다는 점에 유의하세요.

프로그램을 Nix 표현식으로 구성하면 쉽습니다.전체 클로저 내보내기다른 컴퓨터로 가져옵니다.

관련 정보