방법 1) 더러운 수동 방법, 패치 없음

방법 1) 더러운 수동 방법, 패치 없음

NixO에서 nixos가 아닌 실행 파일을 실행하는 다른 방법은 무엇입니까? (예를 들어 독점 바이너리.) 수동 방법도 보고 싶습니다.

답변1

관련 답변

실행만 하는 것이 아니라 바이너리를 패키징할 계획이라면 다음과 같은 답변이 마음에 들 것입니다.내 소프트웨어를 nix에서 패키징하거나 nixpkgs용 패키지 파생을 직접 작성하는 방법

짧은 버전

빠르고 지저분함: 이 steam-run설치되어 있는지 확인하세요(이상한 이름, Steam과 아무 관련이 없음). 예를 들어 nix-shell -p steam-run다음과 같습니다.

$ steam-run ./your-binary

이 답변을 작성한 이후 스팀 실행에 대한 다른 대안이 개발되었습니다. 예를 들어 nix-ld이제 NixO의 일부입니다(기본적으로 누락된 로더를 재생성합니다 /lib... I매우한 번만 구성하는 것이 좋습니다. 이렇게 하면 더 이상 패치되지 않은 바이너리 실행에 신경 쓸 필요가 없으므로 두통 없이 NPM 등을 사용할 수 있습니다.

(경고: 최근 nix 업데이트 이후로 , programs.nix-ld.enable = true;변수는 다음을 사용하여 구성할 수 있습니다.

programs.nix-ld.enable = true;
## If needed, you can add missing libraries here. nix-index-database is your friend to
## find the name of the package from the error message:
## https://github.com/nix-community/nix-index-database
programs.nix-ld.libraries = options.programs.nix-ld.libraries.default ++ (with pkgs; [ yourlibrary ]);

환경 변수를 자동으로 설정하려면 아래 코드가 레거시 시스템에서도 작동해야 하므로 여기에서 설명하겠습니다. 최근 테스트하지 않고 환경 변수가 올바르게 설정되었는지 확인하려면 재부팅해야 할 수도 있습니다.

  programs.nix-ld.enable = true;
  environment.variables = {
      NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
        stdenv.cc.cc
        openssl
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        libGL
        libva
        pipewire.lib
        xorg.libxcb
        xorg.libXdamage
        xorg.libxshmfence
        xorg.libXxf86vm
        libelf
        
        # Required
        glib
        gtk2
        bzip2
        
        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        gnome2.GConf
        nspr
        nss
        cups
        libcap
        SDL2
        libusb1
        dbus-glib
        ffmpeg
        # Only libraries are needed from those two
        libudev0-shim
        
        # Verified games requirements
        xorg.libXt
        xorg.libXmu
        libogg
        libvorbis
        SDL
        SDL2_image
        glew110
        libidn
        tbb
        
        # Other things from runtime
        flac
        freeglut
        libjpeg
        libpng
        libpng12
        libsamplerate
        libmikmod
        libtheora
        libtiff
        pixman
        speex
        SDL_image
        SDL_ttf
        SDL_mixer
        SDL2_ttf
        SDL2_mixer
        libappindicator-gtk2
        libdbusmenu-gtk2
        libindicator-gtk2
        libcaca
        libcanberra
        libgcrypt
        libvpx
        librsvg
        xorg.libXft
        libvdpau
        gnome2.pango
        cairo
        atk
        gdk-pixbuf
        fontconfig
        freetype
        dbus
        alsaLib
        expat
        # Needed for electron
        libdrm
        mesa
        libxkbcommon
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };  

도 있습니다닉스-외계인/닉스-아우토반또한 누락된 라이브러리를 자동으로 추가하려고 시도합니다. 마지막으로 사용할 수 있습니다디스트로박스이는 호스트와 긴밀하게 통합된 docker/podman 컨테이너에서 배포를 제공하지만 내 경험에 따르면 nix-ld진정으로 투명한 것을 사용하는 것이 더 복잡합니다.

여기에는 다양한 방법과 함께 더 길고 더 자세한 설명이 있으며 종종 덜 더러운 경우도 있습니다.

긴 버전

다음은 몇 가지 방법입니다(대부분의 경우 적절한 파생어를 작성하는 것이 더 좋기 때문에 수동 방법은 대부분 교육 목적으로 사용됩니다). 저는 전혀 전문가가 아니며, nix를 배우기 위해 이 목록도 작성했습니다. 더 좋은 방법이 있으면 알려주세요!

따라서 주요 문제는 실행 파일이 먼저 로더를 호출한 다음 작동하려면 일부 라이브러리가 필요하고 nixos는 로더와 라이브러리를 모두 /nix/store/.

이 목록에는 지금까지 찾은 모든 방법이 나와 있습니다. 기본적으로 세 가지 "그룹"이 있습니다.

  • 전체 매뉴얼: 교육 목적으로 흥미롭고 무슨 일이 일어나고 있는지 이해하기 위한 것이지만 그게 전부입니다. 나중에 가비지 수집되는 파생물을 막을 수 있는 것은 없기 때문에 실제로 사용하지 마십시오.
  • 패치 버전: 이 메서드는 실행 파일을 수정하려고 시도합니다(autoPatchelfHook과 함께 권장 방법 4를 사용할 때 자동으로). 좋은 라이브러리를 직접 가리킵니다.
  • 기본적으로 "일반 Linux"를 가짜로 만드는 FHS 기반 방법입니다(패치 버전보다 실행하기가 더 무겁기 때문에 가능하면 피해야 합니다).

실제적이고 적절한 설정을 위해 방법 4를 권장하며 autoPatchelfHook, 시간이 없고 바이너리를 한 줄로 실행하고 싶다면 다음을 기반으로 하는 빠르고 더러운 솔루션에 관심이 있을 수 있습니다. steam-run방법 7 ).

방법 1) 더러운 수동 방법, 패치 없음

먼저 다음과 같은 로더를 찾아야 합니다 file.

$ file wolframscript
wolframscript: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.18, BuildID[sha1]=079684175aa38e3633b60544681b338c0e8831e0, stripped

여기서 로더는 /lib64/ld-linux-x86-64.so.2. nixos 로더를 찾으려면 다음을 수행하십시오.

$ ls /nix/store/*glibc*/lib/ld-linux-x86-64.so.2
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2

ldd또한 예를 들어 또는 를 사용하여 프로그램에 필요한 라이브러리를 찾아야 합니다 LD_DEBUG=libs.

$ ldd wolframscript
        linux-vdso.so.1 (0x00007ffe8fff9000)
        libpthread.so.0 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libpthread.so.0 (0x00007f86aa321000)
        librt.so.1 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/librt.so.1 (0x00007f86aa317000)
        libdl.so.2 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libdl.so.2 (0x00007f86aa312000)
        libstdc++.so.6 => not found
        libm.so.6 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libm.so.6 (0x00007f86aa17c000)
        libgcc_s.so.1 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libgcc_s.so.1 (0x00007f86a9f66000)
        libc.so.6 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/libc.so.6 (0x00007f86a9dae000)
        /lib64/ld-linux-x86-64.so.2 => /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib64/ld-linux-x86-64.so.2 (0x00007f86aa344000)

여기서는 를 제외한 대부분의 라이브러리가 발견되는 것을 볼 수 있습니다 libstdc++.so.6. 그럼 찾아보자! 이를 찾는 첫 번째 빠르고 더러운 방법은 시스템에 이미 존재하는지 확인하는 것입니다.

$ find /nix/store -name libstdc++.so.6
/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/libstdc++.so.6

라이브러리가 아직 설치되지 않은 경우에는 더 복잡한 라이브러리를 사용하는 것이 좋습니다.nix-index훨씬 더 큰 데이터베이스에서 이러한 파일을 검색하는 프로그램입니다(hydra에게 감사드립니다). 이를 위해 먼저 nix-index데이터베이스를 설치하고 생성합니다(처음에만 필요하지만 실행하는 데 몇 분 정도 걸릴 수 있습니다).

$ nix-index

nix run github:mic92/nix-index-database yourlib( 데이터베이스를 로컬에서 다시 만드는 것을 방지하기 위해 nix-index-update사용할 수도 있습니다 .닉스-외계인캐시를 자동으로 다운로드하려면nix-색인-데이터베이스) 그런 다음 라이브러리를 검색하려면 다음과 같은 작업을 수행할 수 있습니다( --top-level일부 항목이 제거됨).

$ nix-locate lib/libstdc++.so.6 --top-level
gcc-unwrapped.lib                                     0 s /nix/store/7fv9v6mnlkb4ddf9kz1snknbvbfbcbx0-gcc-10.3.0-lib/lib/libstdc++.so.6

그런 다음 이 빠르고 간단한 예제를 위해 이러한 라이브러리를 설치할 수 있습니다(나중에 더 나은 솔루션을 보게 될 것입니다).

좋은. 이제 LD_LIBRARY_PATH이 파일을 가리키도록 구성된 프로그램을 실행하고( makeLibraryPath파생에서 이 문자열을 생성하는 방법도 참조) 이 파일의 첫 번째 단계에서 결정한 로더를 호출하면 됩니다.

LD_LIBRARY_PATH=/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/:$LD_LIBRARY_PATH /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 ./wolframscript

(스크립트 이름 앞에 반드시 사용하고 ./, 라이브러리의 디렉터리만 유지해야 합니다. 라이브러리가 여러 개인 경우 경로를 콜론으로 연결하면 됩니다.)

방법 2) 패치를 이용한 Dirty 수동 방법

를 설치한 후( 와 함께 nixenv -i또는 에서 configuration.nix) patchelf실행 파일을 직접 수정하여 좋은 로더와 라이브러리를 압축할 수도 있습니다. 로더를 변경하려면 다음을 실행하세요.

patchelf --set-interpreter /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 wolframscript

그리고 확인하려면:

$ patchelf --print-interpreter wolframscript
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.

실행 파일에 하드코딩된 라이브러리의 경로를 변경하려면 먼저 현재 rpath가 무엇인지 확인하세요(비어 있음).

$ patchelf --print-rpath wolframscript

이전에 결정한 라이브러리 경로에 추가하고 결국 콜론으로 구분합니다.

$ patchelf --set-rpath /nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/ wolframscript
$ ./wolframscript

방법 3) nix 파생 패치

우리는 다음에서 영감을 받은 nix 파생에서 거의 동일한 것을 재현할 수 있습니다.스카이프포리눅스

이 예에서는 다음 중 하나를 사용할 수 있는 대안도 제공합니다.

patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true

("수동" 방법을 이해하면 매우 명확해집니다) 또는

patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true

이 두 번째 방법은 좀 더 미묘하지만 다음을 실행하면:

$ nix-shell '<nixpkgs>' -A hello --run 'echo $NIX_CC/nix-support/dynamic-linker "->" $(cat $NIX_CC/nix-support/dynamic-linker)'
/nix/store/8zfm4i1aw4c3l5n6ay311ds6l8vd9983-gcc-wrapper-7.4.0/nix-support/dynamic-linker -> /nix/store/sw54ph775lw7b9g4hlfvpx6fmlvdy8qi-glibc-2.27/lib/ld-linux-x86-64.so.2

파일에 $NIX_CC/nix-support/dynamic-linker로더에 대한 경로가 포함되어 있음 을 알 수 있습니다 ld-linux-x86-64.so.2.

를 넣으면 derivation.nix이것이다.

{ stdenv, dpkg,glibc, gcc-unwrapped }:
let

  # Please keep the version x.y.0.z and do not update to x.y.76.z because the
  # source of the latter disappears much faster.
  version = "12.0.0";

  rpath = stdenv.lib.makeLibraryPath [
    gcc-unwrapped
    glibc
  ];
  # What is it for?
  # + ":${stdenv.cc.cc.lib}/lib64";

  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

in stdenv.mkDerivation {
  name = "wolframscript-${version}";

  system = "x86_64-linux";

  inherit src;

  nativeBuildInputs = [
  ];

  buildInputs = [ dpkg ];

  unpackPhase = "true";

  # Extract and copy executable in $out/bin
  installPhase = ''
    mkdir -p $out
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/* $out
    rm -rf $out/opt
  '';

  postFixup = ''
    # Why does the following works?
    patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true
    # or
    # patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true
    patchelf --set-rpath ${rpath} "$out/bin/wolframscript" || true
  '';

  meta = with stdenv.lib; {
    description = "Wolframscript";
    homepage = https://www.wolfram.com/wolframscript/;
    license = licenses.unfree;
    maintainers = with stdenv.lib.maintainers; [ ];
    platforms = [ "x86_64-linux" ];
  };
}

그리고 default.nix넣어 :

{ pkgs ? import <nixpkgs> {} }:

pkgs.callPackage ./derivation.nix {}

다음으로 컴파일하고 실행하세요.

nix-build
result/bin/wolframscript

방법 4) autoPatchElf 사용: 더 간단함

이전의 모든 방법에는 약간의 작업이 필요합니다(실행 파일을 찾아서 패치해야 합니다...). NixOs는 autoPatchelfHook모든 것을 자동으로 패치하는 특별한 "후크"를 제공했습니다 ! 에 지정하기만 하면 (native)BuildInputsnix가 마법을 수행합니다.

{ stdenv, dpkg, glibc, gcc-unwrapped, autoPatchelfHook }:
let

  # Please keep the version x.y.0.z and do not update to x.y.76.z because the
  # source of the latter disappears much faster.
  version = "12.0.0";

  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

in stdenv.mkDerivation {
  name = "wolframscript-${version}";

  system = "x86_64-linux";

  inherit src;

  # Required for compilation
  nativeBuildInputs = [
    autoPatchelfHook # Automatically setup the loader, and do the magic
    dpkg
  ];

  # Required at running time
  buildInputs = [
    glibc
    gcc-unwrapped
  ];

  unpackPhase = "true";

  # Extract and copy executable in $out/bin
  installPhase = ''
    mkdir -p $out
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/* $out
    rm -rf $out/opt
  '';

  meta = with stdenv.lib; {
    description = "Wolframscript";
    homepage = https://www.wolfram.com/wolframscript/;
    license = licenses.mit;
    maintainers = with stdenv.lib.maintainers; [ ];
    platforms = [ "x86_64-linux" ];
  };
}

방법 5) FHS를 사용하여 클래식 Linux 셸을 시뮬레이션하고 파일을 수동으로 실행합니다.

일부 소프트웨어는 패키지에 크게 의존하기 때문에 그런 식으로 패키징하기 어려울 수 있습니다.FHS파일 트리 구조를 확인하거나 바이너리가 변경되지 않았는지 확인할 수 있습니다. 그런 다음 사용할 수도 있습니다buildFHSUserEnv애플리케이션에 FHS 파일 구조(네임스페이스를 사용하여 경량)를 제공합니다.이 방법은 패치 기반 방법보다 무겁고 상당한 시작 시간을 추가하므로 가능하면 사용하지 마십시오.

쉘을 생성한 다음 수동으로 아카이브를 추출하고 파일을 실행하거나 FHS용 프로그램을 직접 패키지할 수 있습니다. 먼저 껍질을 얻는 방법을 살펴 보겠습니다. fhs-env.nix다음을 파일(예: )에 넣으세요 .

let nixpkgs = import <nixpkgs> {};
in nixpkgs.buildFHSUserEnv {
   name = "fhs";
   targetPkgs = pkgs: [];
   multiPkgs = pkgs: [ pkgs.dpkg ];
   runScript = "bash";
}

그리고 다음을 실행하세요:

nix-build fhs-env.nix
result/bin/fhs

그러면 보다 표준적인 Linux에서 bash를 얻을 수 있으며 다음과 같은 명령을 실행하여 실행 파일을 실행할 수 있습니다.

mkdir wolf_fhs/
dpkg -x WolframScript_12.0.0_LINUX64_amd64.deb wolf_fhs/
cd wolf_fhs/opt/Wolfram/WolframScript/bin/
./wolfram

multiPkgs종속성으로 더 많은 라이브러리/프로그램이 필요한 경우 (지원되는 모든 아치에 대해) 또는 targetPkgs(현재 아치에만 해당) 에 추가하세요 .

보너스: 특정 파일을 만들지 않고도 한 줄 명령으로 fhs 쉘을 시작할 수도 있습니다.

nix-build -E '(import <nixpkgs> {}).buildFHSUserEnv {name = "fhs";}' && ./result/bin/fhs

방법 6) FHS를 사용하여 클래식 Linux 셸을 시뮬레이션하고 내부에 파일을 압축합니다.

원천:https://reflexivereflection.com/posts/2015-02-28-deb-installation-nixos.html

방법 7) 스팀런

많은 소프트웨어를 실행할 수 있지만 buildFHSUserEnv필요한 모든 라이브러리를 수동으로 지정해야 합니다. 빠른 해결책을 원하고 필요한 라이브러리가 무엇인지 정확하게 확인할 시간이 없다면 시도해 볼 수도 있습니다 steam-run(이름에도 불구하고 Steam과 직접 연결되지 않고 단지 많은 라이브러리가 포함되어 있습니다). buildFHSUserEnv사전 설치된 많은 공통 라이브러리와 같습니다 (그 중 일부는 steamrtNvidia 코드가 포함된 것처럼 무료가 아닐 수도 있습니다. 감사합니다 심슨!). 이를 사용하려면 를 설치한 steam-run후 다음을 수행하십시오.

steam-run ./wolframscript

또는 전체 쉘을 원하는 경우:

steam-run bash

nixpkgs.config.allowUnfree = true;추가 (또는 허용 목록) 해야 할 수도 있습니다.이 특정 패키지) 로 설치하려면 을 nixos-rebuild, / 로 실행/설치하려면 를 nix-shell입력 해야 nix-env합니다 .{ allowUnfree = true; }~/.config/nixpkgs/config.nix

패키지나 라이브러리를 nix-shell에 "덮어쓰기"는 쉽지 않지만 스크립트 주위에 래퍼를 만들려면 수동으로 래퍼 스크립트를 만들 수 있습니다.

#!/usr/bin/env nix-shell
#!nix-shell -i bash -p steam-run
exec steam-run ./wolframscript "$@"

또는 nixos 파생에 직접 작성하십시오.

{ stdenv, steam-run, writeScriptBin }:
let
  src = ./opt/Wolfram/WolframScript/bin/wolframscript;
in writeScriptBin "wolf_wrapped_steam" ''
    exec ${steam-run}/bin/steam-run ${src} "$@"
  ''

또는 .deb에서 시작하는 경우(여기서 makeWrapper대신 사용함):

{ stdenv, steam-run, dpkg, writeScriptBin, makeWrapper }:
stdenv.mkDerivation {
  name = "wolframscript";
  src = ./WolframScript_12.0.0_LINUX64_amd64.deb;

  nativeBuildInputs = [
    dpkg makeWrapper
  ];
  unpackPhase = "true";
  installPhase = ''
    mkdir -p $out/bin
    dpkg -x $src $out
    cp -av $out/opt/Wolfram/WolframScript/bin/wolframscript $out/bin/.wolframscript-unwrapped
    makeWrapper ${steam-run}/bin/steam-run $out/bin/wolframscript --add-flags $out/bin/.wolframscript-unwrapped
    rm -rf $out/opt
  '';
}

(평상시 작성하기 너무 피곤하시면 default.nix직접 실행하셔도 됩니다 nix-build -E "with import <nixpkgs> {}; callPackage ./derivation.nix {}")

방법 8) 사용nix-ld

Steam 실행에서 했던 것처럼 샌드박스를 생성하고 싶지 않은 경우(샌드박스에서는 setuid 앱을 실행할 수 없으며 샌드박스를 중첩할 수 없으며 direnv가 포함된 시스템 패키지와의 통합이 좋지 않음) 누락된 로더 시스템을 다시 만들 수 있습니다. -wide에 다음을 입력하면 됩니다 configuration.nix.

  programs.nix-ld.enable = true;

이제 파일이 존재하는 것을 확인할 수 있습니다.

$ ls /lib64/
ld-linux-x86-64.so.2

그러나 새 ld-linux-x86-64.so.2파일은 로더로만 리디렉션되므로 바이너리를 실행하는 것은 여전히 ​​불가능합니다 NIX_LD(이렇게 하면 여러 프로그램이 동일한 시스템에 있는 동안 서로 다른 로더를 사용할 수 있습니다).

$ ./blender 
cannot execute ./blender: NIX_LD or NIX_LD_x86_64-linux is not set

이 환경 변수를 로컬에서 생성하려면 다음과 같이 할 수 있습니다.

$ cat shell.nix 
with import <nixpkgs> {};
mkShell {
  NIX_LD_LIBRARY_PATH = lib.makeLibraryPath [
    stdenv.cc.cc
    openssl
    # ...
  ];
  NIX_LD = lib.fileContents "${stdenv.cc}/nix-support/dynamic-linker";
}

$ nix-shell 

[nix-shell:/tmp/blender-3.2.2-linux-x64]$ ./blender

또는 다음을 사용하여 시스템 전체에서:

(경고: 최근 nix 업데이트 이후로 환경 변수 대신 programs.nix-ld.enable = true;를 사용하여 변수를 구성할 수 있지만 programs.nix-ld.libraries = with pkgs; [];아래 코드는 레거시 시스템에서도 작동하므로 여기에서 설명하겠습니다.)

  environment.variables = {
      NIX_LD_LIBRARY_PATH = lib.makeLibraryPath [
        pkgs.stdenv.cc.cc
        pkgs.openssl
        # ...
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };

참고하세요재시작이 파일을 변경하거나 다음을 수행할 때마다 X11 세션이 수행됩니다.

$ cat /etc/profile | grep set-environment
. /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
$ . /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment

(와 반대로 steam-run) nix-ld에는 기본적으로 어떤 라이브러리도 포함되어 있지 않습니다. (실제로는 더 이상 사실이 아닙니다. 기본 목록과 함께 보다 현대적인 인터페이스를 사용하려면 이 파일 상단의 참고 사항을 참조하세요. 그러나 목록은 매우 작습니다.) 하지만 직접 추가하거나 도구를 사용하여 자동으로 수행할 수 있습니다. 아래를 참조하세요. 여기에서 Steam 실행 팩을 제공하는 라이브러리 목록에서 영감을 얻을 수도 있습니다.https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nix예를 들어 제가 지금 사용하고 있는 파일은 blender/electron을 실행하는 데 충분합니다.

  programs.nix-ld.enable = true;
  environment.variables = {
      NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
        stdenv.cc.cc
        openssl
        xorg.libXcomposite
        xorg.libXtst
        xorg.libXrandr
        xorg.libXext
        xorg.libX11
        xorg.libXfixes
        libGL
        libva
        pipewire.lib
        xorg.libxcb
        xorg.libXdamage
        xorg.libxshmfence
        xorg.libXxf86vm
        libelf
        
        # Required
        glib
        gtk2
        bzip2
        
        # Without these it silently fails
        xorg.libXinerama
        xorg.libXcursor
        xorg.libXrender
        xorg.libXScrnSaver
        xorg.libXi
        xorg.libSM
        xorg.libICE
        gnome2.GConf
        nspr
        nss
        cups
        libcap
        SDL2
        libusb1
        dbus-glib
        ffmpeg
        # Only libraries are needed from those two
        libudev0-shim
        
        # Verified games requirements
        xorg.libXt
        xorg.libXmu
        libogg
        libvorbis
        SDL
        SDL2_image
        glew110
        libidn
        tbb
        
        # Other things from runtime
        flac
        freeglut
        libjpeg
        libpng
        libpng12
        libsamplerate
        libmikmod
        libtheora
        libtiff
        pixman
        speex
        SDL_image
        SDL_ttf
        SDL_mixer
        SDL2_ttf
        SDL2_mixer
        libappindicator-gtk2
        libdbusmenu-gtk2
        libindicator-gtk2
        libcaca
        libcanberra
        libgcrypt
        libvpx
        librsvg
        xorg.libXft
        libvdpau
        gnome2.pango
        cairo
        atk
        gdk-pixbuf
        fontconfig
        freetype
        dbus
        alsaLib
        expat
        # Needed for electron
        libdrm
        mesa
        libxkbcommon
      ];
      NIX_LD = lib.fileContents "${pkgs.stdenv.cc}/nix-support/dynamic-linker";
  };  

또한 라이브러리 이름을 찾을 수도 있습니다(위 참조) nix-index. 당신은 또한 사용할 수 있습니다nix-외계인-ld또는닉스-아우토반자동으로 라이브러리를 찾아 로드합니다. 올바른 라이브러리가 없으면 다음과 같은 오류가 발생합니다.

$ ./blender
./blender: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory

다음을 사용하여 아직 사용할 수 없는 모든 라이브러리를 한 번에 볼 수 있습니다.

$ LD_LIBRARY_PATH=$NIX_LD_LIBRARY_PATH ldd turtl
        libpangocairo-1.0.so.0 => /nix/store/n9h110ffps25rdkkim5k802p3p5w476m-pango-1.50.6/lib/libpangocairo-1.0.so.0 (0x00007f02feb83000)
        libatk-1.0.so.0 => not found

방법 9) nix-alien

닉스-외계인적절한 라이브러리를 사용하여 FHS를 자동으로 구축합니다. 플레이크를 활성화한 경우(그렇지 않으면 단순히 바꾸기만 추가 nix run) nix --extra-experimental-features "nix-command flakes" run이 방법으로 간단하게 실행할 수 있습니다(nix-alien은 아직 2022년에 패키지되지 않았습니다).

nix run github:thiagokokada/nix-alien -- yourprogram

그런 다음 nix-index를 사용하여 라이브러리를 자동으로 찾아 확실하지 않은 경우 몇 가지 질문을 합니다(캐시됨). 여기에 이미지 설명을 입력하세요

OpenGl을 사용하는 프로그램은 다음을 사용해야 합니다.nixGl실행하려면(이것은 여기의 다른 방법에도 확실히 적용됩니다):

nix run --impure github:guibou/nixGL --override-input nixpkgs nixpkgs/nixos-21.11 -- nix run github:thiagokokada/nix-alien -- blender

nixos-21.11OpenGl 버전이 프로그램과 일치하도록 버전을 변경해야 할 수도 있습니다 .

자동으로 생성된 파일도 볼 수 있습니다(경로는 프로그램이 처음 실행될 때 제공됩니다).

$ cat /home/leo/.cache/nix-alien/87a5d119-f810-5222-9b47-4809257c60ec/fhs-env/default.nix
{ pkgs ? import <nixpkgs> { } }:

let
  inherit (pkgs) buildFHSUserEnv;
in
buildFHSUserEnv {
  name = "blender-fhs";
  targetPkgs = p: with p; [
    xorg.libX11.out
    xorg.libXfixes.out
    xorg.libXi.out
    xorg.libXrender.out
    xorg.libXxf86vm.out
    xorg_sys_opengl.out
  ];
  runScript = "/tmp/blender-3.2.2-linux-x64/blender";
}

nix-ld와 함께 작동하는 다른 버전도 참조하세요.닉스-아우토반.

방법 9) 컨테이너/Docker 사용(무거움)

할 것

참고로 프로젝트는디스트로박스원하는 배포판을 설치하는 호스트와 긴밀하게 통합된 새 컨테이너를 간단히 생성할 수 있습니다.

방법 10) flatpack/appimage에 의존

https://nixos.org/nixos/manual/index.html#module-services-Flatpak

appimage-run : musescore 등으로 테스트합니다.

출처 또는 예시

또한 패키징을 시작하려는 사람들을 위해 최근 비슷한 튜토리얼을 작성했습니다.여기.

관련 정보