現在、私はethインターフェイスに関連付けられた次のIPv4アドレスを持っています。
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
を実行すると、eth0に10.11.12.6が追加されます。さらに、変更/置換の場合、構文はchange/replace from 10.11.12.3/24 to 10.11.12.6/24
にすべきではありませんか? ip addr del
コマンドを使用できることはわかっていますが、ip addr change
またはip addr replace
を使用してこれを実現するにはどうすればよいですか。
(私はこれが古い質問であることを理解していますが、change
とreplace
の機能とそれらの違いを正確に把握しようとしていたため、Googleがここに連れて行ってくれました)。
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
を使用して(またはその逆ももちろん)、2つの手順で行う必要があります。