Назад | Перейти на главную страницу

понимание команд «ip addr change» и «ip addr replace»

На данный момент у меня есть следующие 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?

(Я понимаю, что это старый вопрос, но 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 (или, конечно, наоборот).