Next: Suporte a SELinux, Previous: Configuração do ambiente de compilação, Up: Configurando o daemon [Contents][Index]
When desired, the build daemon can offload derivation builds to other
machines running Guix, using the offload
build
hook8.
When that feature is enabled, a list of user-specified build machines is
read from /etc/guix/machines.scm; every time a build is requested,
for instance via guix build
, the daemon attempts to offload it to one
of the machines that satisfy the constraints of the derivation, in
particular its system types—e.g., x86_64-linux
. A single machine
can have multiple system types, either because its architecture natively
supports it, via emulation (see Transparent
Emulation with QEMU), or both. Missing prerequisites for the build are
copied over SSH to the target machine, which then proceeds with the build;
upon success the output(s) of the build are copied back to the initial
machine. The offload facility comes with a basic scheduler that attempts to
select the best machine. The best machine is chosen among the available
machines based on criteria such as:
parallel-builds
field of its
build-machine
object.
speed
field of its
build-machine
object.
overload-threshold
field of its
build-machine
object.
O arquivo /etc/guix/machines.scm geralmente se parece com isso:
(list (build-machine
(name "eightysix.example.org")
(systems (list "x86_64-linux" "i686-linux"))
(host-key "ssh-ed25519 AAAAC3Nza…")
(user "bob")
(speed 2.)) ;incredibly fast!
(build-machine
(name "armeight.example.org")
(systems (list "aarch64-linux"))
(host-key "ssh-rsa AAAAB3Nza…")
(user "alice")
;; Remember 'guix offload' is spawned by
;; 'guix-daemon' as root.
(private-key "/root/.ssh/identity-for-guix")))
In the example above we specify a list of two build machines, one for the
x86_64
and i686
architectures and one for the aarch64
architecture.
De fato, esse arquivo é – não surpreendentemente! – um arquivo de esquema
que é avaliado quando o hook offload
é iniciado. Seu valor de retorno
deve ser uma lista de objetos de build-machine
. Embora este exemplo
mostre uma lista fixa de máquinas de compilação, pode-se imaginar, digamos,
usando DNS-SD para retornar uma lista de possíveis máquinas de compilação
descobertas na rede local (see Guile-Avahi in Using Avahi in Guile Scheme Programs). O tipo de dados de
build-machine
está detalhado abaixo.
Esse tipo de dados representa máquinas de compilação nas quais o daemon pode descarregar compilações. Os campos importantes são:
name
O nome de host da máquina remota.
systems
The system types the remote machine supports—e.g., (list
"x86_64-linux" "i686-linux")
.
user
A conta de usuário a ser usada ao conectar-se à máquina remota por SSH. Observe que o par de chaves SSH deve não protegido por senha, para permitir logins não interativos.
host-key
Essa deve ser a SSH chave pública do host da máquina no formato OpenSSH. Isso é usado para autenticar a máquina quando nos conectamos a ela. É uma string longa que se parece com isso:
ssh-ed25519 AAAAC3NzaC…mde+UhL hint@example.org
Se a máquina estiver executando o daemon OpenSSH, sshd
, a chave do
host poderá ser encontrada em um arquivo como
/etc/ssh/ssh_host_ed25519_key.pub.
Se a máquina estiver executando o daemon SSH do GNU lsh,
lshd
, a chave do host estará em /etc/lsh/host-key.pub ou em
um arquivo semelhante. Ele pode ser convertido para o formato OpenSSH usando
o lsh-export-key
(see Converting keys in LSH Manual):
$ lsh-export-key --openssh < /etc/lsh/host-key.pub ssh-rsa AAAAB3NzaC1yc2EAAAAEOp8FoQAAAQEAs1eB46LV…
Vários campos opcionais podem ser especificados:
port
(padrão: 22
)O número da porta para o servidor SSH na máquina.
private-key
(padrão: ~root/.ssh/id_rsa)O arquivo de chave privada SSH a ser usado ao conectar-se à máquina, no formato OpenSSH. Esta chave não deve ser protegida com uma senha.
Observe que o valor padrão é a chave privada da usuário root. Verifique se ele existe se você usar o padrão.
compression
(padrão: "zlib@openssh.com,zlib"
)compression-level
(padrão: 3
)Os métodos de compactação no nível SSH e o nível de compactação solicitado.
Observe que o descarregamento depende da compactação SSH para reduzir o uso da largura de banda ao transferir arquivos de e para máquinas de compilação.
daemon-socket
(padrão: "/var/guix/daemon-socket/socket"
)O nome do arquivo do soquete do domínio Unix guix-daemon
está
escutando nessa máquina.
overload-threshold
(default: 0.8
)The load threshold above which a potential offload machine is disregarded by
the offload scheduler. The value roughly translates to the total processor
usage of the build machine, ranging from 0.0 (0%) to 1.0 (100%). It can
also be disabled by setting overload-threshold
to #f
.
parallel-builds
(padrão: 1
)O número de compilações que podem ser executadas paralelamente na máquina.
speed
(padrão: 1.0
)Um “fator de velocidade relativo”. O agendador de descarregamento tenderá a preferir máquinas com um fator de velocidade mais alto.
features
(padrão: '()
)Uma lista de strgins que denotam recursos específicos suportados pela
máquina. Um exemplo é "kvm"
para máquinas que possuem os módulos KVM
Linux e o suporte de hardware correspondente. As derivações podem solicitar
recursos pelo nome e serão agendadas nas máquinas de compilação
correspondentes.
O comando guix
deve estar no caminho de pesquisa nas máquinas de
compilação. Você pode verificar se este é o caso executando:
ssh build-machine guix repl --version
Há uma última coisa a fazer quando o machines.scm está em vigor. Como
explicado acima, ao descarregar, os arquivos são transferidos entre os
armazéns das máquinas. Para que isso funcione, primeiro você precisa gerar
um par de chaves em cada máquina para permitir que o daemon exporte arquivos
assinados de arquivos do armazém (see Invocando guix archive
):
# guix archive --generate-key
Cada máquina de construção deve autorizar a chave da máquina principal para que ela aceite itens do armazém que recebe do mestre:
# guix archive --authorize < master-public-key.txt
Da mesma forma, a máquina principal deve autorizar a chave de cada máquina de compilação.
Todo esse barulho com as chaves está aqui para expressar relações de confiança mútua de pares entre a máquina mestre e as de compilação. Concretamente, quando o mestre recebe arquivos de uma máquina de compilação (e vice-versa), seu daemon de compilação pode garantir que eles sejam genuínos, não tenham sido violados e que sejam assinados por uma chave autorizada.
Para testar se sua configuração está operacional, execute este comando no nó principal:
# guix offload test
This will attempt to connect to each of the build machines specified in /etc/guix/machines.scm, make sure Guix is available on each machine, attempt to export to the machine and import from it, and report any error in the process.
Se você quiser testar um arquivo de máquina diferente, basta especificá-lo na linha de comando:
# guix offload test machines-qualif.scm
Por fim, você pode testar o subconjunto das máquinas cujo nome corresponde a uma expressão regular como esta:
# guix offload test machines.scm '\.gnu\.org$'
Para exibir o carregamento atual de todos os hosts de compilação, execute este comando no nó principal:
# guix offload status
Next: Suporte a SELinux, Previous: Configuração do ambiente de compilação, Up: Configurando o daemon [Contents][Index]