Linux hostname介紹


以下操作均時基於 Centos 6.8 操作。

一、現象

在平時工作中,當需要修改主機名時,我們一般會這樣操作:

第一步,通過 hostname 命令臨時修改主機名。

hostname kwang-test01

第二步,修改配置文件,保證機器重啟時主機名不會變。

$ cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=kwang-test01
NOZEROCONF=yes

以上操作確實是修改主機名的正確姿勢,也能達到預期的效果,但為什么要這樣操作呢,知其然也要知其所以然,下面我們來看看原因。

二、透過現象看本質

2.1 hostname 臨時修改主機名

當我們執行 hostname <ip> 命令時,會臨時修改 Linux Kernel 中一個同為 hostname 的內核參數,而 Linux Kernel 中 hostname 參數保存在 /proc/sys/kernel/hostname 中。

2.2 修改 /etc/sysconfig/network 配置永久修改主機名

有人可能會困惑,為什么永久修改主機名需要修改 /etc/sysconfig/network 的 HOSTNAME 參數?回答這個問題前,先讓我們看看 Linux 啟動時腳本的一段代碼:

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 參數。

注意,我們也說了,只有在 Linux 在啟動時才會加載 /etc/sysconfig/network 配置,但平時執行 hostname 命令系統是如何知道主機名臨時修改了呢?我們繼續往下看。

2.3 更進一步

通過 hostname 命令獲取的值跟 /etc/sysconfig/network 文件中的 HOSTNAME 有一定的關聯,但是沒有必然聯系,只有在 Linux 啟動時才會與配置文件的 HOSTNAME 值有保持一致,啟動相互不影響。進一步了解,我們發現通過 hostname 命令獲取的值並不是直接從 /etc/sysconfig/network 獲取,而是從 Linux Kernel 的內核參數 /proc/sys/kernel/hostname 獲取,這一點我們可以從下面實操看出:

# 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

結論:

  • hostname 命令獲得的值是從 /proc/sys/kernel/hostname 獲取的,與 /etc/sysconfig/network 配置中的 HOSTNAME 沒有直接關聯;
  • /proc/sys/kernel/hostname 內核參數的初始值在 Linux 啟動時從 /etc/sysconfig/network 配置中加載,啟動后該值通過 root 賬號可以修改。

三、疑惑

最近在遇到一個奇怪的現象,/proc/sys/kernel/hostname 中的值被定時修改了,沒有人為操作,系統也沒有重啟,暫時沒有解決,后續解決了更新。

 

【參考資料】

[1]. https://jaminzhang.github.io/linux/deep-understanding-of-linux-hostname/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM