Linux下hostname相关整理.md

字数 647阅读 43

整理于:
http://www.cnblogs.com/kerrycode/p/3595724.html

问题1: 为什么/etc/sysconfig/network配置文件中HOSTNAME为localhost.localdomain,但是显示的hostname为po132345806-a,那到底hostname的配置值放在哪里?

[root@localhost ~]# more /etc/hosts  
# Do not remove the following line, or various programs  
# that require network functionality will fail.  
::1 localhost.localdomain localhost  
127.0.0.1 localhost.localdomain localhost  
192.168.244.128 hahaha.localdomain hahaha  
[root@localhost  ~]# more /etc/sysconfig/network  
NETWORKING=yes  
NETWORKING_IPV6=yes  
HOSTNAME=localhost.localdomain

解答:

hostname即时值在/proc/sys/kernel/hostname;启动加载值在/etc/sysconfig/network;
修改后没有生效的原因是/etc/sysconfig/network内HOSTNAME值是开机加载的;

hostname是Linux系统下的一个内核参数,它保存在/proc/sys/kernel/hostname下,启动时从rc.sysinit读取;而/etc/rc.d/rc.sysinit中HOSTNAME的取值来自与/etc/sysconfig/network下的HOSTNAME,代码如下所示

HOSTNAME=`/bin/hostname` 
HOSTTYPE=`uname -m` 
unamer=`uname -r` 
set -m 
if [ -f /etc/sysconfig/network ]; then 
. /etc/sysconfig/network 
fi 
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then 
    HOSTNAME=localhost 
fi

问题2: 修改了hostname后,如何使其立即生效而不用重启操作系统?

  • 方法1:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用命令echo hahaha > /proc/sys/kernel/hostname 使其立即生效
  • 方法2:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用命令sysctl kernel.hostname=hahaha 使其立即生效
  • 方法3:修改了/etc/sysconfig/network下的HOSTNAME后,然后使用命令hostname hahaha 使其生效

注意以上三种方法当前会话还是不会变化,但是后续新建会话会生效。

问题3: 修改hostname有几种方式?

  • 方法1:hostname hahaha

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

  • 方法2: echo hahaha > /proc/sys/kernel/hostname

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

  • 方法3:sysctl kernel.hostname=hahaha

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

  • 方法4:修改/etc/sysconfig/network下的HOSTNAME变量

需要重启生效,永久性修改。

问题4: hostname跟/etc/hosts 下配置有关系吗?

解答:

在/etc/rc.d/rc.sysinit中,有如下逻辑判断,当hostname为localhost后localhost.localdomain时,将会使用接口IP地址对应的hostname来重新设置系统的hostname

# In theory there should be no more than one network interface active
# this early in the boot process -- the one we're booting from.
# Use the network address to set the hostname of the client. This
# must be done even if we have local storage.
ipaddr=
# 如果HOSTNAME=localhost或者localhost.localdomain,则ipaddr取 ip addr的scope global的端口ip
if [ "$HOSTNAME" = "localhost" -o "$HOSTNAME" = "localhost.localdomain" ]; then
    ipaddr=$(ip addr show to 0/0 scope global | awk '/[[:space:]]inet / { print gensub("/.*","","g",$2) }')
    # 如果ipaddr不为空,将ipaddr的值做ipcalc -h(即域名解析),域名解析的值执行命令hostname
    if [ -n "$ipaddr" ]; then
        eval $(ipcalc -h $ipaddr 2>/dev/null)
        hostname ${HOSTNAME}
    fi
fi

其他:

  • 127.0.0.1到localhost这一条建议不要修改,因为很多应用程序会用到这个,比如sendmail,修改之后这些程序可能就无法正常运行。
  • hosts文件格式是一行一条记录,分别是IP地址 、hostname、 aliases,三者用空白字符分隔,aliases可选。

如果/etc/hostname中,有值的话,会优先取这里面的值

推荐阅读更多精彩内容