memahami perintah “ip addr change” dan “ip addr replace”

10

Saat ini saya telah mengikuti alamat IPv4 yang terkait dengan antarmuka 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:~ # 

Saya ingin mengganti atau mengubah alamat 10.11.12.3/24 menjadi 10.11.12.6/24. Bagaimana cara melakukannya? Jika saya menjalankan ip addr change 10.11.12.6/24 dev eth0atau ip addr replace 10.11.12.6/24 dev eth0kemudian 10.11.12.6 baru saja ditambahkan ke eth0. Selain itu, dalam hal perubahan / penggantian, bukankah seharusnya sintaks itu change/replace from 10.11.12.3/24 to 10.11.12.6/24? Saya tahu bahwa saya dapat menggunakan ip addr delperintah, tetapi bagaimana cara mencapai ini dengan ip addr changeatau ip addr replace?

Martin
sumber

Jawaban:

19

(Saya menyadari ini adalah pertanyaan lama, tetapi Google membawa saya ke sini karena saya mencoba mencari tahu apa changedan apa yang replacedilakukan dan bagaimana mereka berbeda).

Saya percaya bahwa keduanya replacedan changedigunakan untuk memodifikasi alamat yang ada. Mempertimbangkan:

ip addr add 192.168.1.10/32 dev dummy0

Ini membuat saya:

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

Jika saya menjalankan perintah yang sama lagi, saya mendapatkan kesalahan:

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

Jika saya ingin memodifikasi tanda pada alamat itu, saya dapat menggunakan salah satu changeatau replace. Di sini, saya gunakan ip addr changeuntuk memodifikasi preferred_lftdan valid_lftpengaturan pada alamat itu:

# 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

Perilaku ip addr replaceidentik. Bahkan, jika Anda melihat kode, mereka menghasilkan tindakan yang hampir identik:

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

Sepertinya maksudnya di sini adalah bahwa changehanya akan mengubah alamat yang ada, sementara replaceakan mengubah alamat yang ada atau membuat yang baru jika alamat yang ditentukan tidak ada. Dalam praktiknya, sepertinya keduanya changedan replaceakan menambahkan alamat jika belum ada.

Jika Anda benar-benar ingin menambahkan alamat baru dan menghapus yang lama, Anda harus melakukannya dalam dua langkah, menggunakan ip addr deldiikuti oleh ip addr add(atau sebaliknya, tentu saja).

larsks
sumber
Terima kasih atas jawaban ini. Ini menyelamatkan lingkungan produksi saya satu ton downtime (jika saja saya menemukannya lebih awal, saya bisa saja punya NO P0s :()
Samveen