NixO에서 nixos가 아닌 실행 파일을 실행하는 다른 방법은 무엇입니까? (예: 독점 바이너리.) 수동 접근 방식도 보고 싶습니다.
답변1
관련 답변
바이너리를 실행하는 대신 패키징할 계획이라면 다음 답변이 마음에 들 것입니다.내 소프트웨어를 nix에서 패키징하거나 nixpkgs용 패키지 포크를 직접 작성하는 방법
간결한 버전
빠르고 지저분합니다. steam-run
설치되었는지 확인하세요(이상한 이름, Steam과 아무 관련 없음). 예를 들어 nix-shell -p steam-run
다음과 같습니다.
$ steam-run ./your-binary
이 답변이 작성된 이후 스팀 실행에 대한 다른 대안이 개발되었습니다. 예를 들어 이제 NixO의 일부입니다(기본적으로 nix-ld
손실된 로더를 다시 생성...)./lib
고도로더 이상 패치되지 않은 바이너리 실행에 대해 걱정할 필요가 없도록 한 번에 구성하는 것이 좋습니다. 그러면 두통 없이 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를 사용하는 것이 좋습니다. 시간이 부족하고 바이너리를 한 줄로 실행하려는 경우 (방법 7)을 autoPatchelfHook
기반으로 한 작업을 수행할 수 있습니다 .steam-run
방법 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 사용: 더 쉬움
이전의 모든 방법에는 약간의 작업이 필요합니다(실행 파일을 찾고 패치해야 합니다...). NixO는 autoPatchelfHook
모든 것을 자동으로 패치하는 특별한 "후크"를 만들었습니다 ! 그냥 지정하면 (native)BuildInputs
nix가 그 일을 할 것입니다.
{ 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
(그 중 일부는 Nvidia 코드 패키지처럼 무료가 아닐 수도 있습니다. steamrt
Simpson에게 감사드립니다!) 사용하려면 설치하고 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가 포함된 시스템 패키지와의 통합이 좋지 않음) 누락된 항목을 다시 생성할 수 있습니다. 로더 시스템 - 다음을 입력하여 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-run이 패키지로 제공하는 라이브러리 목록에서 영감을 얻을 수도 있습니다.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
. 당신은 또한 사용할 수 있습니다닉스 에일리언 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을 사용하는 프로그램은 다음을 사용해야 합니다.닉스GL실행(물론 여기의 다른 메서드에도 적용됩니다):
nix run --impure github:guibou/nixGL --override-input nixpkgs nixpkgs/nixos-21.11 -- nix run github:thiagokokada/nix-alien -- blender
nixos-21.11
OpenGl 버전이 프로그램과 일치하도록 하려면 OpenGl 버전을 변경해야 할 수도 있습니다 .
자동으로 생성된 파일도 볼 수 있습니다(경로는 프로그램이 처음 실행될 때 제공됩니다).
$ 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를 사용하여 테스트합니다.
소스 또는 예시
- https://github.com/NixOS/nixpkgs/blob/5a9eaf02ae3c6403ce6f23d33ae569be3f9ce644/pkgs/applications/video/lightworks/default.nix
- https://sandervanderburg.blogspot.com/2015/10/deploying-prebuild-binary-software-with.html
- https://github.com/NixOS/nixpkgs/blob/35c3396f41ec73c5e968a11f46d79a94db4042d7/pkgs/applications/networking/dropbox/default.nix
또한 패키징을 시작하고 싶은 분들을 위해 최근 비슷한 튜토리얼을 작성했습니다.여기.