розуміння команд “ip addr change” та “ip addr change”


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(або, навпаки, звичайно).


Дякую за цю відповідь. Це врятувало моє виробниче середовище безліч простоїв (якби тільки я його знайшов раніше, я міг би мати такі NO P0:()
Samveen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.