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?

Martin
fonte

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

larsks
fonte
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