我从 18.04 升级到了 20.04。我的主机名有一个下划线 ( My_PC
)。现在,在我的终端中,它显示sudo: unable to resolve host MyPC: Name or service not known
。
我试过:
hostnamectl set-hostname My_PC
那没有用。
My_PC
在我的 /etc/hosts 文件中,不是 MyPC
。
127.0.0.1 localhost My_PC
cat /etc/hostname
显示:
My_PC
me@MyPC:~$ hostnamectl
Static hostname: MyPC <--- WHY??????
Pretty hostname: My_PC
Icon name: computer-laptop
Chassis: laptop
直到我升级后,我的终端才出现此错误。发生了什么?
答案1
_
是主机名中的非法字符。请参阅此关联
我不确定为什么 18.04 没有拒绝它。
答案2
请勿在生产环境或无法轻松物理访问的系统上尝试此操作。
如果你不介意将来某个随机时间点破坏某些东西,那么我在容器 (22.04 guest) 中就是这样做的:(
请参阅下面的一种稍微简单一点的方法,该方法仅在容器外部有效)
- 编写一个小的 C 程序来调用
sethostname()
系统调用包装器:
#include <stdio.h>
#include <unistd.h>
int main()
{
char hostname[] = "hostname_with_underscores";
sethostname(hostname, sizeof(hostname));
}
编译它:
gcc -Wall -Wextra fix_hostname.c -o fix_hostname
尝试一下是否可行:
sudo ./fix_hostname
。您应该在新打开的终端或新执行的 shell 中看到新设置的主机名。如果不行:不要继续,这只会破坏一些东西。如果它确实有效:将程序复制到例如 /usr/sbin/fix_hostname
编写一个服务以在系统启动时运行该程序,例如 /etc/systemd/system/fix_hostname.service:(源自“/etc/rc.local Compatibility”单元文件。请参阅https://www.freedesktop.org/software/systemd/man/systemd.service.html用于一般的单元文件文档。)
[Unit]
Description=run fix_hostname on startup
After=networkd-dispatcher.service
[Service]
Type=oneshot
ExecStart=/usr/sbin/fix_hostname
[Install]
WantedBy=multi-user.target
启用服务:
sudo systemctl enable fix_hostname
禁用与主机名相关的所有内容(我的系统似乎需要):
systemctl disable systemd-hostnamed.service; systemctl disable dbus-org.freedesktop.hostname1.service
重启。希望它能正常工作。
如果你的系统不在容器内,那么可以使用以下名为 fix_hostname 的 shellscript,而不是编译 C 程序:
#!/bin/sh
echo "hostname_with_underscores" > /proc/sys/kernel/hostname
chmod +x fix_hostaname
如果可行,不要忘记使其可执行( )并将其复制到例如 /usr/sbin/fix_hostname;继续上述说明。