¿Cuáles son los diferentes métodos para ejecutar un ejecutable que no sea de Nixos en NixOs? (Por ejemplo, binarios propietarios). Me gustaría ver también los métodos manuales.
Respuesta1
Respuestas relacionadas
Si planeas empaquetar un binario y no simplemente ejecutarlo, es posible que te guste esta otra respuesta mía:Cómo empaquetar mi software en nix o escribir mi propia derivación de paquete para nixpkgs
Version corta
Rápido y sucio: asegúrese de steam-run
que esté instalado (nombre extraño, no tiene nada que ver con Steam), por ejemplo nix-shell -p steam-run
, luego:
$ steam-run ./your-binary
Desde la creación de esta respuesta, se han desarrollado otras alternativas al funcionamiento a vapor, ver, por ejemplo, nix-ld
que ahora es parte de NixOs (que básicamente recrea los cargadores que faltan en /lib
... IaltamenteTe recomiendo que lo configures de una vez por todas, de esta manera ya no tendrás que preocuparte por ejecutar archivos binarios sin parches, para que puedas usar NPM, etc. sin dolores de cabeza):
(advertencia: desde la reciente actualización de nix, solo necesita programs.nix-ld.enable = true;
y las variables se pueden configurar usando
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 ]);
para configurar automáticamente las variables de entorno, pero el código siguiente debería funcionar también en sistemas heredados, así que lo dejaré aquí) Tenga en cuenta que es posible que también necesite reiniciar para asegurarse de que las variables de entorno estén configuradas correctamente y no se hayan probado recientemente.
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";
};
También haynix-alienígena/nix-autobahnque también intenta agregar automáticamente las bibliotecas que faltan. Finalmente puedes usarcaja de distribuciónque le proporciona cualquier distribución en un contenedor acoplable/podman estrechamente integrado con el host... pero según mi experiencia, es más complicado de usar que nix-ld
sea verdaderamente transparente.
Aquí tienes una explicación más larga y detallada, junto con varios métodos, a menudo menos sucios.
Versión larga
Aquí hay varios métodos (los manuales tienen principalmente fines educativos, ya que la mayoría de las veces es mejor escribir una derivación adecuada). No soy un experto en absoluto, e hice esta lista también para aprender nix, así que si tienes mejores métodos, ¡házmelo saber!
Entonces, el problema principal es que el ejecutable primero llama a un cargador y luego necesita algunas bibliotecas para funcionar, y nixos coloca tanto el cargador como las bibliotecas en /nix/store/
.
Esta lista proporciona todos los métodos que encontré hasta ahora. Básicamente existen tres "grupos":
- el manual completo: interesante para fines educativos y para entender lo que está pasando, pero eso es todo (no los uses en la práctica porque nada evitará que las derivaciones utilizadas sean recolectadas como basura más adelante)
- las versiones parcheadas: estos métodos intentan modificar el ejecutable (automáticamente cuando se utiliza el método recomendado 4 con autoPatchelfHook) para señalar directamente la biblioteca correcta
- los métodos basados en FHS, que básicamente simulan un "Linux normal" (más pesado de ejecutar que la versión parcheada, por lo que esto debe evitarse si es posible).
Recomendaría el método 4 autoPatchelfHook
para una configuración real y adecuada, y si no tiene tiempo y solo desea ejecutar un binario en una sola línea, es posible que le interese la solución rápida y sencilla basada en steam-run
(método 7 ).
Método 1) Método manual sucio, sin parche
Primero debes encontrar el cargador con, por ejemplo 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
Aquí está el cargador /lib64/ld-linux-x86-64.so.2
. Para encontrar el cargador de nixos, puedes hacer:
$ ls /nix/store/*glibc*/lib/ld-linux-x86-64.so.2
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2
También necesita buscar las bibliotecas que su programa requiere, por ejemplo con ldd
o 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)
Aquí verá que se encuentran la mayoría de las bibliotecas excepto libstdc++.so.6
. ¡Así que vamos a encontrarlos! Una primera forma rápida y sencilla de encontrarlos es comprobar si ya están presentes en su sistema:
$ find /nix/store -name libstdc++.so.6
/nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/libstdc++.so.6
En caso de que la biblioteca aún no esté instalada, seguramente preferirás utilizar la más complicada.nix-index
programa para buscar estos archivos en una base de datos mucho más grande (gracias hidra). Para eso, primero instale nix-index
y genere la base de datos (esto solo es necesario la primera vez, pero puede tardar unos minutos en ejecutarse):
$ nix-index
(También puede utilizarlo nix run github:mic92/nix-index-database yourlib
para evitar recrear la base de datos localmente. Consulte también nix-index-update
desdenix-alienígenapara descargar el caché automáticamente desdebase de datos de índice nix) luego, para buscar una biblioteca puedes hacer algo como (nota que --top-level
elimina algunas entradas):
$ 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
…
Luego puede instalar estas bibliotecas para este ejemplo rápido y sencillo (más adelante veremos mejores soluciones).
Bien. Ahora, solo necesitamos ejecutar el programa con el LD_LIBRARY_PATH
configurado para apuntar a este archivo (ver también makeLibraryPath
para generar esta cadena en una derivación) y llamar al cargador que determinamos en el primer paso en este archivo:
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
(Asegúrese de usarlo ./
antes del nombre del script y de mantener solo el directorio de las bibliotecas. Si tiene varias bibliotecas, simplemente use concat la ruta con dos puntos)
Método 2) Método manual sucio, con parche
Después de instalar (con nixenv -i
o en su configuration.nix
) patchelf
, también puede modificar directamente el ejecutable para empaquetar el buen cargador y las bibliotecas. Para cambiar el cargador simplemente ejecute:
patchelf --set-interpreter /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 wolframscript
y para comprobar:
$ patchelf --print-interpreter wolframscript
/nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.
y para cambiar la ruta a las bibliotecas codificadas en el ejecutable, primero verifique cuál es la ruta actual (vacía para mí):
$ patchelf --print-rpath wolframscript
y agréguelos a la ruta de la biblioteca que determinó antes, eventualmente separados por dos puntos:
$ patchelf --set-rpath /nix/store/12zhmzzhrwszdc8q3fwgifpwjkwi3mzc-gcc-7.3.0-lib/lib/ wolframscript
$ ./wolframscript
Método 3) Parche en una derivación nix
Podemos reproducir más o menos lo mismo en una derivación nix inspirada enskypeforlinux
Este ejemplo presenta también una alternativa, o puedes usar:
patchelf --set-interpreter ${glibc}/lib/ld-linux-x86-64.so.2 "$out/bin/wolframscript" || true
(que debería quedar bastante claro una vez que comprenda el método "manual"), o
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$out/bin/wolframscript" || true
Este segundo método es un poco más sutil, pero si ejecutas:
$ 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
Verá que el archivo $NIX_CC/nix-support/dynamic-linker
contiene una ruta al cargador ld-linux-x86-64.so.2
.
Ponlo derivation.nix
, esto es
{ 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" ];
};
}
y en default.nix
poner:
{ pkgs ? import <nixpkgs> {} }:
pkgs.callPackage ./derivation.nix {}
Compilar y ejecutar con
nix-build
result/bin/wolframscript
Método 4) Utilice autoPatchElf: más sencillo
Todos los métodos anteriores necesitan un poco de trabajo (necesitas encontrar los ejecutables, parchearlos...). ¡NixOs hizo para nosotros un "gancho" especial autoPatchelfHook
que parchea todo automáticamente por ti! Sólo necesitas especificarlo en (native)BuildInputs
y nix hace la magia.
{ 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" ];
};
}
Método 5) Utilice FHS para simular un shell de Linux clásico y ejecute los archivos manualmente
Algunos programas pueden ser difíciles de empaquetar de esa manera porque pueden depender en gran medida delFHSestructura de árbol de archivos, o puede verificar que los binarios no hayan cambiado. Luego también puedes usarbuildFHSUserEnvpara proporcionar una estructura de archivos FHS (ligera, que utiliza espacios de nombres) para su aplicación.Tenga en cuenta que este método es más pesado que los métodos basados en parches y agrega un tiempo de inicio significativo, así que evítelo cuando sea posible.
Puede simplemente generar un shell y luego extraer manualmente el archivo y ejecutarlo, o empaquetar directamente su programa para FHS. Primero veamos cómo conseguir un caparazón. Coloque en un archivo (digamos fhs-env.nix
) lo siguiente:
let nixpkgs = import <nixpkgs> {};
in nixpkgs.buildFHSUserEnv {
name = "fhs";
targetPkgs = pkgs: [];
multiPkgs = pkgs: [ pkgs.dpkg ];
runScript = "bash";
}
y correr:
nix-build fhs-env.nix
result/bin/fhs
Luego obtendrás un bash en un Linux de aspecto más estándar y podrás ejecutar comandos para ejecutar tu ejecutable, como:
mkdir wolf_fhs/
dpkg -x WolframScript_12.0.0_LINUX64_amd64.deb wolf_fhs/
cd wolf_fhs/opt/Wolfram/WolframScript/bin/
./wolfram
Si necesita más bibliotecas/programas como dependencias, simplemente agréguelos multiPkgs
(para todos los arcos compatibles) o targetPkgs
(solo para el arco actual).
Bonificación: también puedes iniciar un shell fhs con un comando de una línea, sin crear un archivo específico:
nix-build -E '(import <nixpkgs> {}).buildFHSUserEnv {name = "fhs";}' && ./result/bin/fhs
Método 6) Utilice FHS para simular un shell de Linux clásico y empaquete los archivos en su interior
fuente:https://reflexivereflection.com/posts/2015-02-28-deb-installation-nixos.html
Método 7) funcionamiento con vapor
Con buildFHSUserEnv
él puede ejecutar muchos softwares, pero deberá especificar manualmente todas las bibliotecas requeridas. Si desea una solución rápida y no tiene tiempo para comprobar con precisión cuáles son las bibliotecas necesarias, puede intentarlo steam-run
(a pesar del nombre, no está vinculado directamente con Steam y solo incluye muchas bibliotecas), que es como buildFHSUserEnv
con muchas bibliotecas comunes preinstaladas (algunas de ellas pueden no ser gratuitas, por ejemplo, steamrt
contienen código nvidia, ¡gracias Simpson!). Para usarlo, simplemente instálelo steam-run
y luego:
steam-run ./wolframscript
o si quieres un shell completo:
steam-run bash
Tenga en cuenta que es posible que deba agregar nixpkgs.config.allowUnfree = true;
(o incluir en la lista blanca)este paquete específico) si desea instalarlo con nixos-rebuild
, y si desea ejecutarlo/instalarlo con nix-shell
/ nix-env
debe { allowUnfree = true; }
ingresar ~/.config/nixpkgs/config.nix
.
No es fácil "sobrescribir" paquetes o bibliotecas en nix-shell, pero si desea crear un contenedor alrededor de su script, puede crear manualmente un script contenedor:
#!/usr/bin/env nix-shell
#!nix-shell -i bash -p steam-run
exec steam-run ./wolframscript "$@"
o escríbalo directamente en una derivación de nixos:
{ stdenv, steam-run, writeScriptBin }:
let
src = ./opt/Wolfram/WolframScript/bin/wolframscript;
in writeScriptBin "wolf_wrapped_steam" ''
exec ${steam-run}/bin/steam-run ${src} "$@"
''
o si comienzas desde .deb (aquí usé makeWrapper
en su lugar):
{ 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
'';
}
(Si estás demasiado cansado para escribir lo habitual default.nix
, puedes ejecutarlo directamente nix-build -E "with import <nixpkgs> {}; callPackage ./derivation.nix {}"
)
Método 8) Usandonix-ld
Si no desea generar un entorno de pruebas como lo hicimos para Steam-Run (en los entornos de pruebas es imposible ejecutar aplicaciones setuid, los entornos de pruebas no se pueden anidar, la integración deficiente con los paquetes del sistema incluye direnv), puede recrear el sistema de carga que falta -ancho poniendo en tu configuration.nix
:
programs.nix-ld.enable = true;
Puedes ver que el archivo ahora está presente:
$ ls /lib64/
ld-linux-x86-64.so.2
Sin embargo, todavía es imposible ejecutar archivos binarios ya que el nuevo ld-linux-x86-64.so.2
archivo solo se redirige al cargador NIX_LD
(de esta manera, varios programas pueden usar diferentes cargadores mientras están en el mismo sistema):
$ ./blender
cannot execute ./blender: NIX_LD or NIX_LD_x86_64-linux is not set
Para crear localmente esta variable de entorno, puede hacer algo como:
$ 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
o en todo el sistema usando:
(advertencia: desde la reciente actualización de Nix, solo necesita programs.nix-ld.enable = true;
, y las variables se pueden configurar usando programs.nix-ld.libraries = with pkgs; [];
en lugar de usar variables de entorno, pero el código siguiente debería funcionar también en sistemas heredados, así que lo dejaré aquí)
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";
};
Tenga en cuenta que necesitaReanudarsu sesión X11 cada vez que cambia este archivo o hace:
$ cat /etc/profile | grep set-environment
. /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
$ . /nix/store/clwf7wsykkjdhbd0v8vb94pvg81lnsba-set-environment
Tenga en cuenta que (a diferencia de steam-run
) nix-ld
no viene con ninguna biblioteca de forma predeterminada (en realidad, esto ya no es cierto; consulte la nota en la parte superior de este archivo para usar la interfaz más moderna con una lista predeterminada... pero la lista es bastante pequeña) pero puedes agregar el tuyo propio o usar herramientas para hacerlo automáticamente, ver más abajo. También puedes inspirarte con la lista de bibliotecas que ejecutan paquetes de Steam aquí:https://github.com/NixOS/nixpkgs/blob/master/pkgs/games/steam/fhsenv.nixAquí está, por ejemplo, el archivo que estoy usando por ahora, es suficiente para ejecutar 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";
};
También puede encontrar el nombre de las bibliotecas, ver arriba nix-index
. También puedes usarnix-alien-ldonix-autobahnpara buscar y cargar automáticamente las bibliotecas. Tenga en cuenta que si no tiene las bibliotecas adecuadas, obtendrá un error como
$ ./blender
./blender: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory
Puedes ver a la vez todas las bibliotecas que aún no están disponibles usando:
$ 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
…
Método 9) nix-alienígena
nix-alienígenaconstruye automáticamente un FHS con las bibliotecas apropiadas. Si tiene flake habilitado (de lo contrario, simplemente agregue reemplazar nix run
con nix --extra-experimental-features "nix-command flakes" run
), simplemente puede ejecutarlo de esta manera (nix-alien aún no está empaquetado en 2022)
nix run github:thiagokokada/nix-alien -- yourprogram
Luego encontrará automáticamente la biblioteca usando nix-index y le hará algunas preguntas cuando no esté seguro (esto está almacenado en caché).
Tenga en cuenta que los programas que dependen de openGl deben utilizarnixGlpara ejecutar (esto ciertamente se aplica a otros métodos aquí):
nix run --impure github:guibou/nixGL --override-input nixpkgs nixpkgs/nixos-21.11 -- nix run github:thiagokokada/nix-alien -- blender
Tenga en cuenta que es posible que deba cambiar la versión de nixos-21.11
para asegurarse de que la versión de openGl coincida con su programa.
Tenga en cuenta que también puede ver el archivo generado automáticamente (la ruta se proporciona la primera vez que se ejecuta el programa):
$ 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";
}
Vea también la otra versión que trabaja con nix-ld ynix-autobahn.
Método 9) Usar contenedores/Docker (más pesado)
HACER
Tenga en cuenta que el proyectocaja de distribuciónle permite crear simplemente nuevos contenedores estrechamente integrados con el host instalando cualquier distribución que desee.
Método 10) Confíe en flatpack/appimage
https://nixos.org/nixos/manual/index.html#module-services-flatpak
appimage-run: Para probar con, ex, musescore
Fuentes o ejemplos
- 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
Además, para las personas que quieran iniciarse en el empaquetado, escribí recientemente un tutorial similar.aquí.