Verständnis der Befehle "ip addr change" und "ip addr replace"

10

Im Moment habe ich folgende IPv4-Adressen, die mit der eth0- Schnittstelle verknüpft sind :

T60:~ # ip -V
ip utility, iproute2-ss110629
T60:~ # ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:15:58:2a:84:3e brd ff:ff:ff:ff:ff:ff
    inet 10.11.12.2/24 scope global eth0
    inet 10.11.12.3/24 scope global secondary eth0
    inet 10.11.12.4/24 scope global secondary eth0
    inet6 fe80::215:58ff:fe2a:843e/64 scope link 
       valid_lft forever preferred_lft forever
T60:~ # 

Ich möchte die Adresse 10.11.12.3/24 in 10.11.12.6/24 ersetzen oder ändern. Wie macht man das? Wenn ich ausführe ip addr change 10.11.12.6/24 dev eth0oder ip addr replace 10.11.12.6/24 dev eth0dann wird 10.11.12.6 nur zu eth0 hinzugefügt. Sollte die Syntax bei Änderungen / Ersetzungen nicht auch so sein change/replace from 10.11.12.3/24 to 10.11.12.6/24? Ich weiß, dass ich ip addr delBefehle verwenden kann, aber wie kann ich dies mit ip addr changeoder erreichen ip addr replace?

Martin
quelle

Antworten:

19

(Mir ist klar, dass dies eine alte Frage ist, aber Google hat mich hierher gebracht, weil ich versucht habe, genau herauszufinden, was changeund was zu replacetun ist und wie sie sich unterscheiden.)

Ich glaube, dass beide replaceund changezum Ändern einer vorhandenen Adresse verwendet werden. Erwägen:

ip addr add 192.168.1.10/32 dev dummy0

Das bringt mich:

32: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 
    link/ether 5a:ec:58:4f:d1:35 brd ff:ff:ff:ff:ff:ff
    inet 192.168.111.10/32 scope global dummy0
       valid_lft forever preferred_lft forever
    inet6 fe80::58ec:58ff:fe4f:d135/64 scope link 
       valid_lft forever preferred_lft forever

Wenn ich denselben Befehl erneut ausführe, wird folgende Fehlermeldung angezeigt:

# ip addr add 192.168.111.10/32 dev dummy0 
RTNETLINK answers: File exists

Wenn ich die Flags an dieser Adresse ändern möchte, kann ich entweder changeoder verwenden replace. Hier verwende ich ip addr change, um die preferred_lftund valid_lftEinstellungen für diese Adresse zu ändern :

# ip addr change 192.168.111.10/32 dev dummy0  preferred_lft 300 valid_lft 300
# ip addr show dummy0
32: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default 
    link/ether 5a:ec:58:4f:d1:35 brd ff:ff:ff:ff:ff:ff
    inet 192.168.111.10/32 scope global dynamic dummy0
       valid_lft 298sec preferred_lft 298sec
    inet6 fe80::58ec:58ff:fe4f:d135/64 scope link 
       valid_lft forever preferred_lft forever

Das Verhalten von ip addr replaceist identisch. Wenn Sie sich den Code ansehen, führen sie tatsächlich zu fast identischen Aktionen:

    if (matches(*argv, "change") == 0 ||
            strcmp(*argv, "chg") == 0)
            return ipaddr_modify(RTM_NEWADDR, NLM_F_REPLACE, argc-1, argv+1);
    if (matches(*argv, "replace") == 0)
            return ipaddr_modify(RTM_NEWADDR, NLM_F_CREATE|NLM_F_REPLACE, argc-1, argv+1);

Es sieht so aus, als ob hier changenur eine vorhandene Adresse geändert werden soll, während replaceentweder eine vorhandene Adresse geändert oder eine neue erstellt wird, wenn die angegebene Adresse nicht vorhanden ist. In der Praxis scheint es, als ob beide changeund replacedie Adresse hinzufügen, wenn sie noch nicht existiert.

Wenn Sie tatsächlich eine neue Adresse hinzufügen und eine alte entfernen möchten, müssen Sie dies in zwei Schritten tun, ip addr delgefolgt von ip addr add(oder natürlich umgekehrt).

Larsks
quelle
Vielen Dank für diese Antwort. Es ersparte meiner Produktionsumgebung eine Menge Ausfallzeiten (wenn ich es nur früher gefunden hätte, hätte ich NO P0s :( haben können)
Samveen