如何處理 Unable to resolve host …: Name or service not known.

問題敘述

當我們自行安裝 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 位址,用於設備自我通訊 —— 此時請求或訊號的發送方和接收方都是設備本身。通常被用於開發時的調試和服務測試使用,經過回環地址的流量不會實際離開設備,而是在設備內部完成傳輸。