
Executando a imagem Debian 10 Buster (criada com build-openstack-debian-image --release buster
) com imagem cloud-init criada por cloud-localds -v --disk-format raw --filesystem iso9660 --network-config=network-config-v2.yaml seed.img user-data.yaml
.
O problema é que a inicialização atrasa aguardando o DHCP, embora eu tenha uma configuração de rede válida e ela seja aplicada após esse atraso.
[ 3.619937] cloud-init[210]: Cloud-init v. 20.2 running 'init-local' at Sun, 10 Jan 2021 10:50:20 +0000. Up 3.40 seconds.
[ OK ] Started Initial cloud-init job (pre-networking).
[ OK ] Reached target Network (Pre).
Starting Raise network interfaces...
[ OK ] Started ifup for eth0.
[ *] A start job is running for Raise network interfaces (35s / 5min 1s)
O que posso fazer para evitar esse atraso?
Posso fornecer mais informações, se necessário. Obrigado.
# systemd-analyze blame
1min 2.639s networking.service
951ms cloud-init-local.service
773ms cloud-init.service
657ms cloud-final.service
540ms cloud-config.service
421ms dev-vda1.device
310ms ifupdown-pre.service
Meu network-config-v2.yaml
:
version: 2
renderer: networkd
ethernets:
eth0:
match:
name: e*
addresses:
- private.ipv4/24
- public.ipv4/32
- ipv6/64
gateway4: private.ipv4
routes:
- to: 0.0.0.0/0
via: private.ipv4
gateway6: ipv6
nameservers:
addresses:
- ipv4
- ipv6
search: [domain.com]
Responder1
Ótimas dicas de @zany
No meu caso, eu estava tentando configurar uma imagem de nuvem genérica do Debian 11 com cloud-init e um IP estático em meu host KVM (usando o provedor dmacvicar libvirt Terraform)
Meu arquivo de configuração de rede era:
version: 2
ethernets:
ens3:
dhcp4: false
addresses: [10.1.0.100]
gateway4: 10.1.0.1
nameservers:
addresses: [10.1.0.1 1.1.1.1]
search: [home.lab]
Então fiquei surpreso que durante a criação da VM, a interface estava solicitando uma concessão de DHCP ( journalctl
é seu amigo)antesA configuração do cloud-init realmente entraria em ação e configuraria a interface de acordo com minhas configurações estáticas (exatamente como o OP descrito)
Depois de mais ou menos um minuto, o "misterioso" dhclient desistiu de esperar por uma oferta (que era esperada porque o DHCP está desabilitado na minha rede libvirt) e foi deixado em execução em segundo plano. Em seguida, a sequência de inicialização continua e cloud-init
entra em ação, renderizando a configuração estática correta no arquivo /etc/network/interfaces.d/50-cloud-init.cfg
. Nesse ponto, a interface obtém o IP estático esperado ( ip address show
prova isso, e você também pode fazer ping por IP), porém está deixando a resolução de DNS quebrada. Acho que é um efeito colateral do fiasco do dhclient.
Bem, depois de algumas pesquisas, verifica-se que o /etc/network/interfaces
arquivo, além de fornecer, source-directory /etc/network/interfaces.d
também fornece o diretório extra /run/network/interfaces.d/
. Para minha surpresa, esse /run
diretório contém uma definição de interface para ens3
onde está sendo configurado no dhcp
modo!
Então, agora que eu sabia de onde vinha a solicitação inesperada do DHCP, era uma questão de desativá-la, pois ela estava em conflito com as configurações corretas no /etc/network/interfaces.d/50-cloud-init.cfg
.
Infelizmente, a desativação da solicitação dhcp inicial ocorre antes do início da nuvem, portanto, não há uma maneira fácil de evitar que o dhclient perca um minuto precioso tentando obter uma oferta que nunca chegará.
O que consegui realizar foi corrigir a resolução do DNS usando o seguinte bootcmd:
bloco no meuuser-data
bootcmd:
- cloud-init-per once down ifdown ens3
- cloud-init-per once bugfix rm /run/network/interfaces.d/ens3
- cloud-init-per once up ifup ens3
Nos comandos acima, estou desativando a interface, o que interrompe o processo dhclient inativo, depois estou removendo o arquivo de definição de interface que inicialmente é definido ens3
no modo dhcp e, finalmente, estou reativando a ens3
interface, que aplica o que está definido como /etc/network/interfaces.d/50-cloud-init.cfg
um campeão.
Com isso, os estágios subsequentes de inicialização da nuvem no processo de inicialização agora eram capazes de acessar totalmente a Internet pelo nome. Isso foi fundamental para que os estágios posteriores desse packages:
bloqueio fossem bem-sucedidos, pois era necessário que o DNS funcionasse para resolver o nome do servidor apt repo.
Aqui está o user-data
trecho mais detalhado:
bootcmd:
- cloud-init-per once ifdown ifdown ens3
- cloud-init-per once bugfix rm /run/network/interfaces.d/ens3
- cloud-init-per once ifup ifup ens3
packages:
- qemu-guest-agent
- locales-all
package_update: true
package_upgrade: true
package_reboot_if_required: true
runcmd:
- [ systemctl, start, qemu-guest-agent ]
final_message: "The system is finally up, after $UPTIME seconds"
Apesar de não estar no Debian10, o problema parecia tão familiar que pensei em compartilhar minha experiência caso você enfrente esse problema em versões mais recentes.
Referências:
- https://cloudinit.readthedocs.io/en/latest/topics/network-config.html#network-configuration
- https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v2.html
- https://cloudinit.readthedocs.io/en/latest/topics/modules.html#bootcmd
- https://cloudinit.readthedocs.io/en/latest/topics/modules.html#package-update-upgrade-install
- https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-genericcloud-amd64.qcow2
Responder2
Encontrei o problema de exemplo - usar uma configuração de rede estática (ENI de metadados do provedor NoCloud ou configuração de rede v1/v2) não desativa o cliente DHCP.
Parece que uma configuração de rede é aplicada a partir de um modelo ( /etc/network/cloud-interfaces-template
) antes que a configuração do cloud-init seja gravada.
auto $INTERFACE
allow-hotplug $INTERFACE
iface $INTERFACE inet dhcp
Você pode testar se este modelo é o culpado alterando a imagem da nuvem antes da primeira inicialização:
(corrigir a imagem porque alterar a configuração da rede, por exemplo, bootcmd
é tarde demais).
qemu-nbd --connect=/dev/nbd0 /tmp/debian-10-genericcloud-amd64-20210208-542.qcow2
fdisk /dev/nbd0 -l
mkdir /tmp/nbd
mount /dev/nbd0p1 /tmp/nbd
sed -i 's/dhcp/manual/' /tmp/nbd/etc/network/cloud-interfaces-template
umount /tmp/nbd
rmdir /tmp/nbd
qemu-nbd --disconnect /dev/nbd0
Ainda preciso encontrar uma maneira de aplicar essa alteração ou impedir o uso deste modelo com o cloud-init.
Esse modelo parece ser processado por /etc/network/cloud-ifupdown-helper
, então esse script pode ser alterado ou influenciado, talvez.
Responder3
Eu encontrei o mesmo problema.
Aqui está uma maneira melhor de resolver isso, basta definir o tempo limite do DHCP para um tempo menor.
# virt-edit debian-10-generic-amd64.qcow2 /etc/dhcp/dhclient.conf
timeout 15;
Então esta imagem pode funcionar corretamente em ambiente NoCloud ou rede DHCP.
Responder4
A resposta de agittins parece melhor, mas no meu caso o comando cloud-init "bootcmd" no arquivo de dados do usuário processado após debians "75-cloud-ifupdown.rules". Então eu tive que remover os scripts debian na imagem do disco (montar o armazenamento vm primeiro, excluir o script e desmontar):
sudo qemu-nbd --connect=/dev/nbd0 debian-11-genericcloud-arm64-backing.qcow2
sudo mount /dev/nbd0p1 /mnt
sudo rm -v /mnt/etc/udev/rules.d/75-cloud-ifupdown.rules
sudo rm -v /mnt/etc/network/cloud-ifupdown-helper
sudo rm -v /mnt/etc/network/cloud-interfaces-template
sudo umount /mnt