Em algum momento, em algum material didático (da Linux Foundation) sobre Linux que encontrei, é mencionado o seguinte:
ip
O comando é mais versátil e mais eficiente do queifconfig
porque usa soquetes netlink em vez de chamadas de sistema ioctl .
Alguém pode elaborar um pouco sobre isso, porque eu não consigo entender o que está acontecendo sob o capô?
PS Estou ciente deste tópico sobre essas ferramentas, mas não aborda essa diferença específica em como elas operam
O
ifconfig
comando em sistemas operacionais como FreeBSD e OpenBSD foi atualizado de acordo com o resto do sistema operacional. Hoje em dia, ele pode configurar todos os tipos de configurações de interface de rede nesses sistemas operacionais e lidar com uma variedade de protocolos de rede. Os BSDs fornecemioctl()
suporte para essas coisas.Isso não aconteceu no mundo Linux. Existem, hoje, três
ifconfig
comandos:ifconfig
do GNU inetutilsifconfig
de ferramentas de rede NET-3ifconfig
da (versão 1.40) do conjunto de ferramentas noshComo você pode ver, os GNU inetutils e NET-3 net-tools
ifconfig
têm algumas deficiências marcantes, com relação ao IPv6, com relação a interfaces que possuem vários endereços e com relação a funcionalidades como-l
.O problema do IPv6 é, em parte, algum código ausente nas próprias ferramentas. Mas, principalmente, é causado pelo fato de que o Linux não fornece (como outros sistemas operacionais) a funcionalidade IPv6 através da
ioctl()
interface. Ele apenas permite que os programas vejam e manipulem endereços IPv4 através dosioctl()
s de rede.Em vez disso, o Linux fornece essa funcionalidade por meio de uma interface diferente
send()
erecv()
em uma família de soquetes de endereços especial e um tanto estranha,AF_NETLINK
.ifconfig
Os s GNU e NET-3 poderiam ter sido ajustados para usar esta nova API. O argumento contra isso era que não era portátil para outros sistemas operacionais, mas esses programas na prática já não eram portáteis , então isso não era um grande argumento.Mas eles não foram ajustados e permanecem como previstos até hoje. (Algumas pessoas trabalharam neles em vários pontos ao longo dos anos, mas as melhorias, infelizmente, nunca chegaram aos programas. Por exemplo: Bernd Eckenfels nunca aceitou um patch que adicionasse algum recurso de API de netlink às ferramentas de rede do NET-3
ifconfig
, 4 anos após o patch ter sido escrito.)Em vez disso, algumas pessoas reinventaram completamente o conjunto de ferramentas como um
ip
comando, que usava a nova API do Linux, tinha uma sintaxe diferente e combinava várias outras funções por trás de uma interface de estilo moderno.command subcommand
Eu precisava de um
ifconfig
que tivesse a sintaxe de linha de comando e o estilo de saída do FreeBSDifconfig
(que nem o GNU nem o NET-3ifconfig
tem, e queip
certamente não tem). Então eu escrevi um. Como prova de que se poderia escrever umifconfig
que usa a API netlink no Linux, ele o faz.Portanto, a sabedoria recebida sobre
ifconfig
, como o que você cita, não é mais verdadeira. Agora é falso dizer que "ifconfig
não usa netlink.". O cobertor que cobria dois não cobre três.Sempre foi falso dizer que "netlink é mais eficiente". Para as tarefas que se faz com
ifconfig
, não há muito nisso quando se trata de eficiência entre a API netlink e aioctl()
API. Um faz praticamente o mesmo número de chamadas de API para qualquer tarefa.De fato, cada chamada de API são duas chamadas de sistema no caso do netlink, em oposição a uma no
ioctl()
sistema. E, sem dúvida, a API do netlink tem a desvantagem de que em um sistema muito usado ela incorpora explicitamente a possibilidade de a ferramenta nunca receber uma mensagem de confirmação informando-a do resultado da chamada da API.Além disso, é falso dizer que
ip
é "mais versátil" que o GNU e NET-3ifconfig
s porque usa netlink . É mais versátil porque faz mais tarefas, fazendo coisas em um grande programa que se faria com programas separados que não sejamifconfig
. Não é mais versátil simplesmente por causa da API que usa internamente para realizar essas tarefas extras. Não há nada inerente à API sobre isso. Alguém poderia escrever uma ferramenta completa que usasse aioctl()
API do FreeBSD, por exemplo, e igualmente afirmar que ela é "mais versátil" do que os comandos individuaisifconfig
,route
,arp
e .ndp
Pode-se escrever comandos
route
,arp
endp
comandos para Linux que também usem a API netlink.Leitura adicional
ifconfig
. Guia de no . Programas.O padrão
ifconfig
que temos em muitas distribuições está obsoleto por vários motivos. Fala de forma desatualizada e limitada com o kernel, e de fato, não entende mais todas as configurações de rede. Você não poderá manipular algumas configurações de rede, taisifconfig
versões que você pode fazer comip
. Além disso, oifconfig
suporte para namespaces de rede é limitado.Como um conto anedótico, encontrei alias de IP de interface que são visíveis apenas
ip
e não no SuSEifconfig
.Quanto às diferenças sob o capô: De ifconfig vs ip: Qual é a diferença e comparando a configuração de rede
Sobre o uso/vantagens do netlink: De LJ - Kernel Korner - Por que e como usar o Netlink Socket