原生的 Ubuntu20.04.5-base 使用 sudo 会出现无法解析主机的问题。通常,在更改系统的主机名之后也会发生此错误。

主机名

主机名是用于标识网络上设备的标签。 您不应该在同一网络上拥有相同主机名的计算机。主机名分别是以下三类:

  • static 主机名,即传统的主机名。 主机名存储在 /etc/hostname 文件中,可以由用户设置。

  • pretty 主机名用于向用户展示的自由格式UTF8字符编码的主机名。 例如 Zou's WorkStation

  • transient 主机名由内核维护的动态主机名。 DHCP或mDNS服务器可以在运行时更改临时的主机名。 默认情况下,它与static主机名相同。

对于 statictransient 名称,例如 host.example.com,建议使用完全限定的域名 FQDN

查看当前主机名

执行以下 hostnamectl 命令。在此示例中,默认主机名为 localhost.localdomain

1
hostname
1
2
3
4
5
6
7
8
9
10
11
hostnamectl
Static hostname: localhost.localdomain
Icon name: computer-vm
Chassis: vm
Machine ID: 53da4f34f214440f9df0129411a1080f
Boot ID: af2eccec1b024400bde30b025fb9efc0
Virtualization: oracle
Operating System: Ubuntu 20.04
CPE OS Name: cpe:/o:ubuntu
Kernel: Linux 4.18.0-383.el8.x86_64
Architecture: x86-64

hostnamectl更改主机名

Ubuntu 和其它使用 systemd 作为初始化的程序的 Linux 发行版中,可以使用 hostnamectl 命令更改系统主机名。hostnamectl 命令语法如下:

1
sudo hostnamectl set-hostname host.example.com

例如,要将系统 static 主机名更改为 host.zhzh.xyz,可以使用以下 hostnamectl 命令:

1
sudo hostnamectl set-hostname host.zhzh.xyz

要将 pretty 主机名设置为 Zou's WorkStation,请输入:

1
sudo hostnamectl set-hostname "Zou's WorkStation" --pretty

hostnamectl 命令不产生任何输出。 成功时返回 0,否则返回非零失败代码。要验证主机名是否已成功更改,再次运行 hostnamectl 命令查看即可。

sudo: sudo unable resolve host XXX

接下来,运行以下命令来错误依然会存在:

1
sudo

简单来说,hostname 命令无法解析系统的主机名。由于这是一台本地计算机,并且在 DNS 中没有这样的记录。

修复错误

为了修复错误,需要在系统本地添加 DNS 记录。本地 DNS 记录存储在 /etc/hosts 中。

首先,使用以下命令登录到 root 用户:

1
su - root

接下来,编辑 /etc/hosts 文件的内容:

1
vim /etc/hosts

添加以下内容:

1
127.0.0.1  localhost.localdomain  localhost

默认系统中是连 localhost 这样的记录都不存在的。所以由于缺少主机名并且系统无法找出主机名,因此会引发“无法解析主机”的错误。

要修复此错误,在 /etc/hosts 文件中,将主机名设置为环回地址 (127.0.0.1)即可修复这个错误。