Próximo: Suporte a SELinux, Anterior: Configuração do ambiente de compilação, Acima: Configurando o daemon [Conteúdo][Índice]
Quando desejado, o daemon de compilação pode offload compilações de
derivação para outras máquinas executando Guix, usando o offload
build hook8. Quando esse recurso é habilitado, uma lista de máquinas de
compilação especificadas pelo usuário é lida de
/etc/guix/machines.scm; toda vez que uma compilação é solicitada, por
exemplo via guix build
, o daemon tenta descarregá-la para uma das
máquinas que satisfazem as restrições da derivação, em particular seus tipos
de sistema — por exemplo, x86_64-linux
. Uma única máquina pode ter
vários tipos de sistema, seja porque sua arquitetura o suporta nativamente,
via emulação (veja Transparent Emulation with
QEMU), ou ambos. Os pré-requisitos ausentes para a compilação são copiados
por SSH para a máquina de destino, que então prossegue com a compilação; em
caso de sucesso, a(s) saída(s) da compilação são copiadas de volta para a
máquina inicial. O recurso de offload vem com um agendador básico que tenta
selecionar a melhor máquina. A melhor máquina é escolhida entre as máquinas
disponíveis com base em critérios como:
parallel-builds
do
seu objeto build-machine
.
speed
do seu
objeto build-machine
.
overload-threshold
de seu
objeto build-machine
.
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")
;; Lembre-se de que 'guix offload' é gerado por
;; 'guix-daemon' como root.
(private-key "/root/.ssh/identity-for-guix")))
No exemplo acima, especificamos uma lista de duas máquinas de compilação,
uma para as arquiteturas x86_64
e i686
e uma para a
arquitetura aarch64
.
De fato, esse arquivo é – não surpreendentemente! – um arquivo de Scheme
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 (veja Guile-Avahi em 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
O sistema digita os tipos que a máquina remota suporta, por exemplo,
(list "x86_64-linux" "i686-linux")
.
user
The user account on the remote machine to use when connecting over SSH. Note that the SSH key pair must not be passphrase-protected, to allow non-interactive logins.
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
(veja Converting keys em 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
)O limite de carga acima do qual uma máquina de offload potencial é
desconsiderada pelo agendador de offload. O valor traduz aproximadamente o
uso total do processador da máquina de build, variando de 0,0 (0%) a 1,0
(100%). Ele também pode ser desabilitado definindo overload-threshold
para #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.
Nota: No Guix System, em vez de gerenciar /etc/guix/machines.scm de forma independente, você pode escolher especificar máquinas de compilação diretamente na declaração
operating-system
, no campobuild-machines
deguix-configuration
. Veja campobuild-machines
deguix-configuration
.
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 (veja Invocando guix archive
):
# guix archive --generate-key
Nota: Este par de chaves não está relacionado ao par de chaves SSH mencionado anteriormente na descrição do tipo de dados
build-machine
.
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
Isso tentará se conectar a cada uma das máquinas de compilação especificadas em /etc/guix/machines.scm, certificar-se de que o Guix esteja disponível em cada máquina, tentará exportar para a máquina e importar dela e relatará qualquer erro no processo.
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
Próximo: Suporte a SELinux, Anterior: Configuração do ambiente de compilação, Acima: Configurando o daemon [Conteúdo][Índice]