当我觉得自己对linux系统下修改hostname非常熟悉的时候,今天遇到了几个问题。这些问题给我上了很好的一课,很多知识点,当你以为你已经掌握了,其实你只知道表面。不要停留在技术工作上! 实验环境:RedHatEnterpriseLinuxServerrelease5.7(Tikanga),其他Linux版本可能不同。请以实际环境为准。 其实我已经多次修改hostname了。一般我只需要修改/etc/hosts和/etc/sysconfig/network这两个文件中的相关配置即可。不过今天遇到了两个问题: 问题一:为什么/etc/sysconfig/network配置文件localhost.localdomain中的HOSTNAME,显示的hostname却是po132345806-a,那么hostname的配置值放在哪里??11:[root@po132345806-a~]#more/etc/hosts2:#Donotremovethefollowingline,orvariousprograms3:#thatrequirenetworkfunctionalitywillfail.4:127.0.0.1localhost.localdomainlocalhost5:::1localhost6.localdomain6localhost66:[root@po132345806#a~]更多/etc/sysconfig/network7:NETWORKING=yes8:NETWORKING_IPV6=yes9:HOSTNAME=localhost.localdomain 有图有真相,唯恐你不相信这个现象,第一次遇到这种特殊情况的时候,我也很疑惑.google了一些资料加上自己的实践就搞明白了。 问题2:修改hostname后,如何在不重启操作系统的情况下立即生效。 问题三:修改hostname有几种方式? 问题4:hostname和/etc/hosts下的配置有关系吗? 问题5:如何查看hostname的值,以哪个为标准?问题一的回答:我一直以为hostname的值是在/etc/sysconfig/network中配置的。这个文件中HOSTNAME的配置是什么,hostname的值是多少?但是为什么会出现上述情况呢?/etc/sysconfig/network不是hostname的配置文件吗,还有别的配置文件吗?于是试验了一下,将/etc/sysconfig/network文件中的HOSTNAME修改为DB-Server,发现hostname的值没有变化,于是重启电脑。1:"/etc/sysconfig/network"3L,66Cwritten2:132345806-a~]#hostname3:806-a.gfg1.esquel.com4:132345806-a~]#more/proc/sys/kernel/hostname5:806-a.gfg1.esquel.com6:132345806-a~]#sysctlkernel.hostname7:ostname=po132345806-a.gfg1.esquel.com8:132345806-a~]#9:132345806-a~]#reboot 重启后发现hostname变成了DB-Server,也就是说配置文件/etc/sysconfig/network下的HOSTNAME修改生效了。那么说明应该是有人修改了kernel.hostname,请看下面的实验。 1:[root@DB-Server~]#more/etc/sysconfig/network2:3:NETWORKING=yes4:5:NETWORKING_IPV6=yes6:7:HOSTNAME=DB-Server.localdomain8:9:[root@DB-Server~]#echoTest>/proc/sys/kernel/hostname10:11:[root@DB-Server~]#more/etc/proc/sys/kernel/hostname12:13:/etc/proc/sys/kernel/hostname:Nosuchfileordirectory14:15:[root@DB-Server~]#more/proc/sys/kernel/hostname16:17:Test18:19:[root@DB-Server~]#/etc/init.d/networkrestart20:21:Shuttingdowninterfaceeth0:[OK]22:23:Shuttingdownloopbackinterface:[OK]24:25:Bringinguploopbackinterface:[OK]26:27:Bringingupinterfaceeth0:28:29:DeterminingIPinformationforeth0...done.30:31:[OK]32:33:[root]@DB-Server~]#hostname34:35:Test36:37:[root@DB-Server~]#38: 注意:其实/etc/init.d/networkrestart是没有用的。只是实验过程中需要重启网络服务。 在SecureCRT中新建一个clone会话,发现hostanme从DB-Server变成了Test,但是/etc/sysconfig/network的值还是DB-Server.localdomain,并没有变成Test。1:[root@Test~]#more/etc/sysconfig/network2:3:NETWORKING=yes4:5:NETWORKING_IPV6=yes6:7:HOSTNAME=DB-Server.localdomain8:9:[root@Test~]#hostname10:11:Test12:13:[root@Test~]#more/etc/hosts14:15:#Donotremovethefollowingline,orvariousprograms16:17:#thatrequirenetworkfunctionalitywillfail.18:19:127.0.0.1localhost.localdomainlocalhost20:21:::1localhost6.localdomain6localhost622:23:[root@Test~]#more/proc/sys/kernel/hostname24:25:Test26:27:[root@Test~]#28: 但是如果重启系统后hostname变为DB-Server,google了一些英文文档,发现hostname是linux系统下的内核参数,存放在/proc/sys/kernel/hostname下,但它的值是linux启动时从rc.sysinit中读取的。 hostname是内核参数,存放系统的主机名。它的位置是”/proc/sys/kernel/hostname” 该参数的值在引导过程中由rc.sysinit文件加载到内核。 #p# /etc/rc.d/rc.sysinit中HOSTNAME的值来自于/etc/sysconfig/network下的HOSTNAME,代码如下,至此,我们就可以完全理解了。HOSTNAME=`/bin/hostname`HOSTTYPE=`uname-m`unamer=`uname-r`set-mif[-f/etc/sysconfig/network];then./etc/sysconfig/networkfiif[-z"$HOSTNAME"-o"$HOSTNAME"="(none)"];thenHOSTNAME=localhostfi 结论:/etc/sysconfig/network确实是hostname的配置文件,hostname的取值与其中的HOSTNAME有一定关系配置文件关系,但没有必然关系。hostname的值来自于内核参数/proc/sys/kernel/hostname。如果我通过命令sysctlkernel.hostname=Test修改了内核参数,那么hostname就变成了Test。 问题2:修改hostname后,如何在不重启操作系统的情况下立即生效。 方法一:修改/etc/sysconfig/network下的HOSTNAME后,再使用echoservername>/proc/sys/kernel/hostname。 [root@DB-Server~]#echoTest>/proc/sys/kernel/hostname 注意当前session不会改变,但后续新的session会生效。 方法二:修改/etc/sysconfig/network下的HOSTNAME后,使用sysctlkernel.hostname命令使其立即生效 [root@DB-Server~]#sysctlkernel.hostname=Test2 kernel.hostname=Test2 注意当前session不会改变,但后续新的session会生效。 方法三:修改/etc/sysconfig/network下的HOSTNAME后,使用hostname命令使其生效 [root@test~]#hostnameDB-Server 注意当前session还是不会改变,但后续一个新的session会生效。 其实这些方法只是将hostname的永久修改和临时修改相结合,这样就不用重启linux服务器了,哈哈,不知道你明白没有。 问题三:修改主机名有几种方式? 1:hostnameDB-Server–运行后立即生效(新会话生效),但系统重启后修改会丢失; 2:echoDB-Server>/proc/sys/kernel/hostname–运行后立即生效(newsession生效),但系统重启后修改会丢失; 3:sysctlkernel.hostname=DB-Server–运行后立即生效(新会话生效),但系统重启后修改会丢失; 4:修改/etc/sysconfig/network下的HOSTNAME变量——需要重启才能生效,修改是永久的。 问题4:hostname和/etc/hosts下的配置有关系吗? 从我上面的实验来看,其实hostname跟/etc/hosts下的配置是没有关系的。hostname的修改和变化完全不依赖于hosts文件。其实hosts文件的作用很像DNS,提供IP地址和主机名的对应关系。早期联网的计算机数量很少,单台计算机的hosts文件就足以存放所有联网的计算机。然而,随着互联网的发展,这还远远不够。于是就有了分布式DNS系统。DNS服务器提供类似的IP地址到域名映射。具体可以查看manhosts中的相关资料。 Linux系统在向DNS服务器发送域名解析请求之前,会查询/etc/hosts文件。如果里面有对应的记录,就会使用hosts中的记录。/etc/hosts文件通常包含这条记录 127.0.0.1localhost.localdomainlocalhost hosts文件的格式是每行一条记录,分别是IP地址、主机名和别名。三者之间用空格分隔,别名可选。 127.0.0.1tolocalhost建议不要修改,因为很多应用都会用到这个,比如sendmail,这些程序修改后可能无法正常运行。 不过,其实hostname并不代表它与/etc/hosts无关。在/etc/rc.d/rc.sysinit中,有如下逻辑判断。当localhost后的hostname为localhost.localdomain时,接口IP地址对应的hostname将用于重置系统的hostname。HOSTNAME=`/bin/hostname`HOSTTYPE=`uname-m`unamer=`uname-r`set-mif[-f/etc/sysconfig/network];then./etc/sysconfig/networkfiif[-z"$HOSTNAME"-o"$HOSTNAME"="(none)"];thenHOSTNAME=localhostfi 来试试吧!修改hosts和network文件,修改值如下:[root@localhost~]#more/etc/hosts#Donotremovethefollowingline,或者variousprograms#thatrequirenetworkfunctionalitywillfail.::1localhost.localdomainlocalhost127.0.0.1localhost.localdomainlocalhost192.168.244。128DB-Server.localdomainDB-Server[root@localhost~]#more/etc/sysconfig/networkNETWORKING=yesNETWORKING_IPV6=yesHOSTNAME=localhost.localdomain重启系统后,我们截图看看情况:于是,这个有时人们认为hostname的值与hosts文件有关。 问题5:如何查看hostname的值,以哪个为准?[root@DB-Server~]#hostnameDB-Server[root@DB-Server~]#more/proc/sys/kernel/hostnameDB-Server[root@DB-Server~]#more/etc/sysconfig/networkNETWORKING=yesNETWORKING_IPV6=yesHOSTNAME=localhost.localdomain 在此基础上,如果你理解了前4题,那么理解这道题就很简单了。 参考: http://jblev??ins.org/log/hostname http://www.ducea.com/2006/08/07/how-to-change-the-hostname-of-a-linux-system/ https://www.kernel.org/doc/Documentation/sysctl/kernel.txt http://soft.chinabyte.com/os/281/11563281.shtml
