comprender los comandos "ip addr change" y "ip addr replace"

10

En este momento tengo las siguientes direcciones IPv4 asociadas con la interfaz 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:~ # 

Me gustaría reemplazar o cambiar la dirección 10.11.12.3/24 a 10.11.12.6/24. ¿Como hacer esto? Si ejecuto ip addr change 10.11.12.6/24 dev eth0o ip addr replace 10.11.12.6/24 dev eth010.11.12.6 solo se agrega a eth0. Además, en caso de cambio / reemplazo, ¿no debería ser la sintaxis change/replace from 10.11.12.3/24 to 10.11.12.6/24? Sé que puedo usar el ip addr delcomando, pero ¿cómo lograrlo con ip addr changeo ip addr replace?

Martín
fuente

Respuestas:

19

(Sé que esto es una cuestión de edad, pero Google me traje aquí porque yo estaba tratando de averiguar exactamente qué changey replacehago y cómo son diferentes).

Creo que ambos replacey changese utilizan para modificar una dirección existente. Considerar:

ip addr add 192.168.1.10/32 dev dummy0

Esto me atrapa:

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 ejecuto el mismo comando nuevamente, aparece un error:

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

Si quiero modificar las banderas en esa dirección, puedo usar changeo replace. Aquí, uso ip addr changepara modificar la configuración preferred_lfty valid_lften esa dirección:

# 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

El comportamiento de ip addr replacees idéntico. De hecho, si observa el código, resultan en acciones casi idénticas:

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

Parece que la intención aquí es que changesolo modificará una dirección existente, mientras replaceque modificará una dirección existente o creará una nueva si la dirección especificada no existe. En la práctica, parece que ambos changey replaceagregarán la dirección si aún no existe.

Si realmente desea agregar una nueva dirección y eliminar una antigua, deberá hacerlo en dos pasos, usando ip addr delseguido de ip addr add(o al revés, por supuesto).

larsks
fuente
Gracias por esta respuesta Me ahorró a mi entorno de producción un montón de tiempo de inactividad (si solo lo hubiera encontrado antes, podría haber tenido NO P0s :()
Samveen