码迷,mamicode.com
首页 > 其他好文 > 详细

深入理解hostname

时间:2015-12-08 16:17:26      阅读:283      评论:0      收藏:0      [点我收藏+]

标签:hostname

       修改Linux系统的主机名相信大家都已经非常熟悉了,我也多次修改过hostname,一般修改/etc/sysconfig/network和/etc/hosts两个文件下相关配置即可。但今天碰到了几个问题,在这里整理一下。

1、hostname命令和HOSTNAME环境变量的值有什么关系?由哪个配置文件决定的?

 1)先查看相关值和配置

[root@BAIYU_179 ~]# hostname
BAIYU_179
[root@BAIYU_179 ~]# echo $HOSTNAME
BAIYU_179
[root@BAIYU_179 ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=BAIYU_179
[root@BAIYU_179 ~]# cat /proc/sys/kernel/hostname 
BAIYU_179
[root@BAIYU_179 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

 2)修改/etc/sysconfig/network中HOSTNAME的值后再查看

[root@BAIYU_179 ~]# vi /etc/sysconfig/network
  1 NETWORKING=yes
  2 NETWORKING_IPV6=no
  3 HOSTNAME=BAIYU_179179
[root@BAIYU_179 ~]# hostname                 
BAIYU_179
[root@BAIYU_179 ~]# echo $HOSTNAME           
BAIYU_179
[root@BAIYU_179 ~]# cat /proc/sys/kernel/hostname 
BAIYU_179
[root@BAIYU_179 ~]# . /etc/sysconfig/network    #重新读取/etc/sysconfig/network后再查看
[root@BAIYU_179 ~]# hostname                
BAIYU_179
[root@BAIYU_179 ~]# echo $HOSTNAME    #发现HOSTNAME改变了
BAIYU_179179
[root@BAIYU_179 ~]# cat /proc/sys/kernel/hostname 
BAIYU_179

 以上可知环境变量HOSTNAME的值是由/etc/sysconfig/network配置的

3)修改/proc/sys/kernel/hostnmae的值再查看

[root@BAIYU_179 ~]# echo test > /proc/sys/kernel/hostname
[root@BAIYU_179 ~]# cat /proc/sys/kernel/hostname        
test
[root@BAIYU_179 ~]# hostname       
test
[root@BAIYU_179 ~]# echo $HOSTNAME
BAIYU_179179
[root@BAIYU_179 ~]# hostname xj
[root@BAIYU_179 ~]# hostname
xj
[root@BAIYU_179 ~]# cat /proc/sys/kernel/hostname 
xj
[root@BAIYU_179 ~]# echo $HOSTNAME
BAIYU_179179

     查了相关资料才知道,主机名是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname下,但是它的值是Linux启动时从/etc/rc.d/rc.sysinit读取的,而/etc/rc.d/rc.sysinit中/etc/sysconfig/network下的HOSTNAME 至此,我们终于彻底明白了。

hostname命令的值和/proc/sys/kernel/hostname值有一个改变,另一个也会相应的改变,

2、hostname跟/etc/hosts 下配置有关系吗?

从上面的实验看,hostname跟/etc/hosts下的配置是没有关系的。hostname的修改、变更完全不依赖hosts文件。 hosts文件的作用相当如DNS,提供IP地址到hostname的对应。早期的互联网计算机数量少,单机hosts文件里足够存放所有联网计算机。不过,随着互联网的发展,这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。

Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件,如果里面有相应的记录,就会使用hosts里面的记录。/etc/hosts文件通常里面包含这2条记录

[root@BAIYU_179 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

hosts文件格式是一行一条记录,分别是IP地址 、主机名、 主机别名,三者用空白字符分隔,主机别名可选。

127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。修改hostname后,如果想要在本机上用newhostname来访问,就必须在/etc/hosts文件里添加一条newhostname的记录。比如我的eth0的IP是192.168.100.179,我将hosts文件修改如下:

  1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
  2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
  3 192.168.100.179 www.xj.com xj.com

之前我一直以为主机名和/etc/hosts是没任何关系的,但在/etc/rc.d/rc.sysinit脚本文件中发现了这样的2段设置,所以在特殊情况下hostname也不能说跟/etc/hosts一点关系都没有。

 HOSTNAME=$(/bin/hostname)
  9 
 10 set -m
 11 
 12 if [ -f /etc/sysconfig/network ]; then
 13     . /etc/sysconfig/network
 14 fi
 15 if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
 16     HOSTNAME=localhost
 17 fi
341         ipaddr=
342         if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
343                 ipaddr=$(ip addr show to 0.0.0.0/0 scope global | awk ‘/[[:space:]]inet / { print gensub("/.*","","g",$2) }‘)
344                 for ip in $ipaddr ; do
345                         HOSTNAME=
346                         eval $(ipcalc -h $ip 2>/dev/null)
347                         [ -n "$HOSTNAME" ] && { hostname ${HOSTNAME} ; break; }
348                 done
349         fi

      第一段脚本判断hostname命令的值是否为空或“(none)”是的话HOSTNAME为localhost 

      第二段脚本判断hostname是否为localhost或者localhost.localdomain,如果是的话,将会使用/etc/hosts中IP地址对应的 hostname来重新设置系统的hostname。问题就出在这里,我的/etc/sysconfig/network默认的hostname是 localhost,eth0的IP是192.168.100.179,而/etc/hosts里有192.168.100.179的记录。于是就用192.168.100.179这条记录来替换了hostname。所以有的人修改主机名直接在/etc/hosts添加一行ip和对应的主机名。

实验一下:修改hosts、network文件,修改后的值如下所示

[root@BAIYU_179 ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost
[root@BAIYU_179 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.179 www.xj.com xj.com

重启,再查看

[root@www ~]# hostname
www.xj.com
[root@www ~]# echo $HOSTNAME
www.xj.com
[root@www ~]# cat /proc/sys/kernel/hostname 
www.xj.com
[root@www ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost
[root@www ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.179 www.xj.com xj.com

3、修改hostname有几种方式

 1)hostname  HOSTNAME  运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改;

 2)echo HOSTNAME > /proc/sys/kernel/hostname  运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改;

 3)sysctl kernel.hostname=HOSTNAME运行后立即生效(新会话生效),但是在系统重启后会丢失所做的修改;

 4)修改/etc/sysconfig/network下的HOSTNAME变量 ,需要重启生效,永久性修改。

 5)修改/etc/hosts,而/etc/sysconfig/network下的HOSTNAME的值为localhost或localhost.localdomain

4、修改了hostname后,如何使其立即生效而不用重启操作系统

 修改了/etc/sysconfig/network下的HOSTNAME后,再使用hostname命令修改成相同的HOSTNAME(这也能算方法?)

5、那hostname的值到底以哪个为准呢?

[root@www ~]# hostname
www.xj.com
[root@www ~]# echo $HOSTNAME
www.xj.com
[root@www ~]# cat /proc/sys/kernel/hostname 
www.xj.com
[root@www ~]# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=localhost
[root@www ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.179 www.xj.com xj.com

     我想你应该有答案的。

总结了下关于hostname的基础知识,希望像我一样的初学者不再对这个问题有困惑。

深入理解hostname

标签:hostname

原文地址:http://xiexiaojun.blog.51cto.com/2305291/1720694

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!