Skip to content
Snippets Groups Projects
Commit fa85ed9e authored by Fernando K's avatar Fernando K
Browse files

feat: add remote boot

parent ff6005ea
No related branches found
No related tags found
No related merge requests found
# estrella
```{ipmiconfig}
```
Essa é a máquina de boot remoto.
...@@ -71,9 +71,6 @@ Alguns cuidados devem ser observados no gerenciamento desta máquina: ...@@ -71,9 +71,6 @@ Alguns cuidados devem ser observados no gerenciamento desta máquina:
- [Autenticação do Departamento de Informática que utiliza Kerberos e LDAP.](/pages/services/urquell-autenticacao-dinf) - [Autenticação do Departamento de Informática que utiliza Kerberos e LDAP.](/pages/services/urquell-autenticacao-dinf)
- Monitoramento Zabbix + Postgres (pode/vai ser movido) - Monitoramento Zabbix + Postgres (pode/vai ser movido)
- Só uma instância que está na urquell - Só uma instância que está na urquell
- Boot remoto (pode/vai ser movido)
- tftp-hpa
- syslinux-pxe
- Ceph Monitor - Ceph Monitor
- Servidor NTP - Servidor NTP
- E-mail - E-mail
......
...@@ -84,7 +84,7 @@ possui a seguinte disposição (de cima para baixo): ...@@ -84,7 +84,7 @@ possui a seguinte disposição (de cima para baixo):
? ?
## Rack 7 ## Rack 7
* Máquina estrella * [Máquina estrella](/pages/machines/base/estrella)
* [Máquina torneira4](/pages/machines/virtuals/torneira4) * [Máquina torneira4](/pages/machines/virtuals/torneira4)
* [Máquina torneira3](/pages/machines/virtuals/torneira3) * [Máquina torneira3](/pages/machines/virtuals/torneira3)
* [Máquina torneira2](/pages/machines/virtuals/torneira2) * [Máquina torneira2](/pages/machines/virtuals/torneira2)
......
# estrella/Boot remoto
A [](/pages/machines/base/estrella) opera o sistema de boot remoto provido
pelo C3SL ao Departamento de Informática. O boot remoto é composto de primariamente
dois servidores:
* Servidor TFTP em `tftp.boot.c3sl.ufpr.br` que permite que o ambiente de
execução pré-boot (PXE) inicie o boot pela rede.
* Servidor NFS em `nfs.boot.c3sl.ufpr.br` que serve a raiz do sistema operacional
em modo somente leitura.
Estes dois serviços são gerenciados por [](/pages/concepts/ansible) no repositório
[estrella-ansible](https://gitlab.c3sl.ufpr.br/c3root/estrella-ansible). Os dois
servidores servem o mesmo diretório `/exports/` que está em um sistema de arquivos
diferente.
## O diretório `/exports`
O diretório `/exports/` é exportado tanto via TFTP quanto via NFS.
Dentro do diretório `/exports/` pode ser encontrado os seguintes subdiretórios:
* `boot/`: O diretório utilizado pelo PXE para encontrar o binário do GRUB.
* `grub-config/`: Arquivos de configuração do GRUB que são chamados de acordo
com a extensão do DHCP `extensions-path`.
* `image-config/`: Links simbólicos para imagens utilizados pelos arquivos de
configuração do GRUB.
* `images/`: Armazenamento de imagens, incluindo algumas versões anteriores.
* `overlays/`: Configurações específicas para máquina. São vários diretórios
cada um com um hostname, e os arquivos dentro do diretório são utilizados
no sistema de arquivos overlay como uma camada a mais. Isso significa que
se um arquivo está presente tanto na imagem quanto no `overlays/`, o arquivo
utilizará a versão que está presente no `overlays/`.
## Fluxo do boot remoto
Quando uma máquina boota, o ambiente de execução pré-boot PXE executa e efetua
os seguintes passos:
1. Faz um broadcast para descobrir os servidores DHCP disponíveis.
2. Obtém informações dos servidores DHCP disponíveis.
3. Se for identificado a opção DHCP `next-server`, o PXE faz uma requisição a um
servidor TFTP localizado neste endereço procurando pelo arquivo da opção
DHCP `filename`.
4. O PXE executa o arquivo baixado como um binário.
O [servidor de DHCP](/pages/services/urquell-dhcp) está configurado para
que a opção de DHCP `filename` seja o caminho `boot/grub/x86_64-efi/core.efi`
para hosts 64 bits e `boot/grub/i386-pc/core.0` para hosts 32 bits. Este binário
que é executado é o GRUB 2. O GRUB procura o arquivo de configuração `boot/grub/grub.cfg`
ainda via servidor TFTP e executa seu conteúdo:
```
set config_name=$net_pxe_extensionspath
configfile /grub-config/$config_name
```
Ou seja, o arquivo de configuração referente a opção do DHCP `extensions-path`
em `/grub-config` é executado. Por enquanto temos algumas opções de configuração:
* `terminal`: Imagem padrão.
* `terminal-allinone`: Imagem específica para uso com sistemas All-in-one,
com uma versão do kernel diferente que tem menos problemas no driver de vídeo.
* `terminal-log`: Imagem incrementada com integração com o sistema de monitoramento,
para ser utilizada com máquinas de acesso livre como a `macalan`.
Um arquivo de configuração tem esta cara:
```
insmod all_video
set timeout=0
menuentry "Terminal" {
linux /image-config/terminal/vmlinuz root=/dev/nfs ro ip=dhcp nfsroot=200.17.202.12:/exports/image-config/terminal,acregmax=3600,acregmin=3600,acdirmin=3600,acdirmax=3600,rsize=1048576,ro fsck.mode=skip
echo 'Loading initram'
initrd /image-config/terminal/initrd.img
echo 'All set...'
}
```
Então:
1. É carregado o módulo de vídeo para que seja possível ver o sistema bootando,
importante principalmente para os All-in-ones.
2. Definimos o timeout (tempo para selecionar a opção) para 0, para iniciar
sempre na opção padrão.
3. Definimos a opção de boot padrão.
4. A opção de boot padrão define os parâmetros do kernel do linux da imagem
configurada em `image-config` para que ele boote via NFS através das opções `root=/dev/nfs`,
`ro` (para o kernel usar o modo somente leitura), `ip=dhcp` (para pegar opções de DHCP quando
bootar, sendo essencial o nome da máquina) e `nfsroot` com o IP do servidor NFS,
o caminho utilizando o `image-config/` com algumas definições de otimização:
* `acregmax`, `acregmin`, `acdirmin`, `acdirmax` são definidas para 3600 segundos (60 minutos) para que o cache do VFS seja alto, já que as imagens não mudam.
* `rsize` é definido para 1MiB, o mais alto possível, e é o tamanho do pacote do NFS.
* `ro` faz com que o NFS seja montado somente leitura (embora as configurações do servidor NFS forcem que isso aconteça de qualquer forma).
Além disso, o kernel é configurado para pular quaisquer verificações de disco pela opção `fsck.mode=skip`, pois é completamente desnecessário verificar o sistema de arquivos que é montado reemotado.
4. Por fim, o `initrd.img` é carregado e executado que inicia o processo de boot
do kernel.
Dentro do boot há uma mágica para que funcione os `overlays/` e exista um sistema
que permita escrita na raiz (que escreve em memória). Essa mágica é feita pelo
script encontrado dentro da imagem em `/etc/initramfs-tools/scripts/init-bottom/overlay`.
Note que há um IP estático neste script. Ao fazer uma alteração nele, lembre-se
que é necessário atualizar a initramfs entrando no sistema via `systemd-nspawn`
e rodando `update-initramfs -u`.
## Cuidados na imagem do boot remoto
* Para mexer na imagem é recomendado o uso do `systemd-nspawn`. Ele deve ser
chamado da seguinte maneira:
```
$ sudo systemd-nspawn -D /exports/image-config/terminal
```
* Caso você cague com o `/etc/resolv.conf` de alguma maneira, arrume da seguinte maneira:
```
$ sudo rm resolv.conf
$ sudo ln -s /run/systemd/resolve/stub-resolv.conf resolv.conf
$ ls -l resolv.conf
lrwxrwxrwx 1 root root 31 abr 5 10:45 resolv.conf -> /run/systemd/resolve/stub-resolv.conf
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment