CentOS文档和RHEL部署指南说,主机名应该是FQDN:
HOSTNAME=<value>
,其中<value>
应该是完全合格的域名名称(FQDN),例如
hostname.example.com
,但可以是任何必需的主机名。br />
RHEL安装指南有点含糊不清:
安装程序会提示您提供此计算机的主机名,以
完全限定的域名(FQDN),格式为hostname.domainname
,或作为简短的主机名,格式为hostname。
使用FQDN:
3.5.5。主机名
内核维护系统主机名。在运行级别
S中与“ /etc/init.d/hostname.sh”符号链接的初始化脚本将系统
引导时的主机名(使用hostname命令)设置为存储的名称。 >在“ / etc / hostname”中。该文件应仅包含系统主机名,
而不是完全限定的域名。
我还没有看到IBM关于使用哪个具体建议,但是有一些软件似乎有偏爱。
我的问题:
在异构环境中,最好使用供应商推荐,还是选择一个并在整个过程中保持一致所有主机?
您遇到了什么软件,该软件对主机名设置为FQDN还是简称很敏感?
#1 楼
我会在整个环境中选择一致的方法。两种解决方案都可以正常工作,并且将与大多数应用程序兼容。但是,可管理性有所不同。我将短名称作为HOSTNAME设置,并将FQDN设置为
/etc/hosts
中服务器IP的第一列,后跟短名称。 br /> 我还没有遇到很多用于强制执行或显示两者之间偏好的软件包。我发现该短名称对于某些应用程序来说更干净,尤其是日志记录。也许我不太幸运看到
server.northside.chicago.rizzomanufacturing.com
这样的内部域。谁想在日志或Shell提示符中看到它?有时,我参与了内部域和/或子域发生变化的公司收购或重组。在这些情况下,我喜欢使用简短的主机名,因为日志记录,kickstart,打印,系统监视等不需要完全重新配置即可解决新域名。
内部域为“ 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'
#2 楼
几乎所有软件都对正确设置主机名敏感。当我在Digg工作时,由于对/etc/hosts
进行了看似无害的更改而影响了系统的主机名概念,所以我一次将整个站点关闭了2个小时。轻轻踩一下。也就是说,您可能在这里有些困惑。我不认为HOSTNAME=
设置直接等同于基于Debian的发行版使用/etc/hostname
的方式。在异构环境中对我有用的是:
在配置管理软件中使用条件,以厂商推荐的方式设置主机名。
使用
hostname
命令设置内核使用的主机名,等等。在
/etc/hosts
中:127.0.0.1 localhost
10.0.0.1 hostname.example.com hostname
此配置尚未使我失败。
评论
这几乎是我在工作中使用的设置。只要域名位于您环境中相关机器的DNA搜索路径(/etc/resolv.conf)中,短名称就可以了
– gWaldo
2011-11-25 12:11
您是否特别推荐使用本地网络IP而不是公共IP?
– code_monk
18年1月5日,下午3:18
#3 楼
您当然可以在网上找到参考文献,这会告诉您一定要采用另一种方法。但是在我看来,使用短名称作为主机名,并在/ etc / hosts中使用完全限定名无疑是更普遍的做法。似乎是一种更明智的方法,因为可以将需要完全限定名称的服务改编为调用hostname --fqdn
。由ganeti返回hostname
。他们在这里记录。我看不出有任何理由不能适应hostname --fqdn
。评论
在“为什么要使用完全限定的主机名”的第一段中回答了“我看不出它们不能适应主机名--fqdn的任何原因”,这需要猜测,并且需要有效的解析器。询问内核是最安全,最可靠的选择。
–womble♦
2014年1月23日9:40
@womble-只要/ etc / hosts文件中有计算机的条目(10.0.0.1 hostname.example.com主机名),并且/etc/nsswitch.conf在DNS(主机:文件dns)之前指定本地分辨率,然后使用工作的解析器由本地主机文件完成。因此,使用FQDN代替主机名的论点很少成立。另外,严格要求主机名返回FQDN的另一个软件示例是Zimbra邮件服务器软件包。
–crashmaxed
2014年4月23日20:12
@crashmaxed:这是几个额外的要求,在给定的环境中可能无法实现,也可能由于错误而搞砸了。在内核数据结构中包含FQDN更为简单。
–womble♦
2014年5月2日,2:11
#4 楼
从某种程度上讲,在研究这个问题时,我已经变得疯狂到足以检查“主机名”的源代码并编写脚本来打印调查结果(Fedora 19)。缺少的是查看“ / etc / hosts”,以我的拙见,应该首先将其排除在所有这些之外。#!/bin/bash
function pad {
if [[ == '?' ]]; then
printf "%-23s" "?"
else
printf "%-23s" "''"
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"
在手动设置内核值并填充
/etc/hostname
却未更改/etc/hosts
之后,运行Fedora 19的Amazon EC2 VM上的输出可能如下所示:== 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提供的shell变量(“自动设置为当前主机的名称。”),但没有关于bash到达的指示。该值。
注2:永远不要忘记/boot/initrams-FOO.img中的/ etc / hostname ...
评论
抱歉,这应该很明显,但是与设置主机名有什么关系?
–克里斯S
13-10-14在2:34
基本上是我在研究在Fedora 19 EC2实例上设置主机名时所做的记录。结果:1)在/ etc / hostname中设置FQHN 2)不要触摸/ etc / hosts 3)您可以将“内核主机名”设置为FQHN或不合格的主机名,如果未设置,则取自/ etc / hostname 4)您可以将“内核域名”设置为域名,而不只是“(none)”。
– David Tonhofer
13-10-14在9:44
#5 楼
/ etc / hosts选项运行良好。但是要确保所有正确的文件都已更新,请运行设置工具
评论
我的发行版没有“设置”工具;您使用的是哪个发行版?
– nickgrim
2011-11-25 14:33
任何基于Redhat的操作系统都使用了设置工具rhel / centos / fedora whar OS?
–里亚恩
2011-11-25 17:10
由于这个问题是关于基于RHEL的发行版和基于Debian的发行版之间的区别,因此我们必须假定asker使用了两者。基于Debian的发行版上没有“设置”工具。
–马丁·海默斯(Martijn Heemels)
2012年4月30日14:15在
#6 楼
嗯...在Linux主机中,如果要更改HOSTNAME和FQDN,则应解决3个步骤(例如,新主机为rizzo.ifp.com):步骤#1更改HOST值在NETWORK属性配置中:
sudo vi /etc/sysconfig/network
HOSTNAME=rizzo.ifp.com
步骤#2编辑您的主机配置
sudo vim /etc/hosts
#IPv4
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
[External IP] rizzo rizzo.ifp.com
步骤3重新启动主机
做得好,只需检查新配置
[rizzo@rizzo]# hostname -f
rizzo.ifp.com
#7 楼
顺序不正确。它必须是:1.2.3.4 full.example.com full
所以该示例可能是这样的:
[External IP] rizzo.example.com rizzo
评论
这个问题已经有了真正的答案。这不会添加任何新内容。
– Esa Jokinen
2015年4月5日在10:50
评论
像您一样,我更喜欢使用短名称,但是最近我发现某些Oracle应用程序要求将主机名的输出作为FQDN。仅将它放在/ etc / hosts中是不够的。这弄乱了我的一贯性。
–詹姆斯·奥格曼(James O'Gorman)
2011-12-20 18:36
在此示例中,主机名大写字母的差异肯定不是最佳做法,请参考:tools.ietf.org/search/rfc1178
– teknopaul
14年2月17日在14:22
/ etc / sysconfig / network是否不应该包含以下行:NETWORKING =是,NETWORKING_IPV6 =否,HOSTNAME = example.com,NISDOMAIN = example?
–茉莉·洛根(Jasmine Lognnes)
2014年11月20日14:50
@JasmineLognnes对,我已经纠正了。我希望ewwhite不介意。
– Kubanczyk
15年4月15日在11:14
这不仅与偏好有关。请参阅任何Linux机器上的hostname(1)。
–user158140
15年8月23日在13:22