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¶
- O daemon descompacta o pacote na partição de dados mutáveis.
- 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.
- 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.
- 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.