Next: , Previous: , Up: Configurando o daemon   [Contents][Index]


2.4.2 Usando o recurso de descarregamento

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:

  1. The availability of a build slot. A build machine can have as many build slots (connections) as the value of the parallel-builds field of its build-machine object.
  2. Its relative speed, as defined via the speed field of its build-machine object.
  3. Its load. The normalized machine load must be lower than a threshold value, configurable via the overload-threshold field of its build-machine object.
  4. Disk space availability. More than a 100 MiB must be available.

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.

build-machine: Data Type

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

Footnotes

(8)

This feature is available only when Guile-SSH is present.


Next: Suporte a SELinux, Previous: Configuração do ambiente de compilação, Up: Configurando o daemon   [Contents][Index]