Skip to content

Atualização do firmware

Uma máquina instalada é atualizada sem pendrive. O pacote de atualização é instalado ao lado da versão em execução, não por cima: as configurações, os dados e as senhas sobrevivem à atualização, e a versão anterior fica na partição de boot para a volta atrás.

A máquina não baixa nem instala nada por conta própria. Instalar uma atualização é sempre um pedido explícito: pela tela da interface, pela API ou à mão no console.

O pacote de atualização

O pacote é um arquivo compactado com o que vai para a partição de boot: o arquivo de boot da nova versão, as imagens das camadas dela, a entrada do menu do carregador, a descrição do produto e um manifesto de somas de verificação. Ao lado do pacote é publicada a soma de verificação dele próprio.

O canal de atualizações

A máquina fica sabendo das novas versões pelo índice de um canal de atualizações cujo endereço está compilado na própria imagem. Ela lê o índice e lista as versões do seu produto e da sua arquitetura; as que já estão na partição aparecem marcadas.

Uma imagem sem canal nem sabe que ele existe, e só pode ser atualizada por endereço ou por arquivo.

A instalação

Pela interface web

A seção Atualizações começa nomeando duas versões: a que está em execução e a que vai iniciar da próxima vez. Ao lado fica o botão de reinicialização — quando a versão seguinte é diferente da que está em execução, ele aparece destacado, e a tela diz o que exatamente vai mudar na reinicialização.

O índice do canal é lido ao abrir a interface: o item do menu leva uma marca quando o canal tem uma versão que não está na partição. O botão Verificar atualizações relê o índice.

Pela API

A resposta volta na hora e a instalação corre em segundo plano.

Instalar um pacote a partir de um arquivo:

curl -u admin:senha -H 'content-type: application/x-tar' \
    --data-binary @mcaster-<versão>-amd64.update.tar http://<máquina>:8090/system/firmware

Instalar um pacote a partir de um endereço:

curl -u admin:senha -H 'content-type: application/json' \
    -d '{"url":"https://…/mcaster-<versão>-amd64.update.tar"}' \
    http://<máquina>:8090/system/firmware/install

Ver o andamento da operação, as versões instaladas e a que inicia em seguida:

curl -u admin:senha http://<máquina>:8090/system/firmware

Listar as versões do canal de atualizações:

curl -u admin:senha http://<máquina>:8090/system/firmware/available

Reiniciar na versão nova:

curl -u admin:senha -X POST http://<máquina>:8090/system/reboot

O que acontece durante a instalação

  1. O daemon descompacta o pacote na partição de dados mutáveis.
  2. Confere cada arquivo contra o manifesto de somas de verificação, e o produto, a arquitetura e o perfil de hardware contra os que estão em execução.
  3. Só então remonta a partição de boot para escrita e copia o que falta. As imagens de camadas compartilhadas com as versões já instaladas não são copiadas.
  4. Aponta a entrada padrão do carregador para a versão nova.

Depois da instalação ficam na partição a versão em execução e a nova. As demais são retiradas junto com as imagens de camadas de que ninguém mais precisa.

A versão nova só começa a funcionar depois de reiniciar — a instalação não reinicia a máquina sozinha.

Volta à versão anterior

Reverter é escolher a versão anterior e reiniciar:

curl -u admin:senha -X POST http://<máquina>:8090/system/firmware/<versão>/select
curl -u admin:senha -X POST http://<máquina>:8090/system/reboot

Remover uma versão que não é mais necessária:

curl -u admin:senha -X DELETE http://<máquina>:8090/system/firmware/<versão>

A versão em execução e a selecionada não podem ser removidas.

Quando o daemon não está

Se o daemon não subiu ou não dá para alcançá-lo, o mesmo caminho é percorrido à mão no console como root. O programa firmware-update vive na camada base, depende apenas do interpretador de comandos e dos utilitários da camada, e faz exatamente três coisas — baixar, colocar, comutar — com as mesmas verificações que o daemon faz. Ele não remove nada.

firmware-update install https://…/mcaster-<versão>-amd64.update.tar   # ou um caminho para um arquivo
firmware-update list                     # versões na partição: em execução e seguinte
firmware-update select <versão>          # iniciar a versão anterior da próxima vez
systemctl reboot

O que ainda não existe

Não há reversão automática depois de um boot malsucedido de uma versão nova: se a máquina não subir, a entrada de boot padrão é devolvida à mão pelo menu do carregador. As máquinas das primeiras séries têm uma partição de boot dimensionada para uma única versão, e uma atualização no lugar não cabe ali — essas máquinas são reinstaladas uma vez a partir de um pendrive.