Der ifconfig
Befehl auf Betriebssystemen wie FreeBSD und OpenBSD wurde entsprechend dem Rest des Betriebssystems aktualisiert. Es kann heutzutage alle Arten von Netzwerkschnittstelleneinstellungen auf diesen Betriebssystemen konfigurieren und eine Reihe von Netzwerkprotokollen verarbeiten. Die BSDs bieten ioctl()
Unterstützung für diese Dinge.
Dies war in der Linux-Welt nicht der Fall. Heute gibt es drei ifconfig
Befehle:
ifconfig
von GNU inetutilsjdebp% inetutils-ifconfig -l
enp14s0 enp15s0 lo
jdebp% inetutils-ifconfig lo
lo Link encap: Lokales Loopback
inet addr: 127.0.0.1 Bcast: 0.0.0.0 Mask: 255.0.0.0
UP LOOPBACK RUNNING MTU: 65536 Metrisch: 1
RX-Pakete: 9087 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
TX-Pakete: 9087 Fehler: 0 verworfen: 0 Überschreitungen: 0 Träger: 0
Kollisionen: 0 txqueuelen: 1000
Empfangsbytes: 51214341 Sendebytes: 51214341
jdebp%
-
ifconfig
von NET-3 net-tools jdebp% ifconfig -l
ifconfig: Option --help 'gibt Informationen zur Verwendung.-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 <host>
inet6 :: 2 prefixlen 128 scopeid 0x80 <compat, global>
inet6 fe80 :: prefixlen 10 scopeid 0x20 <link>
loop txqueuelen 1000 (Local Loopback)
RX-Pakete 9087 Bytes 51214341 (48,8 MiB)
RX-Fehler 0 fallen gelassen 0 überschreitet 0 Frame 0
TX-Pakete 9087 Bytes 51214341 (48,8 MiB)
TX-Fehler 0 fallen gelassen 0 Überholungen 0 Träger 0 Kollisionen 0
jdebp%
-
ifconfig
aus dem nosh toolset (version 1.40) jdebp% ifconfig -l
enp14s0 enp15s0 lo
jdebp% ifconfig lo
lo
Link up Loopback läuft
Verbindungsadresse 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
inet4-Adresse 127.0.0.1 Präfix 8 bdaddr 127.0.0.1
inet4 address 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255
inet6 address :: 2 scope 0 prefixlen 128
inet6 adresse fe80 :: scope 1 prefixlen 10
inet6 address :: 1 scope 0 prefixlen 128
jdebp% sudo ifconfig lo inet4 127.1.0.2 alias
jdebp% sudo ifconfig lo inet6 :: 3/128 alias
jdebp% ifconfig lo
lo
Link up Loopback läuft
Verbindungsadresse 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00
inet4-Adresse 127.0.0.1 Präfix 8 bdaddr 127.0.0.1
inet4 address 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2
inet4 address 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255
inet6 address :: 3 scope 0 prefixlen 128
inet6 address :: 2 scope 0 prefixlen 128
inet6 adresse fe80 :: scope 1 prefixlen 10
inet6 address :: 1 scope 0 prefixlen 128
jdebp%
Wie Sie sehen können, weisen die GNU-Inetutils und NET-3-Net-Tools ifconfig
einige deutliche Mängel in Bezug auf IPv6, in Bezug auf Schnittstellen mit mehreren Adressen und in Bezug auf Funktionen wie -l
.
Das IPv6-Problem besteht zum Teil darin, dass in den Tools selbst Code fehlt. Dies liegt hauptsächlich daran, dass Linux (wie andere Betriebssysteme auch) keine IPv6-Funktionalität über die ioctl()
Schnittstelle bereitstellt. Hiermit können Programme nur IPv4-Adressen über das Netzwerk anzeigen und bearbeiten ioctl()
.
Linux bietet diese Funktionalität stattdessen über eine andere Oberfläche send()
und recv()
über eine spezielle, etwas merkwürdige Adressfamilie von Sockets AF_NETLINK
.
Das GNU und NET-3 ifconfig
s könnte angepasst wurde , um diese neue API zu verwenden. Das Argument gegen so tun war , dass es auf andere Betriebssysteme nicht tragbar war, aber diese Programme in der Praxis waren bereits nicht tragbar sowieso , so dass nicht viel von einem Argument war.
Sie wurden jedoch nicht angepasst und sind bis heute unverändert geblieben. (Einige Leute haben im Laufe der Jahre an verschiedenen Stellen daran gearbeitet, aber die Verbesserungen haben es leider nie in die Programme geschafft. Zum Beispiel: Bernd Eckenfels hat nie einen Patch akzeptiert , mit dem NET-3-Netzwerktools um einige Netlink-API-Funktionen erweitert wurden ifconfig
, 4 Jahre nachdem der Patch geschrieben wurde.)
Stattdessen haben einige das Toolset als ip
Befehl völlig neu erfunden , der die neue Linux-API verwendete, eine andere Syntax aufwies und mehrere andere Funktionen hinter einer modischen Oberfläche kombinierte .command subcommand
Ich brauchte eine ifconfig
, die die Befehlszeilensyntax und den Ausgabestil von FreeBSD hatte ifconfig
(die weder GNU noch NET-3 ifconfig
haben und die es mit ip
Sicherheit nicht hat). Also habe ich einen geschrieben. Als Beweis dafür, dass man ein ifconfig
Programm schreiben kann , das die netlink-API unter Linux verwendet, ist dies der Fall.
Die erhaltene Weisheit darüber ifconfig
, wie Sie es zitieren, ist also nicht mehr wirklich wahr. Es ist jetztifconfig
falsch zu sagen, dass " Netlink nicht verwendet". Die Decke, die zwei bedeckt, bedeckt nicht drei.
Es war schon immer falsch zu sagen, dass "netlink effizienter ist". Für die Aufgaben, die man erledigt ifconfig
, steckt nicht wirklich viel darin, wenn es um die Effizienz zwischen der Netlink-API und der ioctl()
API geht. Man führt für jede Aufgabe so ziemlich die gleiche Anzahl von API-Aufrufen durch.
In der Tat besteht jeder API-Aufruf im Fall von Netlink aus zwei Systemaufrufen, im Gegensatz zu einem im ioctl()
System. Und die Netlink-API hat wohl den Nachteil, dass sie auf einem stark genutzten System explizit die Möglichkeit beinhaltet, dass das Tool niemals eine Bestätigungsnachricht erhält, die es über das Ergebnis des API-Aufrufs informiert.
Es ist darüber hinaus unwahr zu sagen , dass ip
„vielseitige“ als das GNU und NET-3 ifconfig
s , weil es netlink verwendet . Es ist vielseitiger, weil es mehr Aufgaben erledigt, als mit anderen Programmen ifconfig
. Einfach aufgrund der API, die es intern zur Ausführung dieser zusätzlichen Aufgaben verwendet, ist es nicht vielseitiger. Die API hat nichts damit zu tun. Man könnte ein All-in-one - Tool schreiben, die die FreeBSD verwendet ioctl()
API, zum Beispiel, und gleichermaßen gut Zustand , dass es „vielseitigen“ als die einzelnen ifconfig
, route
, arp
, und ndp
Befehle.
Man könnte , und Befehle für Linux schreiben route
, die auch die Netlink-API verwenden.arp
ndp
Weitere Lektüre
ip
vielseitiger macht , weil alle Arten von coolen Funktionen mit ioctls unter Linux einfach unmöglich sind (weil die ioctls nicht da sind und wahrscheinlich niemals da sein werden).