conjunto de link ipup/down: como os scripts são chamados?

conjunto de link ipup/down: como os scripts são chamados?

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 ipcomando 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> upcomo 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 ifconfigpede 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.

ifupfaz 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 ... upnã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 linkcomando 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 monitorque 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 linkpara 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.

informação relacionada