問題敘述
當我們自行安裝 Linux 作業系統後,如果有多台設備的情況下,為了讓這些設備方便識別,會給予不同的主機名稱(hostname),並透過以下命令去修改:
Bash
$ hostnamectl set-hostname my-host-name
重新啟動機器或以新的會話登入,會看到在命令提示字串(prompt)中的主機名稱已經變動了,但這時候如果執行 sudo
指令則會報出以下訊息:
Bash
unun@my-host-name:~$ sudo -V
Sudo version 1.9.13p3
sudo: unable to resolve host my-host-name: Name or service not known
Sudoers policy plugin version 1.9.13p3
Sudoers file grammar version 50
Sudoers I/O plugin version 1.9.13p3
Sudoers audit plugin version 1.9.13p3
潛在影響
在絕大多數的狀況下,系統僅僅是拋出這個訊息,但實際上的命令還是會被執行,看似不影響正常使用,但他實際上存在部分問題:
- 安全性和驗證問題:某些服務和應用程式,會使用主機名稱(hostname)解析作為其安全性或驗證檢查的一部分。如果無法正確地解析,這些服務可能會驗證失敗或出現意外行為。
- 日誌記錄和監控錯誤:某些日誌檔案,可能會因為主機名稱(hostname)解析失敗,而拋出異常警告或錯誤,將使故障排除變得更加困難。
- 效能影響:由於每次執行部分指令,系統都會嘗試解析主機名稱(hostname),如果重複失敗,可能會導致延遲。
問題成因
在 Linux 作業系統中,系統會根據 /etc/hosts
文件中的內容,將主機名稱(hostname)解析為對應的 IP 位址。其用途包含:
- 主機名稱解析:當系統嘗試訪問某個主機名稱時,會先檢查
/etc/hosts
文件,看是否有該對應的 IP 位置,這樣可以不經由 DNS 系統,實現快速解析。 - 加快訪問速度:由於減少了 DNS 查詢的時間,可以加快訪問速度,尤其是對於區域網路中的常用裝置與服務而言。
- 開發以及測試:開發人員可以將測試環境的網域,對應到本機或區域網路中其他伺服器的 IP 位址,以便在不影響生產環境的情況下進行測試。
- 網域重新定向:透過設定
/etc/hosts
文件中映射的 IP 位址,可以將請求重新導向到特定的伺服器,比如將不需要訪問的廣告網域,指向本機位置來遮蔽廣告。
而出現 “unable to resolve host” 問題的原因,便是因為我們透過 hostnamectl
命令設定的主機名稱(hostname)在設定文件 /etc/hosts
中無法找到映射關係。
解決辦法
既然已經知道了問題成因,那麼就很方便我們對症下藥。只需要編輯 /etc/hosts
文件,將主機名稱添加進去即可:
127.0.0.1 localhost my-host-name
::1 localhost my-host-name
其中:
127.0.0.1
是 IPv4 網路環境的回環地址(loopback address)::1
是 IPv6 網路環境的回環地址(loopback address)
所謂的回環地址(loopback address)是一種特殊的 IP 位址,用於設備自我通訊 —— 此時請求或訊號的發送方和接收方都是設備本身。通常被用於開發時的調試和服務測試使用,經過回環地址的流量不會實際離開設備,而是在設備內部完成傳輸。