zrozumienie poleceń „ip addr change” i „ip addr replace”

10

W tej chwili mam następujące adresy IPv4 związane z interfejsem 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:~ # 

Chciałbym zastąpić lub zmienić adres 10.11.12.3/24 na 10.11.12.6/24. Jak to zrobić? Gdybym wykonać ip addr change 10.11.12.6/24 dev eth0lub ip addr replace 10.11.12.6/24 dev eth0następnie 10.11.12.6 jest po prostu dodaje się do eth0. Ponadto w przypadku zmiany / zamiany nie powinna być składnia change/replace from 10.11.12.3/24 to 10.11.12.6/24? Wiem, że mogę używać ip addr delpolecenia, ale jak to osiągnąć za pomocą ip addr changelub ip addr replace?

Jaskółka oknówka
źródło

Odpowiedzi:

19

(Zdaję sobie sprawę, że jest to stare pytanie, ale Google przyniósł mi tutaj bo próbuje dowiedzieć się dokładnie, co changei replacerobić i jak są one różne).

Uważam, że zarówno replacei changesą wykorzystywane do modyfikacji istniejącego adresu. Rozważać:

ip addr add 192.168.1.10/32 dev dummy0

To daje mi:

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

Jeśli ponownie uruchomię to samo polecenie, pojawia się błąd:

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

Jeśli chcę, aby zmodyfikować flagi na ten adres, mogę użyć jednej changelub replace. Tutaj używam ip addr changedo modyfikowania preferred_lfti valid_lftustawień tego adresu:

# 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

Zachowanie ip addr replacejest identyczne. W rzeczywistości, jeśli spojrzysz na kod, skutkują prawie identycznymi działaniami:

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

Wygląda na to, że intencją jest to, że changezmodyfikuje tylko istniejący adres, replacealbo albo zmodyfikuje istniejący adres, albo utworzy nowy, jeśli podany adres nie istnieje. W praktyce wydaje się, że jedno changei drugie replacedoda adres, jeśli jeszcze nie istnieje.

Jeśli rzeczywiście chcesz dodać nowy adres i usunąć starą, trzeba to zrobić w dwóch etapach, korzystając ip addr delnastępnie ip addr add(lub na odwrót, oczywiście).

Larsks
źródło
Dziękuję za tę odpowiedź. Zaoszczędziło to moje środowisko produkcyjne mnóstwo przestojów (gdybym tylko go wcześniej znalazł, mógłbym mieć NO P0s :()
Samveen