Dependendo da distribuição, invocar ip link set <iface> up
(ou down; também ifup / ifdown) examinará vários arquivos de configuração (/etc/network/interfaces no Debian, acho que o Gentoo tem /etc/conf.d/net...) e fará alterações (por exemplo, interagir com DHCP etc.)
Pelo que vi strace
, o ip
comando se comunica diretamente com o kernel (é mesmo?). Mas então, eventualmente, alguém inicia esses scripts de shell/lê a configuração. Qual é o mecanismo por trás disso acontecer? O sistema init está escutando alguma interface do kernel para mudanças de estado ativo/inativo e inicia esses scripts? Ou é algo diferente?
Responder1
Invocar ip link set <iface> up
como você descreve é apenas fazer a comunicação mínima com o kernel através dortnetlinkAPI(que não se trata apenas de rotas, mas também de links, endereços etc. Aqui seria RTM_NEWLINK
) para ativar administrativamente a interface. A ferramenta mais antiga ifconfig
pede o mesmo ao kernel usando a API ioctl obsoleta (para rede) (aqui seria SIOCGIFFLAGS
).
Esses comandos são comandos de baixo nível que fazem apenas o que foi solicitado e nada mais.
ifup
faz parte (no Debian) doifupdown(ou o alternativoifupdown2) e tem diferentes implementações em diferentes distribuições Linux. Eles são apenas um conjunto de scripts, provavelmente invocando ip link set ...
a si mesmos, e talvez alguns deles também usem diretamente outras ferramentas disponíveis (comoGerente da rede). Então você absolutamente não pode colocá-los no mesmo nível: ip link set ... up
não é de jeito nenhum ifup ...
.
Agora, como outras ferramentas de rede comoGerente da redeinteragir e saber o que aconteceu? Porque eles estão perguntando ao kernel, atravésrtnetlink, para serem notificados sobre alguns eventos de rede nos quais estão interessados.link da redeA implementação da API suporta multicast: isso significa que uma única mensagem pode ser recebida de forma eficiente por múltiplas partes interessadas (pertencentes ao espaço do usuário ou kernel), o que simplifica a implementação de eventos.
Normalmente, quando algo (aqui ip link set ... up
) envia uma mensagem para o kernel, o kernel responde com uma mensagem que é transmitida para as partes interessadas: O ip link
comando recebe esta mensagem de volta, mas também todas as ferramentas em espera que agora sabem que "uma interface acabou de ser criada " (Deixarei de lado as diferenças entre o estado administrativo e o estado operacional).
É possível fazer o mesmo em um script usando um loop de eventos acionado pela saída do comandoip monitor
que está aguardando eventos de rede do kernel. É claro que uma saída realmente analisável seria preferível, infelizmente, enquanto muitos outrosiproute2subcomandos suportam uma saída JSON (usando -json
) que não é o caso de ip monitor
.
Aqui está umbásicoexemplo de shell baseado em ip monitor link
para exibir o status operacional de uma interface sempre que uma alteração nesta interface é feita (mesmo que não esteja relacionada ao seu status operacional.básicoexemplo). Como está analisando uma saída não confiável, espere que ela falhe em alguns casos:
#!/bin/sh
ip -o monitor link | while read -r index interface status remaining; do
iface=$(printf '%s\n' "$interface" | sed -E 's/(@.*)?:$//')
operstate=$(printf '%s\n' "$remaining" | grep -Eo ' state [^ ]+' | sed 's/^ state //')
printf '%s %s\n' "$iface" "$operstate"
done
Enquanto o script acima estiver em execução, tente estes comandos em outro lugar:
# ip link add test1 type veth peer name test2
# ip link set test1 up
# ip link set test2 up
# ip link delete test1 # script doesn't handle correctly lines starting with Deleted
O mesmo é possível com endereços, rotas, etc. É assim que ferramentas comoGerente da redeestão reagindo ao comando ip link set <iface> up
.