Next: Setting Up Compute Nodes, Up: Installing Guix on a Cluster [Contents][Index]
The recommended approach is to set up one head node running
guix-daemon
and exporting /gnu/store over NFS to compute
nodes.
Remember that guix-daemon
is responsible for spawning build
processes and downloads on behalf of clients (see Invoking guix-daemon in GNU Guix Reference Manual), and more generally accessing
/gnu/store, which contains all the package binaries built by all the
users (see The Store in GNU Guix Reference Manual). “Client”
here refers to all the Guix commands that users see, such as guix
install
. On a cluster, these commands may be running on the compute nodes
and we’ll want them to talk to the head node’s guix-daemon
instance.
To begin with, the head node can be installed following the usual binary installation instructions (see Binary Installation in GNU Guix Reference Manual). Thanks to the installation script, this should be quick. Once installation is complete, we need to make some adjustments.
Since we want guix-daemon
to be reachable not just from the head node
but also from the compute nodes, we need to arrange so that it listens for
connections over TCP/IP. To do that, we’ll edit the systemd startup file
for guix-daemon
, /etc/systemd/system/guix-daemon.service,
and add a --listen
argument to the ExecStart
line so that it
looks something like this:
ExecStart=/var/guix/profiles/per-user/root/current-guix/bin/guix-daemon --build-users-group=guixbuild --listen=/var/guix/daemon-socket/socket --listen=0.0.0.0
For these changes to take effect, the service needs to be restarted:
systemctl daemon-reload systemctl restart guix-daemon
Observera: The
--listen=0.0.0.0
bit means thatguix-daemon
will process all incoming TCP connections on port 44146 (see Invoking guix-daemon in GNU Guix Reference Manual). This is usually fine in a cluster setup where the head node is reachable exclusively from the cluster’s local area network—you don’t want that to be exposed to the Internet!
The next step is to define our NFS exports in /etc/exports by adding something along these lines:
/gnu/store *(ro) /var/guix *(rw, async) /var/log/guix *(ro)
The /gnu/store directory can be exported read-only since only
guix-daemon
on the master node will ever modify it.
/var/guix contains user profiles as managed by guix
package
; thus, to allow users to install packages with guix package
,
this must be read-write.
Users can create as many profiles as they like in addition to the default
profile, ~/.guix-profile. For instance, guix package -p
~/dev/python-dev -i python
installs Python in a profile reachable from the
~/dev/python-dev
symlink. To make sure that this profile is
protected from garbage collection—i.e., that Python will not be removed
from /gnu/store while this profile exists—, home directories
should be mounted on the head node as well so that guix-daemon
knows
about these non-standard profiles and avoids collecting software they refer
to.
It may be a good idea to periodically remove unused bits from
/gnu/store by running guix gc
(see Invoking guix gc in GNU Guix Reference Manual). This can be done by adding a crontab
entry on the head node:
root@master# crontab -e
... with something like this:
# Every day at 5AM, run the garbage collector to make sure # at least 10 GB are free on /gnu/store. 0 5 * * 1 /usr/local/bin/guix gc -F10G
We’re done with the head node! Let’s look at compute nodes now.
Next: Setting Up Compute Nodes, Up: Installing Guix on a Cluster [Contents][Index]