Hi!
So I’m making a nixOS module to run a systemd service that runs a python script, but python needs to have the package frida installed so it can import frida
.
I’m getting the package frida from this flake: frida = (builtins.getFlake "github:itstarsun/frida-nix").packages.x86_64-linux.frida-tools;
and it works well in building this repo:
frida = (builtins.getFlake "github:itstarsun/frida-nix").packages.x86_64-linux.frida-tools;
vgpu_unlock = pkgs.stdenv.mkDerivation {
name = "nvidia-vgpu-unlock";
version = "unstable-2021-04-22";
src = pkgs.fetchFromGitHub {
owner = "DualCoder";
repo = "vgpu_unlock";
rev = "1888236c75d8eac673695be8b000f0b065111c51";
sha256 = "0s8bmscb8irj1sggfg1fhacqd1lh59l326bnrk4a2g4qngsbkix3";
};
buildInputs = [ frida /*pkgs.python2 my-python*/ ];
shellHook = ''
echo ${frida}
'';
postPatch = ''
echo ${frida}
${pkgs.python3}/bin/python --version
${pkgs.unixtools.util-linux}/bin/whereis python
env | grep PYTHON
${pkgs.python3}/bin/python --version
${pkgs.python3}/bin/python -c "import frida" && echo "frida is installed" || echo "frida is not installed"
substituteInPlace vgpu_unlock \
--replace /bin/bash ${pkgs.bash}/bin/bash
'';
installPhase = "install -Dm755 vgpu_unlock $out/bin/vgpu_unlock";
};
inside postPatch
it has a lot of environment variables that make it point to the right python packages:
_PYTHON_HOST_PLATFORM=linux-x86_64
PYTHONNOUSERSITE=1
PYTHONHASHSEED=0
_PYTHON_SYSCONFIGDATA_NAME=_sysconfigdata__linux_x86_64-linux-gnu
PYTHONPATH=/nix/store/sb4a338qh7wld75zbcgrylrpqmjnfh27-python3.10-frida-tools-12.1.1/lib/python3.10/site-packages:/nix/store/ndr7x7qhkssarrgjpqqnv8i9py4vyc9c-python3.10-colorama-0.4.6/lib/python3.10/site-packages:/nix/store/fdqpyj613dr0v1l1lrzqhzay7sk4xg87-python3-3.10.10/lib/python3.10/site-packages:/nix/store/lz6vq2kp7rww3jj6f7zgf4n50c3qvc83-python3.10-frida-16.0.18/lib/python3.10/site-packages:/nix/store/k7xyj5b5dw0cna25b91ygqskkwv8na4s-python3.10-typing-extensions-4.5.0/lib/python3.10/site-packages:/nix/store/pf9j3spzhbz7gvmbyk6a5kwcmi7zvpmy-python3.10-prompt-toolkit-3.0.38/lib/python3.10/site-packages:/nix/store/hix271phwzb157a2sj9fn5zfmkpz8zpd-python3.10-six-1.16.0/lib/python3.10/site-packages:/nix/store/khqw9ph04dvjy86rlzxzhyk21c2binhi-python3.10-wcwidth-0.2.6/lib/python3.10/site-packages:/nix/store/fpcah4a88pjj7jmwhrcvfb9kg6qj58vc-python3.10-setuptools-67.4.0/lib/python3.10/site-packages:/nix/store/asf94iynbzxraqzmbi2w69vj3khaphan-python3.10-pygments-2.14.0/lib/python3.10/site-packages:/nix/store/d8ghysrcn5nsyh9w3gvwg5kk1iyy510r-python3.10-docutils-0.19/lib/python3.10/site-packages
env | grep PYTHON
Python 3.10.11
frida is installed
I’m assuming that’s something buildInputs
does behind the scenes.
Now, how do I do that behind the scenes thing in my systemd service:
systemd.services.nvidia-vgpud = {
description = "NVIDIA vGPU Daemon";
wants = [ "syslog.target" ];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "forking";
ExecStart = "${pkgs.python3}/bin/python ${lib.optionalString cfg.unlock.enable "${vgpu_unlock}/bin/vgpu_unlock "}${lib.getBin config.hardware.nvidia.package}/bin/nvidia-vgpud";
ExecStopPost = "${pkgs.coreutils}/bin/rm -rf /var/run/nvidia-vgpud";
Environment = [ "__RM_NO_VERSION_CHECK=1" "PYTHONPATH=/nix/store/sb4a338qh7wld75zbcgrylrpqmjnfh27-python3.10-frida-tools-12.1.1/lib/python3.10/site-packages:/nix/store/ndr7x7qhkssarrgjpqqnv8i9py4vyc9c-python3.10-colorama-0.4.6/lib/python3.10/site-packages:/nix/store/fdqpyj613dr0v1l1lrzqhzay7sk4xg87-python3-3.10.10/lib/python3.10/site-packages:/nix/store/lz6vq2kp7rww3jj6f7zgf4n50c3qvc83-python3.10-frida-16.0.18/lib/python3.10/site-packages:/nix/store/k7xyj5b5dw0cna25b91ygqskkwv8na4s-python3.10-typing-extensions-4.5.0/lib/python3.10/site-packages:/nix/store/pf9j3spzhbz7gvmbyk6a5kwcmi7zvpmy-python3.10-prompt-toolkit-3.0.38/lib/python3.10/site-packages:/nix/store/hix271phwzb157a2sj9fn5zfmkpz8zpd-python3.10-six-1.16.0/lib/python3.10/site-packages:/nix/store/khqw9ph04dvjy86rlzxzhyk21c2binhi-python3.10-wcwidth-0.2.6/lib/python3.10/site-packages:/nix/store/fpcah4a88pjj7jmwhrcvfb9kg6qj58vc-python3.10-setuptools-67.4.0/lib/python3.10/site-packages:/nix/store/asf94iynbzxraqzmbi2w69vj3khaphan-python3.10-pygments-2.14.0/lib/python3.10/site-packages:/nix/store/d8ghysrcn5nsyh9w3gvwg5kk1iyy510r-python3.10-docutils-0.19/lib/python3.10/site-packages" ]; # Avoids issue with API version incompatibility when merging host/client drivers
};
};
(the ${lib.optionalString cfg.unlock.enable "${vgpu_unlock}/bin/vgpu_unlock "}
is a python script)
right now I’m hard coding the PYTHONPATH in the Environment variables of the service and it’s working, but as soon as the paths change that won’t work anymore.
Thanks in advance
The whole code can be found in this repo: GitHub - Yeshey/nixos-nvidia-vgpu_nixOS: NixOS NVIDIA vGPU Module