Distributed build: Difference between revisions
imported>Lheckemann |
imported>Endgame Add troubleshooting section; document bug wrt distributing builds as a user on NixOS. |
||
Line 77: | Line 77: | ||
</nowiki>}} | </nowiki>}} | ||
{{Evaluate}} | {{Evaluate}} | ||
See the [https://nixos.org/nix/manual/#chap-distributed-builds Nix Manual] for the exact signification of each option. | See the [https://nixos.org/nix/manual/#chap-distributed-builds Nix Manual] for the exact signification of each option. | ||
Line 82: | Line 83: | ||
{{Expansion|untested}} | {{Expansion|untested}} | ||
The previous method should be rather easily adaptable: replace adding NixOS options by editing <code>/etc/nix/nix.conf</code>. | The previous method should be rather easily adaptable: replace adding NixOS options by editing <code>/etc/nix/nix.conf</code>. | ||
==== Note ==== | |||
Because of bug {{Issue|46038}}, you need to set <code>nix.distributedBuilds = true;</code> in <code>configuration.nix</code> ''even if'' you are triggering a distributed build via the command line. | |||
== Using remote builders == | == Using remote builders == | ||
Line 108: | Line 112: | ||
To know what features a derivation needs, you can run {{Commands|$ nix show-derivation /nix/store/hash-foo.drv | grep requiredSystemFeatures}} | To know what features a derivation needs, you can run {{Commands|$ nix show-derivation /nix/store/hash-foo.drv | grep requiredSystemFeatures}} | ||
== Troubleshooting == | |||
* How do I know if I'm distributing my build at all? | |||
** Run <code>nix build</code> with <code>--max-jobs 0</code>. | |||
* How do I know why my builds aren't being distributed? | |||
** Run <code>nix build -vvvvvvvvv 2>&1 | less</code> and search for <code>decline</code>. | |||
* I can <code>nix ping-store</code> but the build doesn't distribute. | |||
** If on NixOS, Check that <code>nix ping-store</code> command works when run as root. | |||
* I can ping the store as root, but I'm getting "broken pipe" errors when trying to distribute. | |||
** You may have hit bug {{Issue|46038}}. Add <code>nix.distributedBuilds = true;</code> to <code>configuration.nix</code> and <code>nixos-rebuild switch</code>. | |||
== See also == | == See also == |
Revision as of 08:52, 20 September 2018
Sometimes you want to use a faster machine for building a nix derivation you want to use on a slower one. If you have ssh access to a machine where Nix (not necessarily NixOS) is installed, then you can offload building to this machine.
There is a dedicated chapter in the Nix Manual.
This is a step by step guide to setting up distributed builds.
Prerequisites
First, log-in as the user which runs builds locally. If you are using a single user install, this means yourself, and if this is a
multi-user install, this means root
.
You must ensure you can run nix*
commands on the remote without user interaction and without any option on the ssh command line:
$ ssh builder nix-store --version
Here is a way to achieve this: First we configure how ssh should connect to our builder.
~/.ssh/config
Host builder
HostName 192.168.42.42
Port 1234
User foo
# any other fancy option needed to log in
# ProxyJump foo ...
# Prevent using ssh-agent or another keyfile, useful for testing
IdentitiesOnly yes
IdentityFile /root/.ssh/nix_remote
SSH connection must be non-interactive so we use a public key without a passphrase.
$ ssh-keygen -f ~/.ssh/nix_remote # do not add a passphrase to the ssh key! $ ssh-copy-id -i ~/.ssh/nix_remote builder
When you are done, you can test your setup like this:
$ nix ping-store --store ssh://builder
If you get an error like serialised integer ... is too big for type j
this means that something (/etc/profile
for example) outputs bytes to stdout
before launching the command specified on the ssh
command line. Either disable this behavior or have the output be sent to stderr
instead.
Single user install
See the Nix Manual and the option --builders
.
Multi-User install
We must configure the nix-daemon
to use our builder. Options like --builders
on the command line is ignored unless your user is in the trusted user list.
NixOS
There are a few NixOS options we can use:
/etc/nixos/configuration.nix
{ config, pkgs, ... }:
{
nix.buildMachines = [ {
hostName = "builder";
system = "x86_64-linux";
maxJobs = 1;
speedFactor = 2;
supportedFeatures = [ ];
mandatoryFeatures = [ ];
}] ;
nix.distributedBuilds = true;
# optional, useful when the builder has a faster internet connection than yours
nix.extraOptions = ''
builders-use-substitutes = true
'';
}
See the Nix Manual for the exact signification of each option.
Non NixOS
The previous method should be rather easily adaptable: replace adding NixOS options by editing /etc/nix/nix.conf
.
Note
Because of bug #46038, you need to set nix.distributedBuilds = true;
in configuration.nix
even if you are triggering a distributed build via the command line.
Using remote builders
Local builder
Your local machine is still a builder, notably when connecting to remote builders fails, nix will fallback to building locally.
To never use the local machine set the max-jobs
nix option to 0
$ nix-build -j0 blah
Features
Each builder is declared with a set of supportedFeatures
.
When a builder lacks one of the requiredSystemFeatures
of a derivation, it will be ignored. Here are some features used in nixpkgs:
Feature | Derivations requiring it |
---|---|
kvm
|
Everything which builds inside a vm, like NixOS tests |
nixos-test
|
NixOS tests |
big-parallel
|
kernel config, libreoffice, evolution and chromium. |
To know what features a derivation needs, you can run
$ nix show-derivation /nix/store/hash-foo.drv
Troubleshooting
- How do I know if I'm distributing my build at all?
- Run
nix build
with--max-jobs 0
.
- Run
- How do I know why my builds aren't being distributed?
- Run
nix build -vvvvvvvvv 2>&1 | less
and search fordecline
.
- Run
- I can
nix ping-store
but the build doesn't distribute.- If on NixOS, Check that
nix ping-store
command works when run as root.
- If on NixOS, Check that
- I can ping the store as root, but I'm getting "broken pipe" errors when trying to distribute.
- You may have hit bug #46038. Add
nix.distributedBuilds = true;
toconfiguration.nix
andnixos-rebuild switch
.
- You may have hit bug #46038. Add
See also
See also: