我注意到设置系统主机名的“首选”方法在Red Hat / CentOS和Debian / Ubuntu系统之间有着根本的不同。
CentOS文档和RHEL部署指南都说主机名应该是FQDN :
HOSTNAME=<value>
,其中<value>
应该是完全限定域名(FQDN),例如hostname.example.com
,但可以是任何主机名所必需的。
RHEL安装指南稍微含糊不清:
安装程序会提示您提供此计算机的主机名称,或者以格式hostname.domainname中的完全限定的域名 (FQDN),或者以主机名格式的简短主机名称。
Debian引用说主机名不应该使用FQDN :
3.5.5。 主机名
内核维护系统主机名 。 运行级别S中的init脚本被链接到“ /etc/init.d/hostname.sh ”,在引导时(使用hostname命令)将系统主机名设置为存储在“ / etc / hostname ”中的名称。 该文件只能包含系统主机名,而不能包含完全限定的域名。
我还没有看到有关使用IBM的具体build议,但有些软件似乎有一个偏好。
我的问题:
我会select一个贯穿整个环境的一致的方法。 这两种解决scheme都可以正常工作,并且与大多数应用程序保持兼 但是,可pipe理性却有所不同。
我将短名称作为HOSTNAME设置,并将FQDN设置为服务器IP的/etc/hosts
的第一列,后跟短名称。
我还没有遇到许多强制执行或显示两者之间的偏好的软件包。 我发现短名称对于某些应用程序来说更清洁,特别是日志logging。 也许我看到像server.northside.chicago.rizzomanufacturing.com
这样的内部域名是不吉利的。 谁想在日志或shell提示符下看到?
有时,我参与公司收购或内部领域和/或子域名变化的重组。 在这种情况下,我喜欢使用简短的主机名,因为日志logging,kickstart,打印,系统监视等不需要完全重新configuration来说明新的域名。
内部域名为“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
中做了一个看起来很无辜的改变,影响了系统主机名的概念,所以我把整个站点都closures了2个小时。 轻轻地踩。 也就是说,这里可能会有些困惑。 我不认为HOSTNAME=
设置直接等同于基于Debian的发行版使用/etc/hostname
。
在异构环境中适合我的是:
hostname
命令设置内核使用的hostname
名等 在/etc/hosts
:
127.0.0.1 localhost 10.0.0.1 hostname.example.com hostname
这个configuration还没有让我失望。
你肯定没有任何问题在网上find引用,这将告诉你一定要这样或那样做。 然而,在我看来,使用短名称作为主机名,并且在/ etc / hosts中拥有完全限定的名字肯定是非常普遍的。 这似乎是更明智的方式,因为那时需要一个完全合格的名字的服务可以被调整来调用hostname --fqdn
。
我最近刚刚遇到一个软件,它严格要求fqdn由hostname
返回,这是ganeti。 他们在这里logging这个。 但是我看不出有什么理由不能适应hostname --fqdn
。
在研究这个问题时,我有点疯狂地检查“主机名”的源代码,并写一个脚本来打印调查结果(Fedora 19)。 缺less的是看“/ 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"
在运行Fedora 19的Amazon EC2虚拟机上的输出 ,在手动设置内核值和填充/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提供的一个shellvariables(“自动设置为当前主机的名称”),但是没有关于bash到达该值的指示。
注2:永远不要忘记/boot/initrams-FOO.img中的/ etc / hostname …
/ etc / hosts选项很好。
但是你想确保所有正确的文件都被更新运行安装工具
嗯…在Linux主机,如果你想改变HOSTNAME和FQDN,你应该解决3个步骤(例如,新的主机是rizzo.ifp.com ):
步骤#1更改networking属性configuration中的HOST值:
sudo vi /etc/sysconfig/network
更改或添加string:
HOSTNAME=rizzo.ifp.com
步骤#2编辑你的主机configuration
sudo vim /etc/hosts #IPv4 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 [External IP] rizzo rizzo.ifp.com
步骤#3重新启动主机干得好,只需检查新的configuration
[rizzo@rizzo]# hostname -f rizzo.ifp.com
该命令是不正确的。 它一定要是:
1.2.3.4 full.example.com full
所以这个例子可能是这样的:
[External IP] rizzo.example.com rizzo