标签: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
原文地址:http://xiexiaojun.blog.51cto.com/2305291/1720694