(Eu sei que essa é uma pergunta antiga, mas o Google me trouxe aqui porque eu estava tentando descobrir exatamente o que change
e replace
fazem e como eles são diferentes).
Acredito que replace
e change
são usados para modificar um endereço existente. Considere:
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 change
ou replace
. Aqui, uso ip addr change
para modificar as configurações de preferred_lft
e valid_lft
nesse 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 o código, elas resultarão 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 change
modificará somente um endereço existente, enquanto replace
modificará um endereço existente ou criará um novo se o endereço especificado não existir. Na prática, parece que ambos change
e replace
adicionarão o endereço se ele ainda não existir.
Se você realmente quiser adicionar um novo endereço e remover um antigo, será necessário fazer isso em duas etapas, usando ip addr del
seguido de ip addr add
(ou o contrário, é claro).