如下操做均時基於 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/