Handbuch:X86/Netzwerk/Fortgeschritten
Erweiterte Konfiguration
Die Variable config_eth0 ist das Herzstück einer Schnittstellenkonfiguration. Sie ist eine übergeordnete Befehlsliste für die Konfiguration der Schnittstelle (in diesem Fall eth0). Jeder Befehl in der Befehlsliste wird der Reihe nach ausgeführt. Die Schnittstelle gilt als OK, wenn mindestens ein Befehl funktioniert.
Hier ist eine Liste von eingebauten Anweisungen:
Wert | Beschreibung |
---|---|
null
|
Nichts tun. |
noop
|
Wenn die Schnittstelle aktiv ist und eine Adresse vorhanden ist, wird die Konfiguration erfolgreich abgebrochen. |
Eine IPv4 oder IPv6 Adresse | Hinzufügen der Adresse zur Schnittstelle. |
dhcp , adsl , oder apipa (oder ein benutzerdefinierter Wert aus einem Modul eines Drittanbieters)
|
Ausführen des Moduls, das den Befehl bereitstellt. Zum Beispiel wird dhcp ein Modul starten, das DHCP bereitstellt, das von dhcpcd, dhclient oder pump bedient werden kann.
|
Wenn ein Befehl fehlschlägt, geben Sie einen Fallback-Wert an. Der Fallback-Wert muss genau mit der Konfigurationsstruktur übereinstimmen.
Es ist möglich diese Werte miteinander zu verknüpfen. Hier sind einige Beispiele aus der Praxis:
# Hinzufügen von drei IPv4-Adressen
config_eth0="192.168.0.2/24
192.168.0.3/24
192.168.0.4/24"
# Hinzufügen einer IPv4-Adresse und zweier IPv6-Adressen
config_eth0="192.168.0.2/24
4321:0:1:2:3:4:567:89ab
4321:0:1:2:3:4:567:89ac"
# Behalten Sie unsere vom Kernel zugewiesene Adresse, es sei denn, die Schnittstelle geht
# aus, also weisen Sie eine anderen über DHCP zu. Wenn DHCP fehlschlägt, fügen Sie eine
# statische Adresse, die von APIPA ermittelt wird hinzu.
config_eth0="noop
dhcp"
fallback_eth0="null
apipa"
Wenn Sie das Modul
ifconfig
verwenden und mehr als eine Adresse hinzufügen werden für jede zusätzliche Adresse Schnittstellen-Aliase erstellt. In den beiden obigen Beispielen erhält der Benutzer also die Schnittstellen eth0, eth0:1 und eth0:2. Es ist nicht möglich, irgendetwas Spezielles mit diesen Schnittstellen zu tun, da der Kernel und andere Programme eth0:1 und eth0:2 einfach als eth0 behandeln.Die Rückfallreihenfolge ist wichtig! Wenn die Option null nicht angegeben wurde, wird
apipa
nur ausgeführt, wenn noop
fehlgeschlagen ist.{{NoteAPIPA (Handbuch) und DHCP (Handbuch) werden im modularer Netzwerkabschnitt behandelt.}}
Netzwerkabhängigkeiten
Init-Skripte in /etc/init.d/ können von einer bestimmten Netzwerkschnittstelle oder einfach von "net" abhängen. Alle Netzwerkschnittstellen in Gentoo's Init-System bieten das, was "net" genannt wird.
Wenn in /etc/rc.conf die Variable rc_depend_strict auf YES
gesetzt ist, dann müssen alle Netzwerkschnittstellen, die "net" bereitstellen, aktiv sein, bevor eine Abhängigkeit von "net" angenommen wird. Mit anderen Worten: Wenn ein System über net.eth0 und neth.eth1 verfügt und ein Init-Skript von "net" abhängig ist, müssen beide aktiviert sein.
Wenn hingegen rc_depend_strict="NO"
gesetzt ist, wird die "net"-Abhängigkeit als aufgelöst markiert, sobald mindestens eine Netzwerkschnittstelle aktiviert ist.
Aber was ist mit net.br0, das von net.eth0 und net.eth1 abhängt? net.eth1 könnte ein drahtloses oder PPP-Gerät sein, das konfiguriert werden muss, bevor es zur Bridge hinzugefügt werden kann. Dies kann nicht in /etc/init.d/net.br0 erfolgen, da dies ein symbolischer Link zu net.lo ist.
Die Antwort ist, eine rc_net_{schnittstelle}_need Einstellung in /etc/conf.d/net zu definieren:
rc_net_br0_need="net.eth0 net.eth1"
Das allein ist jedoch nicht ausreichend. Gentoos Netzwerk-Init-Skripte verwenden eine virtuelle Abhängigkeit namens "net", um dem System mitzuteilen, wann ein Netzwerk verfügbar ist. Im obigen Fall sollte das Netzwerk nur als verfügbar markiert sein, wenn net.br0 verfügbar ist, nicht wenn die anderen verfügbar sind. Also müssen wir das auch in /etc/conf.d/net angeben:
rc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"
Für eine detaillierte Diskussion über Abhängigkeiten lesen Sie bitte den Abschnitt über das Schreiben von Initskripten im Gentoo Handbuch. Weitere Informationen über /etc/rc.conf sind als Kommentare in dieser Datei verfügbar.
Variablennamen und -werte
Variablennamen sind dynamisch. Sie folgen normalerweise der Struktur von variable_${interface|mac|essid|apmac}
. Zum Beispiel enthält die Variable dhcpcd_eth0 den Wert für dhcpcd-Optionen für eth0 und dhcpcd_essid enthält den Wert für dhcpcd-Optionen, wenn eine Schnittstelle mit der ESSID "essid" verbunden ist.
Es gibt jedoch keine feste Regel, die besagt, dass Schnittstellennamen ethx sein müssen. Tatsächlich haben viele drahtlose Schnittstellen Namen wie wlanx, rax oder auch ethx. Außerdem können einige benutzerdefinierte Schnittstellen wie z.B. Bridges, einen beliebigen Namen erhalten. Um das Leben interessanter zu machen, können drahtlose Zugangspunkte Namen mit nicht-alphanumerischen Zeichen haben - dies ist wichtig, weil Benutzer Netzwerkparameter pro ESSID konfigurieren können.
Der Nachteil von all dem ist, dass Gentoo Bash-Variablen für die Vernetzung verwendet- und Bash kann nichts außerhalb der englischen Alphanumerik verwenden. Um diese Einschränkung zu umgehen, ändern wird jedes Zeichen, dass keine englische Alphanumerik ist, in ein _ (Unterstrich) Zeichen.
Ein weiterer Nachteil der Bash ist der Inhalt von Variablen - einige Zeichen müssen mit einem Escape-Zeichen versehen werden. Dies kann erreicht werden, indem man das Zeichen \ (Backslash) vor das Zeichen setzt, das escaped werden muss. Die folgende Liste von Zeichen muss auf diese Weise escaped werden: ", ' und \.
In diesem Beispiel verwenden wir eine drahtlose ESSID, da sie die meisten Zeichen enthalten kann. Wir verwenden die ESSID Mein "\ NET:
# Dies funktioniet zwar, aber die Domäne ist ungültig
dns_domain_My____NET="My \"\\ NET"
Die obige Einstellung setzt die DNS-Domäne auf Mein "\ NET, wenn eine drahtlose Karte eine Verbindung zu einem AP herstellt, dessen ESSID Mein \ NET ist:
Benennung der Netzwerkschnittstellen
Wie es funktioniert
Netzwerkschnittstellennamen werden nicht willkürlich gewählt: Der Linux-Kernel und der Gerätemanager (die meisten Systeme haben udev als Gerätemanager, obwohl auch andere verfügbar sind) wählen den Schnittstellennamen nach einem festen Regelwerk.
Wenn eine Schnittstellenkarte in einem System erkannt wird, sammelt der Linux-Kernel die notwendigen Daten über diese Karte. Dazu gehören:
- Der onboard (auf der Schnittstelle selbst) registrierte Name der Netzwerkkarte, der später durch den Wert ID_NET_NAME_ONBOARD angezeigt wird.
- Der Steckplatz, in dem die Netzwerkkarte eingesteckt ist, was später durch den ID_NET_NAME_SLOT Wert ersichtlich wird.
- Der Pfad, über den auf das Netzwerkkartengerät zugegriffen werden kann, der später durch den Wert von ID_NET_NAME_PATH angezeigt wird.
- Die (vom Hersteller bereitgestellte) MAC-Adresse der Karte, die später durch den Wert ID_NET_NAME_MAC angezeigt wird.
Auf der Grundlage dieser Informationen entscheidet der Gerätemanager, wie die Schnittstelle auf dem System benannt werden soll. Standardmäßig verwendet er den ersten Treffer der ersten drei oben genannten Variablen (ID_NET_NAME_ONBOARD, _SLOT oder _PATH). Wenn zum Beispiel ID_NET_NAME_ONBOARD gefunden und auf eno1 gesetzt wird, dann wird die Schnittstelle eno1 genannt.
Bei einem aktiven Schnittstellennamen können die Werte der angegebenen Variablen mit udevadm angezeigt werden:
root #
udevadm test-builtin net_id /sys/class/net/enp3s0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc. ID_NET_NAME_PATH=enp3s0
Da der erste (und eigentlich einzige) Treffer der obersten drei Variablen ID_NET_NAME_PATH ist, wird sein Wert als Schnittstellenname verwendet. Wenn keine der Variablen Wert enthält, kehrt das System zu der vom Kernel bereitgestellten Benennung zurück (eth0, eth1, usw.)
Verwendung der Kernel-Benennung im alten Stil
Vor dieser Änderung wurden Netzwerkkarten vom Linux-Kernel selbst benannt, abhängig von der Reihenfolge, in der die Treiber geladen werden (neben anderen, möglicherweise noch obskureren Gründen). Dieses Verhalten kann immer noch durch Setzen des Bootparameters net.ifnames=0
im Bootloader aktiviert werden.
Verwendung eigener Namen
Die Idee hinter der Namensänderung ist nicht, die Leute zu verwirren, sondern das Ändern der Namen zu erleichtern. Nehmen wir an, ein System hat zwei Schnittstellen, die anders als eth0 und eth1 bezeichnet werden. Eine ist für den drahtgebundenen Zugriff auf das Netzwerk gedacht, die andere für den drahtlosen Zugriff. Mit der Unterstützung für die Benennung von Schnittstellen können Benutzer diese als lan0 (kabelgebunden) und wifi0 (drahtlos) bezeichnen - es ist am besten, die bisher bekannten Namen wie eth* und wlan* zu vermeiden, da diese immer noch mit den vorgeschlagenen Namen kollidieren können.
Finden Sie heraus, welche Parameter für die Karten gelten, und verwenden Sie diese Informationen, um eine benutzerdefinierte eigene Benennungsregel aufzustellen:
root #
udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76 ID_OUI_FROM_DATABASE=Quanta Computer Inc.
root #
vim /etc/udev/rules.d/70-net-name-use-custom.rules
# Die erste verwendet MAC-Informationen und die 70-er Nummer, um vor anderen Netzregeln zu sein SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="c8:0a:a9:42:9d:76", NAME="lan0"
root #
vim /etc/udev/rules.d/76-net-name-use-custom.rules
# Second one uses ID_NET_NAME_PATH information, and 76- number to be between # 75-net-*.rules and 80-net-*.rules SUBSYSTEM=="net", ACTION=="add", ENV{ID_NET_NAME_PATH}=="enp3s0", NAME="wifi0"
Da die Regeln vor der Standardregel ausgelöst werden (die Regeln werden in alphanumerischer Reihenfolge ausgelöst d.h. 70 kommt vor 80), werden die in der Regeldatei angegebenen Namen anstelle der Standardnamen verwendet. Die der Datei zugewiesenen Nummer sollte zwischen 76 und 79 liegen (die Umgebungsvariablen werden durch eine Regel definiert, die mit 75 beginnt, und die Fallback-Benennung wird in einer Regel mit der Nummer 70 vorgenommen).