システムのホスト名を設定する「推奨」方法は、Red Hat/CentOSとDebian/Ubuntuシステムでは根本的に異なることに気づきました。
CentOSのドキュメント および RHEL導入ガイド ホスト名はFQDNである必要があります:
HOSTNAME=<value>
、ここで<value>
はhostname.example.com
などの完全修飾ドメイン名(FQDN)ですが、必要なホスト名であれば何でもかまいません。
RHELインストールガイド は少しあいまいです。
セットアップにより、このコンピュータのホスト名を完全修飾ドメイン名(FQDN)の形式でhostname.domainnameまたはhostname形式の短いホスト名として。
Debianリファレンス は、ホスト名がFQDNを使用してはならないことを示しています(---):
3.5.5。ホスト名
カーネルはシステムhostnameを保守します。 「/ etc/init.d/hostname.sh」にシンボリックリンクされたランレベルSのinitスクリプトは、ブート時にシステムホスト名を設定します( hostnameコマンド)を「/ etc/hostname」に保存されている名前に。このファイルには、完全修飾ドメイン名ではなく、システムホスト名のみを含める必要があります。
IBMからの使用に関する特定の推奨事項は見ていませんが、 一部のソフトウェア が優先されるようです。
私の質問:
環境全体で一貫したアプローチを選択します。どちらのソリューションも問題なく機能し、ほとんどのアプリケーションとの互換性が維持されます。ただし、管理性には違いがあります。
HOSTNAME設定として短い名前を使用し、サーバーのIPの/etc/hosts
の最初の列としてFQDNを設定し、その後に短い名前を続けます。
2つの間の設定を強制または表示する多くのソフトウェアパッケージには遭遇していません。一部のアプリケーション、特にロギングでは、短い名前の方がわかりやすいと思います。多分私はserver.northside.chicago.rizzomanufacturing.com
のような内部ドメインを見ることが不運でした。ログまたはシェルプロンプトでそれを見たい人はいますか?
時々、私は会社の買収や内部ドメインやサブドメインが変更される再構築に関与しています。ロギング、キックスタート、印刷、システム監視などは、新しいドメイン名を説明するために完全な再構成を必要としないため、これらの場合は短いホスト名を使用するのが好きです。
内部ドメインが「ifp.com」である「rizzo」という名前のサーバーの典型的なRHEL/CentOSサーバーのセットアップは、次のようになります。
/etc/sysconfig/network:
HOSTNAME=rizzo
...
-
/etc/hosts:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.100.13 rizzo.ifp.com rizzo
-
[root@rizzo ~]# hostname
rizzo
-
/var/log/messages snippet:
Dec 15 10:10:13 rizzo proftpd[19675]: 172.16.100.13 (::ffff:206.15.236.182[::ffff:206.15.236.182]) - Preparing to
chroot to directory '/app/upload/GREEK'
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - FTP session opened.
Dec 15 10:10:51 rizzo proftpd[20660]: 172.16.100.13 (::ffff:12.28.170.2[::ffff:12.28.170.2]) - Preparing to chroot
to directory '/app/upload/ftp/SRRID'
ほとんどすべてのソフトウェアは、ホスト名を正しく設定することに敏感です。 Diggで働いていたときに、/etc/hosts
に一見無害な変更を加えたため、システム全体のホスト名の概念に影響を与えたため、サイト全体を2時間ダウンさせました。軽く踏む。そうは言っても、ここでは少し混乱するかもしれません。 HOSTNAME=
設定は、Debianベースのディストリビューションが/etc/hostname
を使用する方法と直接同等ではないと思います。
異機種混在環境で私にとってうまくいくのは次のとおりです。
hostname
コマンドを使用して、カーネルで使用されるホスト名などを設定します。/etc/hosts
:
127.0.0.1 localhost
10.0.0.1 hostname.example.com hostname
この構成はまだ失敗していません。
あなたは確かにオンラインで参考文献を見つけることに問題がないでしょう、それはあなたが間違いなくそれを何らかの方法で行うようにあなたに言うでしょう。ただし、ホスト名として短い名前を使用し、/ etc/hostsに完全修飾名を使用するほうがはるかに一般的であるように思えます。完全修飾名を必要とするサービスは、代わりにhostname --fqdn
を呼び出すように構成できるため、より賢明な方法のようです。
最近、たった1つのソフトウェアに出くわしました。これは、fqdnがhostname
から返されることを厳密に要求するもので、これはガネーティでした。彼らはこれを文書化します ここ 。ただし、hostname --fqdn
に適応できない理由はわかりません。
少し正直なところ、この質問を調査している間、私は「ホスト名」のソースコードをチェックし、調査結果を出力するスクリプトを作成するのに十分夢中になっています(Fedora 19)。足りないのは、「/ etc/hosts」の見方です。私の見解では、そもそもこのすべてを地獄に留めておかなければなりません。
#!/bin/bash
function pad {
if [[ $1 == '?' ]]; then
printf "%-23s" "?"
else
printf "%-23s" "'$1'"
fi
}
# ----- Kernel -----
# Two ways to configure the kernel values:
# 1) Put FQDN into "kernel.hostname" and nothing into "kernel.domainname"
# 2) Put machine name into "kernel.hostname" and DNS domain name into "kernel.domainname" (makes more sense)
echo "== Kernel values =="
echo
H=`/sbin/sysctl -n kernel.hostname`
D=`/sbin/sysctl -n kernel.domainname`
echo "Kernel hostname: '$H'"
echo "Kernel domainname: '$D'"
# ----- What does bash say -----
echo
echo "== According to bash =="
echo
echo "HOSTNAME = '$HOSTNAME'"
# ----- Hostname config file ------
echo
echo "== Hostname config file =="
echo
ETCH="/etc/hostname"
if [[ -f $ETCH ]]; then
CONTENTS=`cat $ETCH`
echo "File '$ETCH' contains: '$CONTENTS'"
else
echo "File '$ETCH' does not exist"
fi
# ----- Network config file ------
echo
echo "== Network config file =="
echo
SYSN="/etc/sysconfig/network"
if [[ -f $SYSN ]]; then
LINE=`grep -e "^HOSTNAME=" $SYSN`
if [[ -n $LINE ]]; then
echo "File '$SYSN' contains: '$LINE'"
else
echo "File '$SYSN' exists but does not contain a line for 'HOSTNAME'"
fi
else
echo "File '$SYSN' does not exist"
fi
# ----- Nodename -------
echo
echo "== Nodename =="
echo
UNAME=`uname --nodename` # On Linux, this is the hostname
echo "The 'nodename' given by 'uname --nodename' is: '$UNAME'"
# ----- The 'hostname' mess ------
THE_HOSTNAME=`hostname`
SHORT_NAME=`hostname --short`
NIS_DNAME=`domainname`
YP_DNAME=`hostname --yp` # Same as `nisdomainname` ; this may fail with "hostname: Local domain name not set"
if [[ $? != 0 ]]; then
YP_DNAME="?"
fi
echo
echo "== 'hostname' directly obtained values =="
echo
echo "The result of gethostname();"
echo "...obtained by running 'hostname'"
echo "Hostname: $(pad $THE_HOSTNAME)"
echo
echo "The part before the first '.' of the value returned by gethostname();"
echo "...obtained by running 'hostname --short'"
echo "Short name: $(pad $SHORT_NAME)"
echo
echo "The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';"
echo "...on Linux, this is the kernel-configured domainname;"
echo "...obtained by running 'domainname'"
echo "NIS domain name: $(pad $NIS_DNAME)"
echo
echo "The result of yp_get_default_domain(), which may fail;"
echo "...obtained by running 'ĥostname --yp'"
echo "YP default domain: $(pad $YP_DNAME)"
DNS_DNAME=`hostname --domain` # Same as `dnsdomainname`'
FQDN_NAME=`hostname --fqdn`
ALIAS_NAME=`hostname --alias`
echo
echo "== 'hostname' values obtained via DNS =="
echo
echo "The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --domain'"
echo "DNS domain name: $(pad $DNS_DNAME)"
echo
echo "The 'canonical name' value returned by getaddrinfo(gethostname());"
echo "...obtained by running 'hostname --fqdn'"
echo "Fully qualified hostname: $(pad $FQDN_NAME)"
echo
echo "Alias obtained by gethostbyname(gethostname());"
echo "...obtained by running 'hostname --alias'"
echo "Hostname alias: $(pad $ALIAS_NAME)"
BY_IP_ADDR=`hostname --ip-address`
ALL_IP_ADDR=`hostname --all-ip-addresses`
ALL_FQDN_NAMES=`hostname --all-fqdn`
echo
echo "== 'hostname' values obtained by collecting configured network addresses =="
echo
echo "Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;"
echo "...obtained by running 'hostname --ip-address'"
echo "By IP address: $BY_IP_ADDR"
echo
echo "Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;"
echo "...obtained by running 'hostname --all-ip-addresses'"
echo "All IP addresses: $ALL_IP_ADDR"
echo
echo "Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);"
echo "...obtained by running 'hostname --all-fqdn'"
echo "All fully qualified hostnames: $ALL_FQDN_NAMES"
Amazon EC2の出力VM Fedora 19を実行、カーネル値を手動で設定して/etc/hostname
に入力した後、/etc/hosts
に変更を加えないと、次のようになります。
== Kernel values ==
Kernel hostname: 'kyubee'
Kernel domainname: 'homelinux.org'
== According to bash ==
HOSTNAME = 'ip-172-31-24-249.localdomain'
== Hostname config file ==
File '/etc/hostname' contains: 'kyubee.homelinux.org'
== Network config file ==
File '/etc/sysconfig/network' exists but does not contain a line for 'HOSTNAME'
== Nodename ==
The 'nodename' given by 'uname --nodename' is: 'kyubee'
== 'hostname' directly obtained values ==
The result of gethostname();
...obtained by running 'hostname'
Hostname: 'kyubee'
The part before the first '.' of the value returned by gethostname();
...obtained by running 'hostname --short'
Short name: 'kyubee'
The result of getdomainname(); the code of 'hostname' seems to call this the 'NIS domain name';
...on Linux, this is the kernel-configured domainname;
...obtained by running 'domainname'
NIS domain name: 'homelinux.org'
The result of yp_get_default_domain(), which may fail;
...obtained by running 'ĥostname --yp'
YP default domain: 'homelinux.org'
== 'hostname' values obtained via DNS ==
The part after the first '.' of the 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --domain'
DNS domain name: ''
The 'canonical name' value returned by getaddrinfo(gethostname());
...obtained by running 'hostname --fqdn'
Fully qualified hostname: 'kyubee'
Alias obtained by gethostbyname(gethostname());
...obtained by running 'hostname --alias'
Hostname alias: ''
== 'hostname' values obtained by collecting configured network addresses ==
Collect the IP addresses from getaddrinfo(gethostname()), apply getnameinfo(ip) to all those addresses;
...obtained by running 'hostname --ip-address'
By IP address: fe80::8f6:8eff:fe49:9e21%eth0 172.31.24.249
Call getnameinfo(NI_NUMERICHOST) on all addresses snarfed from active interfaces;
...obtained by running 'hostname --all-ip-addresses'
All IP addresses: 172.31.24.249
Call getnameinfo(NI_NAMEREQD) on all addresses snarfed from active interfaces (involves lookup in /etc/hosts);
...obtained by running 'hostname --all-fqdn'
All fully qualified hostnames: ip-172-31-24-249.eu-west-1.compute.internal
Perlで完全修飾ホスト名を取得するための回復力のある方法は、次のようになります。
sub getHostname {
my $hostname_short = `/bin/hostname --short`;
if ($? != 0) { print STDERR "Could not execute 'hostname --short' -- exiting\n"; exit 1 }
chomp $hostname_short;
my $hostname_long = `/bin/hostname`;
if ($? != 0) { print STDERR "Could not execute 'hostname' -- exiting\n"; exit 1 }
chomp $hostname_long;
if ($hostname_long =~ /^${hostname_short}\..+$/) {
# "hostname_long" is a qualified version of "hostname_short"
return $hostname_long
}
else {
# both hostnames are "short" (and are equal)
die unless ($hostname_long eq $hostname_short);
my $domainname = `/bin/domainname`;
if ($? != 0) { print STDERR "Could not execute 'domainname' -- exiting\n"; exit 1 }
chomp $domainname;
if ($domainname eq "(none)") {
# Change according to taste
return "${hostname_short}.localdomain"
}
else {
return "${hostname_short}.${domainname}"
}
}
}
そしてbashではそれは:
function getHostname {
local hostname_short=`/bin/hostname --short`
if [ $? -ne 0 ]; then
echo "Could not execute 'hostname --short' -- exiting" >&2; exit 1
fi
local hostname_long=`/bin/hostname`
if [ $? -ne 0 ]; then
echo "Could not execute 'hostname' -- exiting" >&2; exit 1
fi
if [[ $hostname_long =~ ^"$hostname_short"\..+$ ]]; then
# "hostname_long" is a qualified version of "hostname_short"
echo $hostname_long
else
# both hostnames are "short" (and are equal)
if [[ $hostname_long != $hostname_short ]]; then
echo "Cannot happen: '$hostname_long' <> '$hostname_short' -- exiting" >&2; exit 1
fi
local domainname=`/bin/domainname`
if [ $? -ne 0 ]; then
echo "Could not execute 'domainname' -- exiting" >&2; exit 1
fi
if [[ domainname == '(none)' ]]; then
# Change according to taste
echo "${hostname_short}.localdomain"
else
echo "${hostname_short}.${domainname}"
fi
fi
}
メモ
注1:HOSTNAMEはbashが提供するシェル変数(「現在のホストの名前に自動的に設定されます。」)ですが、bashがその値に到達したことを示すものはありません。
注2:/boot/initrams-FOO.imgの/ etc/hostnameを忘れないでください...