在Linux中目前至少找到三个配置文件和host name有关,容易混淆:
1. /etc/host.conf: 这个是Linux的resolver(网络地址解析器?)的配置文件. 常见的内容是:
order hosts,bind
它的含义是, 在解析IP地址的时候,按照先搜索/etc/hosts文件,后发送DNS请求的方式来进行.
2. /etc/hosts: 在Berkly Internet Name Domain (BIND) 服务器出现之前,每台连接网络的linux主机都依靠次文件来解析网络上的主机名和对应的IP地址. 现在虽然这一工作大多都交给DNS服务器来完成了,但该配置文件仍然在某些特定的场合有用,比如在没有DNS的局域网内,或者系统初始化时.
3. /etc/sysconfig/network: 这个是主机连接网络的配置文件, 有点像Windows控制面板-->网络属性提供的功能, 比如gateway, 我们公司里一台Redhat主机上该文件的内容:
NETWORKING_IPV6=yes
HOSTNAME=hzciss03.china.nsn-net.net
NETWORKING=yes
GATEWAY=10.159.194.1
NISDOMAIN=eelinnis.emea.nsn-net.net
不过, hostname命令并不一定从/etc/hosts和/etc/sysconfig/network中获取主机名:
$ hostname #将调用gethostname(2)函数来获取主机名. 通过查阅gethostname(2)得知, 该GLIBC函数通过调用uname(2)来获得信息.
$ hostname -s #将调用gethostbyname(3)函数来获得主机名. 这个函数和gethostname(2)的不同之处是,它首先读取/etc/nsswitch.conf, /etc/host.conf来判断是否要从/etc/sysconfig/network或者/etc/hosts里获取主机名.
所以:
使用hostname改变主机名后, /etc/hosts和/etc/sysconfig/network中关于主机名的信息未改变, uname -a返回的主机名信息则变成刚刚更改的了. 这个时候使用hostname -s命令去查询, 返回错误, 可能是因为主机名和/etc/hosts和/etc/sysconfig/network中不一致导致的.
结论:
设置或者更改主机名后, 需要手动更新/etc/hosts和/etc/sysconfig/network中的相关信息.