YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

hostnameに翻弄された日

経緯

ある製品がインストールされた環境のhostnameを変更しなければならなくなった。

対応

/etc/hosts, /etc/sysconfig/network

まずはこの二つのファイルでhost名を各々設定。元のhostnameをpiyo、新規hostnameをhogeとする。

  • /etc/hosts
127.0.0.1    localhost.localdomain    localhost
192.168.1.100    hoge.example.com    hoge
  • /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=hoge.example.com

で、これで再起動してみたけれど相変わらず

$ hostname
piyo

となる。

/etc/sysctl.conf

おかしいなと思っていろいろ思案してたときに、「カーネルパラメータの設定方法教えて」といわれたんで教えてたらそこでピカーンと思い出した。そういえばカーネルパラメータにもhostnameあったなと。

$ sysctl kernel.hostname
piyo
$ sysctl kernel.hostname=hoge
$ sysctl kernel.hostname
hoge

これで再起動すれば大丈夫かな、と思って確認。

$ hostname
hoge

はい、大丈夫。…と思っていろいろ作業してたらどうもおかしいなと思って見てみたらなんと

$ echo $HOSTNAME
piyo

これはどういうことだ!どう考えてもおかしい。しかもrootユーザになってみると

# hostname
hoge
# echo $HOSTNAME
hoge

ということは完全にユーザの設定ファイルレベルでの話。しかし.bashrcとかに何もないので考えられるのは/etc/rc.d内のスクリプトがおかしいということぐらい。

/etc/rc.d

各run levelに対応したrc*.dのディレクトリがあるわけだけど、その中で明らかにパッケージインストールではないスクリプトを発見。そのスクリプトの中で呼び出しているスクリプトを掘って、掘って…してみると、なんと下記のコードを発見。

...
export HOSTNAME=piyo
...

なんとハードコードされてるじゃないですか!というわけでこの部分を修正して無事問題を解決しました。めでたし。

まとめ

hostまわりの設定は下記を確認すること。

  1. /etc/sysconfig/network
  2. /etc/sysconfig/network-scripts/ifcfg-eth*
  3. /etc/hosts
  4. /etc/sysctl.conf
  5. /etc/rc.dで呼ばれてるスクリプト