Estou usando 3 perfis de conexão NetworkManager em uma distribuição Linux e todos os perfis de conexão referem-se à mesma interface Ethernet: enp3s0
. Estou usando essas conexões para gerenciar:
- a configuração de IP estático padrão
- definir uma nova configuração de IP estático
- solicitar um endereço DHCP
No restante da pergunta usarei o termo connection para significar o termo connection profile .
Para alterar a configuração Ethernet, altero a prioridade da conexão, portanto, se eu quiser ativar a configuração de IP estático padrão, defino uma prioridade maior que a configuração de IP estático e a configuração de DHCP.
Leia o parágrafo “Definir propriedades das 3 conexões” na continuação da pergunta para obter detalhes sobre a configuração da prioridade de uma conexão.
A questão
Se eu criar conexões na inicialização por um script bash iniciado por um systemd
serviço, tudo funcionará corretamente, mas se eu executar o script bash após a conclusão da inicialização, a configuração IP não será gerenciada corretamente pelo NetworkManager e seus perfis de conexão. Vá para o parágrafo “O problema” no final da pergunta para obter uma descrição detalhada do erro.
O restante da pergunta fornece todos os detalhes necessários para entender o problema.
Peço desculpas pela extensão da pergunta, mas há muitas informações necessárias.
Criação de 3 perfis de conexão NetworkManager
Para criar as conexões estou utilizando o comando nmcli
conforme mostrado abaixo:
# for default static
nmcli c add ifname enp3s0 type ethernet con-name ethernet_default_ipstatic
# for ethernet_ipstatic
nmcli c add ifname enp3s0 type ethernet con-name ethernet_ipstatic
# for ethernet_dhcp
nmcli c add ifname enp3s0 type ethernet con-name ethernet_dhcp
Após a execução dos comandos anteriores no caminho /etc/NetworkManager/system-connections
, estarão presentes 3 arquivos chamados:
ethernet_default_ipstatic.nmconnection
ethernet_ipstatic.nmconnection
ethernet_dhcp.nmconnection
Defina as propriedades das 3 conexões
Os comandos anteriores criam 3 conexões com propriedades padrão, portanto após criá-las é necessário definir suas propriedades. Para esse objetivo ainda utilizei o comando nmcli
conforme mostrado abaixo.
Para ethernet_default_ipstatic
definir as seguintes propriedades para a conexão:
nmcli con mod ethernet_default_ipstatic ipv4.method manual ipv4.addresses 192.168.1.1/24 ipv6.method disabled
O comando anterior definiu as seguintes propriedades para a conexão:
- ipv4.method = manual (este conjunto IP estático e não DHCP)
- endereço IP 192.168.1.1, máscara de rede 255.255.255.0 (sem gateway)
- IPV6 desativado
- a propriedade de conexão automática permanece como padrão sim
- a propriedade de prioridade permanece com o padrão 0
Para as ethernet_ipstatic
propriedades são:
nmcli con mod ethernet_ipstatic ipv4.method manual ipv4.addresses 192.168.1.1/24 ipv4.gateway 192.168.1.100 ipv4.may-fail no ipv6.method disabled connection.autoconnect no connection.autoconnect-priority -1
O comando anterior definiu as seguintes propriedades para a conexão:
- ipv4.method = manual (este conjunto IP estático e não DHCP)
- endereço IP 192.168.1.1, máscara de rede 255.255.255.0, gateway 192.168.1.100
- IPV6 desativado, conexão automática não, prioridade -1
Para as ethernet_dhcp
propriedades são:
nmcli con mod ethernet_dhcp ipv4.method auto ipv4.addresses '' ipv4.gateway '' ipv4.may-fail no ipv4.dhcp-timeout 20 ipv6.method disabled connection.autoconnect no connection.autoconnect-priority -1 connection.autoconnect-retries 3
O comando anterior definiu as seguintes propriedades para a conexão:
- ipv4.method = auto (este conjunto DHCP e não endereço IP estático)
- endereço IP '', gateway ''
- IPV6 desativado, conexão automática não, prioridade -1
Configuração padrão
Pelos comandos anteriores a conexão ethernet_default_ipstatic
tem prioridade sobre as demais portanto a interface ethernet enp3s0
é configurada com um IP estático 192.168.1.1/24
.
Execução de nmcli
comandos por um serviço
Todos funcionam corretamente se eu executar nmcli
comandos anteriores na inicialização pelo seguinte serviço ( my_custom_nm_service.service
):
[Unit]
Description=Init NetworkManager Ethernet Connections
Requires=NetworkManager.service
After=NetworkManager.service
Before=network.target
[Service]
Type=oneshot
ExecStart=/home/<username>/script_services/init_connections.sh
User=<username>
[Install]
WantedBy=multi-user.target
onde init_connections.sh
executa comandos anteriores nmcli
.
Observação. No arquivo da unidade observe a presença das opções:
- Requer=NetworkManager.service
- Depois=NetworkManager.service
- Antes = rede.target
O problema
Se após o término do boot eu remover todas as conexões, pelo comando nmcli con del
, e executar o script init_connections.sh
obtenho uma configuração de IP imprevisível para o sistema.
A configuração incorreta típica que ocorre é a seguinte:
- a conexão ativa (mostrada pelo
nmcli con
comando) éethernet_default_ipstatic
então o sistema deve ter o endereço IP estático192.168.1.1/24
- mas o sistema obteve um endereço IP do servidor DHCP
Quando o script init_connections.sh
é executado pelo serviço, ele é executado antes do network.target , mas sinceramente não sei se essa diferença pode ser importante para entender o problema ou não.
Encontrei o problema: para definir corretamente a configuração padrão preciso executar o
nmcli con up
comando conforme mostrado abaixo:como também indicado neste post .
Observação. Neste momento para mim não é importante saber porque a execução do script
init_connections.sh
funciona bem na inicialização do serviçomy_custom_nm_service.service
. Meu real interesse é fazer funcionar o script no final do processo de boot.Para completar, escrevo as etapas do meu teste.
1) remova o serviço
Desativei o serviço
my_custom_nm_service.service
que iniciou a execução do scriptinit_connections.sh
2) exclua todas as conexões
Após a inicialização, excluí toda a conexão pelo seguinte script (
delete_connections.sh
):3) criação das 3 conexões: aparece o mau funcionamento
Execute o script
init_connections.sh
:Após a execução do script, meu sistema Linux, apresenta o problema descrito na pergunta que é:
nmcli con
comando informa que a conexão ativa éethernet_default_ipstatic
(porque tem maior prioridade)4) solução: executar
nmcli con up
A solução é executar o comando:
e depois disso a interface
enp3s0
tem o endereço IP padrão