Postgresql

是否可以在引用不同 nixpkg 送出的不同 Nixos 主機之間移植執行檔?

  • August 24, 2019

我試圖通過將執行檔直接從一台 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.

Nix 建構的包通常依賴DT_RUNPATHELF 文件中的條目來定位共享庫。例如,您可以使用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 表達式,則很容易導出整個閉包並將其導入另一台電腦。

引用自:https://unix.stackexchange.com/questions/523832