如下操做均时基于 Centos 6.8 操做。linux
在平时工做中,当须要修改主机名时,咱们通常会这样操做:git
第一步,经过 hostname 命令临时修改主机名。github
hostname kwang-test01
第二步,修改配置文件,保证机器重启时主机名不会变。并发
$ cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=kwang-test01 NOZEROCONF=yes
以上操做确实是修改主机名的正确姿式,也能达到预期的效果,但为何要这样操做呢,知其然也要知其因此然,下面咱们来看看缘由。spa
当咱们执行 hostname <ip> 命令时,会临时修改 Linux Kernel 中一个同为 hostname 的内核参数,而 Linux Kernel 中 hostname 参数保存在 /proc/sys/kernel/hostname 中。code
有人可能会困惑,为何永久修改主机名须要修改 /etc/sysconfig/network 的 HOSTNAME 参数?回答这个问题前,先让咱们看看 Linux 启动时脚本的一段代码:blog
HOSTNAME=$(/bin/hostname) set -m if [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network fi if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then HOSTNAME=localhost fi
能够看出 Linux 的启动逻辑:首先会读取 /etc/sysconfig/network 中的 HOSTNAME 参数,而后将系统主机名配置成获取的 HOSTNAME 参数。ip
注意,咱们也说了,只有在 Linux 在启动时才会加载 /etc/sysconfig/network 配置,但平时执行 hostname 命令系统是如何知道主机名临时修改了呢?咱们继续往下看。get
经过 hostname 命令获取的值跟 /etc/sysconfig/network 文件中的 HOSTNAME 有必定的关联,可是没有必然联系,只有在 Linux 启动时才会与配置文件的 HOSTNAME 值有保持一致,启动相互不影响。进一步了解,咱们发现经过 hostname 命令获取的值并非直接从 /etc/sysconfig/network 获取,而是从 Linux Kernel 的内核参数 /proc/sys/kernel/hostname 获取,这一点咱们能够从下面实操看出:it
# hostname //当前主机名 kwang_test01 # cat /proc/sys/kernel/hostname //修改内核参数 kwang_test01 # echo "kwang_test01_change" > /proc/sys/kernel/hostname //修改内核参数 # cat /proc/sys/kernel/hostname kwang_test01_change # hostname //修改后主机名,发现主机名已修改 kwang_test01_change # cat /etc/sysconfig/network //并发现这个配置的 HOSTNAME 值没有变 NETWORKING=yes HOSTNAME=kwang-test01 NOZEROCONF=yes
结论:
最近在遇到一个奇怪的现象,/proc/sys/kernel/hostname 中的值被定时修改了,没有人为操做,系统也没有重启,暂时没有解决,后续解决了更新。
【参考资料】
[1]. https://jaminzhang.github.io/linux/deep-understanding-of-linux-hostname/