Debianにおける127.0.1.1の取り扱い

Kubernetes The Hard Wayを進めていたら、クラスタノードのホスト名の設定において /etc/hosts 書き換えるというものがあった。 この中で、 127.0.1.1 のエントリを書き換えるという操作があった。

while read IP FQDN HOST SUBNET; do 
    CMD="sed -i 's/^127.0.1.1.*/127.0.1.1\t${FQDN} ${HOST}/' /etc/hosts"
    ssh -n root@${IP} "$CMD"
    ssh -n root@${IP} hostnamectl hostname ${HOST}
done < machines.txt

この 127.0.1.1 が何なのかぱっとわからなかったので確認してみた。 調べてみたら以下のQiita記事が見付かり、そこに全部書いてあった。

qiita.com

www.debian.org

すなわち、歴史的経緯により ホスト名を逆引きできるIPアドレスが欲しかった、127.0.0.1だとlocalhostになってしまうので127.0.1.1がホスト名を返すように /etc/hosts にエントリを追加している。

ドメイン名を設定する場合はドメイン名をエントリに含める必要がある。 Kubernetes The Hard Wayではドメインkubernetes.local の設定はDebianのインストール後に行う想定なのでこのような書き換え作業が生じている。

クラスタ構築に利用したDebian12 (bookworm) だけでなく、Ubuntu 22.04 および Ubuntu 24.04 でも同様に /etc/hosts127.0.1.1のエントリが存在した。 一方で、Debian系ではないFedora 40で確認したところ127.0.1.1に関するエントリは存在しなかった

# Fedora40
$ cat /etc/hosts
# Loopback entries; do not change.
# For historical reasons, localhost precedes localhost.localdomain:
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# See hosts(5) for proper format and other examples:
# 192.168.1.10 foo.example.org foo
# 192.168.1.13 bar.example.org bar