Distributed build: Difference between revisions
imported>Makefu No edit summary |
imported>Symphorien completely rewrite for nix2; NixOS only. |
||
| Line 1: | Line 1: | ||
Sometimes you want to use a faster machine for building a nix derivation you want to use on a slower one. If | 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. | |||
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 <code>root</code>. | |||
You must ensure you can run <code>nix*</code> commands on the remote without user interaction and without any option on the ssh command line: | |||
{{ | {{Commands|$ ssh builder nix-store --version}} | ||
{{Tip|When testing this as another user, make sure your environment (<code>$HOME</code>, <code>ssh-agent</code>) does not leak to this account.}} | |||
Here is a way to achieve this: | |||
First we configure how ssh should connect to our builder. | |||
{{file|~/.ssh/ssh_config|text| | |||
<nowiki> | |||
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 | |||
# There must not be any user interaction for logging in | |||
# Disable the annoying prompt when ssh-ing for the first time | |||
StrictHostKeyChecking=no | |||
UserKnownHostsFile=/dev/null | |||
</nowiki> | |||
}} | |||
{{Tip|Some options presented here like <code>StrictHostKeyChecking no</code> weaken security and are not strictly speaking necessary but make things easier. Adapt to your taste.}} | |||
SSH connection must be non-interactive so we use a public key '''without a passphrase'''. | |||
{{Commands| | |||
$ 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: | |||
{{Commands|$ nix ping-store --store ssh://builder}} | |||
If you get an error like <code>serialised integer ... is too big for type j</code> this means that something (<code>/etc/profile</code> for example) outputs bytes to <code>stdout</code> before launching the command specified on the ssh | |||
command line. Either disable this behavior or have the output be sent to <code>stderr</code> instead. | |||
== Single user install == | |||
{{Expansion|untested}} | |||
See the [https://nixos.org/nix/manual/#chap-distributed-builds Nix Manual] and the option <code>--builders</code>. | |||
== Multi-User install == | |||
We must configure the <code>nix-daemon</code> to use our builder. Options like <code>--builders</code> on the command line seem to be ignored. | |||
=== NixOS === | |||
There are a few NixOS options we can use: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ 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 | |||
''; | |||
} | |||
</nowiki>}} | |||
{{Evaluate}} | |||
See the [https://nixos.org/nix/manual/#chap-distributed-builds Nix Manual] for the exact signification of each option. | |||
=== Non NixOS === | |||
{{Expansion|untested}} | |||
The previous method should be rather easily adaptable: replace adding NixOS options by editing <code>/etc/nix/nix.conf</code>. | |||
== Using remote builders == | |||
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 <code>max-jobs</code> nix option to 0 | |||
{{Commands|$ nix-build -j0 blah}} | |||
. | |||
< | |||
</ | |||
== | == See also == | ||
See also: | See also: | ||
* [https://github.com/NixOS/nix/blob/master/tests/remote-builds.nix#L46-L58 The NixOS Remote Builds Test Case] | * [https://github.com/NixOS/nix/blob/master/tests/remote-builds.nix#L46-L58 The NixOS Remote Builds Test Case] | ||
* [https://nixos.org/nix-dev/2015-September/018255.html The Mail to nixos-dev about setting up remote builds by Russell O'Connor] | * [https://nixos.org/nix-dev/2015-September/018255.html The Mail to nixos-dev about setting up remote builds by Russell O'Connor] | ||