昨日、データセンターの(物理)サーバーをすばやく再インストールしました。時間が足りず、データベースに簡単にアクセスできなかったので、利用できることがわかっているIPを割り当てただけで、後で割り当てることができます。正しいアドレスを入力して、暖かい場所からプロビジョニングを続行します。
今日私は(172.16.130.10/22で)サーバーにログインし、次のことを行いました。
ip addr add 172.16.128.67/22 dev eth0
ローカルワークステーションのターミナルから、新しいアドレスへのpingに応答することを確認し、そこからログインしました。
$ ping 172.16.128.67
PING 172.16.128.67 (172.16.128.67) 56(84) bytes of data.
64 bytes from 172.16.128.67: icmp_req=2 ttl=62 time=3.61 ms
64 bytes from 172.16.128.67: icmp_req=3 ttl=62 time=4.87 ms
^C
$ ssh 172.16.128.67
これまでのところ、私は新しいIPアドレスを介して接続されており、古いIPアドレスは不要になりました。私は先に進んでそれを削除しました:
ip addr del 172.16.130.10/22 dev eth0
しかし、私がヒットするとすぐ Enter SSHセッションがフリーズし、接続できなくなりました。現場のオペレーターにサーバーの再起動を依頼する必要がありました。
どこで私は間違えましたか?そのアドレスを削除すると接続が切断されるのはなぜですか?
Linuxでは、IPアドレスには「プライマリ」アドレスと「セカンダリ」アドレスの概念があります。プライマリは通常、システムに追加する最初のアドレスです。プライマリアドレスの削除には、セカンダリアドレスのリスト全体をフラッシュするという暗黙の操作もあります。
Sysctl net.ipv4.conf.all.promote_secondaries
を次のように1に設定すると、この動作を回避できます。
sysctl -w net.ipv4.conf.all.promote_secondaries=1
これにより、プライマリIPが削除されても残りのアドレスはフラッシュされず、代わりに新しいIPアドレスがプライマリとして昇格するように動作が変更されます。