👶
【Linux】ホスト名とFQDNについて。(hostname/hostnamectl)
ホスト名とFQDNの違い
ホスト名(Hostname):
- コンピュータの「名前」の部分のみ
- 例:
webserver
- ローカルでの識別に使用
FQDN(Fully Qualified Domain Name):
- ホスト名 + ドメイン名の完全な形
- 例:
webserver.example.com
- インターネット上での完全な一意の識別子
構造の例:
webserver . example . com
↑ ↑ ↑
ホスト名 サブドメイン トップレベル
↑_____________________↑
ドメイン名
↑_____________________________________↑
FQDN
イメージ:
- ホスト名は「太郎」(個人の名前)
- FQDNは「山田太郎、東京都渋谷区○○」(完全な住所を含む個人の特定)
FQDNはインターネット上で一意にサーバーを特定するために使用され、ホスト名はローカルネットワーク内での識別に使用されます。
ホスト名に関するコマンド
# ホスト名を表示する
hostname
hostnamectl status --static
uname -n
# FQDNを表示する
hostname -f
host $(hostname)
nslookup $(hostname)
dig $(hostname)
hostnameを使うときはホスト名の変更してしまう可能性がある点に気を付けましょう。
参考記事:インフラエンジニアの僕が「hostname」コマンドを使わない理由とは?
一時的にホスト名を変更する方法
# ホスト名を設定(root権限必要)
# hostnameコマンドではホスト名は一時的に変更されるだけで、再起動すると元に戻ってしまいます。
hostname ${new-hostname}
hostnameコマンドではホスト名は一時的に変更されるだけなのはなぜ?
- システムの安全性と一貫性を保つため
- 一時的な変更と永続的な変更を分離するため
- 設定ファイルベースの管理を可能にするため
これは、hostname
コマンドの動作の仕組みに関係しています:
- メモリ上での変更
-
hostname
コマンドは、現在実行中のシステムのメモリ上でのホスト名のみを変更します - この変更は設定ファイル(
/etc/hostname
)には書き込まれません
- 起動時の動作
- システム起動時、ホスト名は
/etc/hostname
から読み込まれます - 再起動すると、メモリ上の一時的な変更は失われ、
/etc/hostname
の内容が再度読み込まれます
永続的にホスト名を変更する
-
/etc/hostname
ファイルを編集:
sudo vi /etc/hostname
# 新しいホスト名を入力して保存
-
hostnamectl
コマンドを使用(推奨):
sudo hostnamectl set-hostname ${new-hostname}
変更後、システムを再起動するか、新しいホスト名を反映させるために以下のコマンドを実行します:
sudo systemctl restart systemd-hostnamed
また、/etc/hosts
ファイルも更新することをお勧めします:
sudo vi /etc/hosts
# 127.0.1.1 の行のホスト名を新しいものに変更
/etc/hostname にはFQDNを登録していいのか?
いいえ、/etc/hostname にはホスト名のみ(短い名前)を登録し、FQDNは登録しません。
正しい例:
webserver
誤った例:
webserver.example.com
理由:
- /etc/hostname は単一のホスト名のみを含むべきというUNIX/Linuxの慣習がある
- FQDNの管理は主に /etc/hosts と DNS で行うべき
- 一部のシステムツールやアプリケーションが、/etc/hostname に FQDN が設定されていると正しく動作しない可能性がある
推奨される設定方法:
- /etc/hostname: ホスト名のみ
- /etc/hosts: FQDN とホスト名の両方
- DNS: 必要に応じてFQDNの外部向け設定
おまけ
コマンド置換とは 例:host $(hostname)
コマンド置換とは
$(hostname)
はコマンド置換(Command Substitution)の構文です。
※環境変数ではありません。
コマンド置換とは:
-
$(command)
またはcommand
の形式で書きます - コマンドの実行結果をその場所に展開します
- シェルスクリプトでよく使用される機能です
例:
# hostnameコマンドの結果をhostコマンドの引数として使用
$ host $(hostname)
# 以下と同じ意味
# hostnameの結果が「myserver」の場合
$ host myserver
# 古い書き方(バッククォート)
$ host `hostname`
環境変数とコマンド置換
- 環境変数:
$HOSTNAME
- コマンド置換:
$(hostname)
RHEL6以前のホスト名
RHEL6 では
- ネットワークスクリプト(/etc/init.d/network)によりネットワーク設定が行われていました。
- ホスト名や、ネットワーク機能の有効/無効、デフォルトゲートウェイの設定が記述されています。
しかし、RHEL7からは
- → 非推奨:/etc/init.d/network
- → 推奨: NetworkManager
- RHEL7以降では「/etc/hostname」にホスト名を記述します。
- Debian系でも「/etc/hostname」にホスト名を記述します。
NetworkManagerでもホスト名を変更できるが、「/etc/hostname」や「hostnamectl」を使う方が推奨されます。
Discussion