comprendre les commandes «ip addr change» et «ip addr replace»

10

Pour le moment, j'ai les adresses IPv4 suivantes associées à l' interface eth0 :

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:~ # 

Je souhaite remplacer ou remplacer l'adresse 10.11.12.3/24 par 10.11.12.6/24. Comment faire ça? Si j'exécute ip addr change 10.11.12.6/24 dev eth0ou ip addr replace 10.11.12.6/24 dev eth0alors 10.11.12.6 est juste ajouté à eth0. De plus, en cas de changement / remplacement, la syntaxe ne devrait-elle pas être change/replace from 10.11.12.3/24 to 10.11.12.6/24? Je sais que je peux utiliser la ip addr delcommande, mais comment y parvenir avec ip addr changeou ip addr replace?

Martin
la source

Réponses:

19

(Je me rends compte que c'est une vieille question, mais Google m'a amené ici parce que j'essayais de comprendre exactement quoi changeet replacefaire et comment ils sont différents).

Je crois que les deux replaceet changesont utilisés pour modifier une adresse existante. Considérer:

ip addr add 192.168.1.10/32 dev dummy0

Cela me fait:

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

Si j'exécute à nouveau la même commande, j'obtiens une erreur:

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

Si je veux modifier les drapeaux sur cette adresse, je peux utiliser soit changeou replace. Ici, j'utilise ip addr changepour modifier les paramètres preferred_lftet valid_lftsur cette adresse:

# 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

Le comportement de ip addr replaceest identique. En fait, si vous regardez le code, ils entraînent des actions presque identiques:

    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);

Il semble que l'intention ici est de changemodifier uniquement une adresse existante, tout replaceen modifiant une adresse existante ou en créant une nouvelle si l'adresse spécifiée n'existe pas. Dans la pratique, il semble que si les deux changeet replaceajoutera l'adresse si elle n'existe pas déjà.

Si vous voulez réellement ajouter une nouvelle adresse et supprimer une ancienne, vous devrez le faire en deux étapes, en utilisant ip addr delsuivi de ip addr add(ou l'inverse, bien sûr).

larsks
la source
Merci pour cette réponse. Cela a sauvé mon environnement de production d'une tonne de temps d'arrêt (si seulement je l'avais trouvé plus tôt, j'aurais pu avoir NO P0s :()
Samveen