La ifconfig
commande sur les systèmes d'exploitation tels que FreeBSD et OpenBSD a été mise à jour en ligne avec le reste du système d'exploitation. De nos jours, il peut configurer toutes sortes de paramètres d'interface réseau sur ces systèmes d'exploitation et gérer une gamme de protocoles réseau. Les BSD ioctl()
prennent en charge ces éléments.
Cela ne s'est pas produit dans le monde Linux. Il existe, aujourd'hui, trois ifconfig
commandes:
ifconfig
de GNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 lo
jdebp% inetutils-ifconfig lo
lo Link encap: boucle locale
inet addr: 127.0.0.1 Bcast: 0.0.0.0 Mask: 255.0.0.0
UP LOOPBACK RUNNING MTU: 65536 Métrique: 1
Paquets RX: 9087 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
Paquets TX: 9087 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
collisions: 0 txqueuelen: 1000
Octets RX: 51214341 Octets TX: 51214341
jdebp%
-
ifconfig
de NET-3 net-tools jdebp% ifconfig -l
ifconfig: l'option --help 'donne des informations d'utilisation.-l' not recognised.
ifconfig:
jdebp% ifconfig lo
lo: flags = 73 <UP, LOOPBACK, RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 :: 1 prefixlen 128 scopeid 0x10 <hôte>
inet6 :: 2 prefixlen 128 scopeid 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 scopeid 0x20 <link>
boucle txqueuelen 1000 (boucle locale)
Paquets RX 9087 octets 51214341 (48,8 Mio)
Erreurs RX 0 supprimées 0 dépassements 0 trame 0
Paquets TX 9087 octets 51214341 (48,8 Mio)
Erreurs TX 0 abandonné 0 dépassements 0 porteuse 0 collisions 0
jdebp%
-
ifconfig
à partir de (la version 1.40 de) l'ensemble d'outils nosh jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
lo
relier le bouclage en cours d'exécution
adresse du lien 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
adresse inet4 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1
adresse inet4 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255
adresse inet6 :: 2 portée 0 préfixe 128
adresse inet6 fe80 :: scope 1 prefixlen 10
adresse inet6 :: 1 portée 0 préfixe 128
jdebp% sudo ifconfig lo inet4 127.1.0.2 alias
jdebp% sudo ifconfig lo inet6 :: 3/128 alias
jdebp% ifconfig lo
lo
relier le bouclage en cours d'exécution
adresse du lien 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
adresse inet4 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1
adresse inet4 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2
adresse inet4 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255
adresse inet6 :: 3 portée 0 préfixe 128
adresse inet6 :: 2 portée 0 préfixe 128
adresse inet6 fe80 :: scope 1 prefixlen 10
adresse inet6 :: 1 portée 0 préfixe 128
jdebp%
Comme vous pouvez le voir, les inetutils GNU et les net-tools NET-3 ifconfig
ont des lacunes marquées, par rapport à IPv6, par rapport aux interfaces qui ont plusieurs adresses, et par rapport aux fonctionnalités comme -l
.
Le problème IPv6 est en partie du code manquant dans les outils eux-mêmes. Mais dans l'ensemble, cela est dû au fait que Linux ne fournit pas (comme les autres systèmes d'exploitation) la fonctionnalité IPv6 via l' ioctl()
interface. Il permet uniquement aux programmes de voir et de manipuler les adresses IPv4 via les réseaux ioctl()
.
Linux fournit à la place cette fonctionnalité via une interface différente, send()
et recv()
sur une spéciale, et un peu étrange, famille d'adresses de sockets, AF_NETLINK
.
GNU et NET-3 ifconfig
s pourraient avoir été ajustés pour utiliser cette nouvelle API. L'argument contre cela était qu'il n'était pas portable sur d'autres systèmes d'exploitation, mais ces programmes n'étaient en fait déjà pas portables de toute façon, ce qui n'était pas vraiment un argument.
Mais ils n'ont pas été ajustés, et restent comme indiqué à ce jour. (Certaines personnes y ont travaillé à divers moments au fil des ans, mais les améliorations, malheureusement pour ne pas être entrées dans les programmes. Par exemple: Bernd Eckenfels n'a jamais accepté un correctif qui a ajouté une capacité d'API netlink aux net-tools NET-3. ifconfig
, 4 ans après l'écriture du patch.)
Au lieu de cela, certaines personnes ont complètement réinventé le jeu d'outils en tant que ip
commande, qui utilisait la nouvelle API Linux, avait une syntaxe différente et combinait plusieurs autres fonctions derrière une interface de style à la mode .command subcommand
J'avais besoin d'un ifconfig
qui avait la syntaxe de ligne de commande et le style de sortie de FreeBSD ifconfig
(que ni GNU ni NET-3 n'ont ifconfig
, et qui ip
n'a certainement pas). J'en ai donc écrit un. Comme preuve que l'on pourrait écrire un ifconfig
qui utilise l'API netlink sur Linux, il le fait.
Donc, la sagesse reçue ifconfig
, comme ce que vous citez, n'est plus vraiment vraie. Il est désormais faux de dire que " ifconfig
n'utilise pas netlink". La couverture qui en couvrait deux ne couvre pas trois.
Il a toujours été faux de dire que "netlink est plus efficace". Pour les tâches que l'on fait ifconfig
, il n'y a pas vraiment grand-chose en termes d'efficacité entre l'API netlink et l' ioctl()
API. On fait à peu près le même nombre d'appels d'API pour une tâche donnée.
En effet, chaque appel d'API correspond à deux appels système dans le cas netlink, par opposition à un dans le ioctl()
système. Et sans doute l'API netlink a l'inconvénient que sur un système très utilisé, elle intègre explicitement la possibilité que l'outil ne reçoive jamais de message d'accusé de réception l'informant du résultat de l'appel API.
Il est, en outre, faux de dire que ip
« plus polyvalent » que GNU et NET-3 ifconfig
s parce qu'il utilise NetLink . Il est plus polyvalent car il fait plus de tâches, en faisant des choses dans un grand programme que l'on ferait avec des programmes distincts autres que ifconfig
. Il n'est pas plus polyvalent simplement grâce à l'API qu'il utilise en interne pour effectuer ces tâches supplémentaires. Il n'y a rien d'inhérent à l'API à ce sujet. On pourrait écrire un tout-en-un qui a utilisé le FreeBSD ioctl()
API, par exemple, et aussi bien l' état qu'il est « plus souple » que l'individu ifconfig
, route
, arp
et les ndp
commandes.
On pourrait aussi écrire route
, arp
et des ndp
commandes pour Linux qui utilisaient l'API netlink.
Lectures complémentaires
ip
plus polyvalent, car toutes sortes de fonctionnalités intéressantes sont tout simplement impossibles à faire en utilisant ioctls sur Linux (car les ioctls ne sont pas là et ne le seront probablement jamais).