実行可能ファイルは、異なる nixpkg コミットを参照する異なる Nixos ホスト間で移植可能ですか?

実行可能ファイルは、異なる nixpkg コミットを参照する異なる Nixos ホスト間で移植可能ですか?

実行ファイルを 1 つの Nixos ホストから別の Nixos ホストに直接コピーするだけで、実行ファイルを動作させようとしています。 動作/実行できるのは、ホストの 1 つだけです。

古いホスト(動作しているホスト)の場合:

[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

Nix によってビルドされたパッケージは通常、DT_RUNPATH共有ライブラリを見つけるために 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.lib2 台目のコンピューターで実行して、ライブラリをストアに追加できます。ただし、GC ルートに追加しない限り、ガベージ コレクターによってクリアされる可能性があることに注意してください。

プログラムをNix式で構築した場合、閉鎖全体をエクスポートする別のコンピューターにインポートします。

関連情報