понимать команды «ip addr change» и «ip addr replace»

10

На данный момент у меня есть следующие IPv4-адреса, связанные с интерфейсом 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:~ # 

Я хотел бы заменить или изменить адрес 10.11.12.3/24 на 10.11.12.6/24. Как это сделать? Если я выполню ip addr change 10.11.12.6/24 dev eth0или ip addr replace 10.11.12.6/24 dev eth0тогда 10.11.12.6 будет просто добавлен к eth0. Кроме того, в случае изменения / замены не должно быть синтаксиса change/replace from 10.11.12.3/24 to 10.11.12.6/24? Я знаю, что могу использовать ip addr delкоманду, но как этого добиться с помощью ip addr changeили ip addr replace?

Мартин
источник

Ответы:

19

(Я понимаю, что это старый вопрос, но Google привел меня сюда, потому что я пытался выяснить, что именно changeи replaceчем они отличаются и чем они отличаются).

Я считаю, что оба replaceи changeиспользуются для изменения существующего адреса. Рассматривать:

ip addr add 192.168.1.10/32 dev 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 dummy0
       valid_lft forever preferred_lft forever
    inet6 fe80::58ec:58ff:fe4f:d135/64 scope link 
       valid_lft forever preferred_lft forever

Если я снова запускаю ту же команду, я получаю сообщение об ошибке:

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

Если я хочу изменить флаги на этом адресе, я могу использовать либо changeили replace. Здесь я использую ip addr changeдля изменения preferred_lftи valid_lftнастройки на этом адресе:

# 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

Поведение ip addr replaceидентично. Фактически, если вы посмотрите на код, они приводят к почти одинаковым действиям:

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

Похоже, что здесь есть намерение changeизменить только существующий адрес, replaceлибо изменить существующий адрес, либо создать новый, если указанный адрес не существует. На практике кажется, что оба changeи replaceдобавят адрес, если он еще не существует.

Если вы действительно хотите добавить новый адрес и удалить старый, вам нужно будет сделать это в два шага, используя, ip addr delа затем ip addr add(или наоборот, конечно).

larsks
источник
Спасибо за этот ответ. Это спасло мою производственную среду от тонны простоев (если бы я нашел это раньше, у меня могли бы быть NO P0s :()
Самвин