NixOs 上で非 nixos 実行可能ファイルを実行するにはどのような方法がありますか? (たとえば、独自のバイナリなど) 手動の方法も知りたいです。
答え1
関連する回答
バイナリをパッケージ化して実行するだけでなく、パッケージ化する予定の場合は、次の私の他の回答が役立つかもしれません。ソフトウェアを nix でパッケージ化する方法、または nixpkgs 用の独自のパッケージ派生を作成する方法
短縮版
簡単に言うと、steam-run
がインストールされていることを確認します (奇妙な名前ですが、Steam とは何の関係もありません)。例nix-shell -p steam-run
:
$ steam-run ./your-binary
この回答の作成以来、蒸気実行に代わる他の代替手段が開発されてきました。たとえば、現在はNixOsの一部となっているもの(基本的には…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/
。
このリストには、私がこれまでに見つけたすべての方法が記載されています。基本的に 3 つの「グループ」があります。
- 完全なマニュアル: 教育目的や何が起こっているかを理解するのに興味深いものですが、それだけです (実際には使用しないでください。派生したものが後でガベージ コレクションされるのを防ぐことはできません)
- パッチを当てたバージョン: これらのメソッドは、実行可能ファイルを変更して (autoPatchelfHook を使用した推奨メソッド 4 を使用すると自動的に)、適切なライブラリを直接ポイントするようにします。
- FHS に基づく方法は、基本的に「通常の Linux」を偽装します (パッチを適用したバージョンよりも実行が重いため、可能であればこれを避ける必要があります)。
実際の適切なセットアップには方法 4 をお勧めします。時間がなく、バイナリを 1 行で実行したいだけの場合は、 (方法 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
データベースをインストールして生成します (これは最初の 1 回だけ必要ですが、実行には数分かかることがあります)。
$ 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) パッチを使ったダーティマニュアル法
をインストールした後 ( または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導出で再現することができます。Linux用スカイプ
この例では、代替案も示しており、次のいずれかを使用できます。
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
この 2 番目の方法は少し微妙ですが、次のように実行します。
$ 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)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ファイルツリー構造をチェックしたり、バイナリが変更されていないか確認したりすることもできます。ビルドFHSUserEnvアプリケーションに 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
(現在のアーキテクチャのみ) に追加するだけです。
ボーナス: 特定のファイルを作成せずに、1 行のコマンドで 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
ありがとう、シンプソン!)。これを使用するには、をインストールして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-run の場合のようにサンドボックスを生成したくない場合は (サンドボックスでは 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 がパックするライブラリのリストを参考にすることもできます。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 を自動的に構築します。flake が有効になっている場合 (そうでない場合は、置き換えを追加するだけ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 のバージョンがプログラムと一致するようにするには、のバージョンを変更する必要があることに注意してください。
自動的に生成されたファイルも確認できることに注意してください (パスはプログラムを初めて実行したときに指定されます)。
$ 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-prebuilt-binary-software-with.html
- https://github.com/NixOS/nixpkgs/blob/35c3396f41ec73c5e968a11f46d79a94db4042d7/pkgs/applications/networking/dropbox/default.nix
また、パッケージングを始めたい人のために、最近同様のチュートリアルを書きました。ここ。