compreendendo os comandos “ip addr change” e “ip addr replace”


10

No momento, tenho os seguintes endereços IPv4 associados à 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:~ # 

Gostaria de substituir ou alterar o endereço 10.11.12.3/24 para 10.11.12.6/24. Como fazer isso? Se eu executar ip addr change 10.11.12.6/24 dev eth0ou, em ip addr replace 10.11.12.6/24 dev eth0seguida, 10.11.12.6 será adicionado apenas a eth0. Além disso, em caso de alteração / substituição, a sintaxe não deveria ser change/replace from 10.11.12.3/24 to 10.11.12.6/24? Eu sei que posso usar o ip addr delcomando, mas como conseguir isso com ip addr changeou ip addr replace?

Respostas:


19

(Eu sei que essa é uma pergunta antiga, mas o Google me trouxe aqui porque eu estava tentando descobrir exatamente o que changee o que replacefazer e como eles são diferentes).

Eu acredito que ambos replacee changesão usados ​​para modificar um endereço existente. Considerar:

ip addr add 192.168.1.10/32 dev dummy0

Isso me deixa:

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

Se eu executar o mesmo comando novamente, recebo um erro:

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

Se eu quiser modificar os sinalizadores nesse endereço, posso usar changeou replace. Aqui, eu uso ip addr changepara modificar as configurações preferred_lfte valid_lftnesse endereço:

# 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

O comportamento de ip addr replaceé idêntico. De fato, se você olhar para o código, eles resultam em ações quase 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 a intenção aqui é que changeapenas modifique um endereço existente, enquanto replacemodifique um endereço existente ou crie um novo se o endereço especificado não existir. Na prática, parece que ambos changee replaceadicionará o endereço se ele ainda não existir.

Se você realmente deseja adicionar um novo endereço e remover um antigo, precisará fazer isso em duas etapas, usando ip addr delseguido por ip addr add(ou vice-versa, é claro).


Obrigado por esta resposta. Ele salvou minha ambiente de produção de uma tonelada de tempo de inatividade (se eu tivesse encontrado mais cedo, eu poderia ter tido NO P0s :()
Samveen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.