如何在不重启的情况下更改主机名?

我想更改操作系统的主机名,但我不想重新启动。
我已经编辑了/etc/hostname文件,但是需要重新启动才能生效。有什么方法可以避免重新启动吗?

3警告:不适用于默认运行cloud-init的Ubuntu 18+,该程序在启动时控制主机名。 - null
14个回答

很简单。只需点击屏幕右上角的齿轮图标,打开“关于此电脑”屏幕(位于齿轮图标处),然后编辑“设备名称”。
或者,在终端中使用以下命令:
sudo hostname your-new-name

这将在重启之前将主机名设置为your-new-name。有关更多信息,请参阅man hostname如何更改计算机名称?。请勿在您的名称中使用_注意 重启后,将使用您在/etc/hostname中所做的更改,因此(正如您在问题中所说),您仍应该使用它们。
sudo -H gedit /etc/hostname

(或其他编辑器)以便文件包含主机名。
为了测试文件是否正确设置,请运行:
sudo service hostname start

您还应编辑/etc/hosts文件,并更改读取的行:
127.0.1.1     your-old-hostname

为了使其包含您的新主机名(否则许多命令将停止运行),请进行相应更改。

6我不想重新开始。 - Deepak Rajput
27我知道。这就是为什么你应该使用“hostname”命令。我只是想澄清一下,“hostname”命令只会在重启/崩溃等情况之前改变主机名。之后它会再次从文件中读取名称。 - jasperado
1谢谢。这意味着在更改主机名后我们需要重新启动,对吗? - Deepak Rajput
5这要看情况。如果你已经输入了指令,就不需要重新启动。主机名已经更改了。但只有在下次重启之前有效。 - jasperado
21请注意,您还需要更改/etc/hosts文件(请参考其他答案)。 - JB.
11简而言之,尽管 hostname 会立即生效,但如果您不同时更改 /etc/hostname/etc/hosts,它并不是“永久”的。因为在重启或崩溃后,系统会读取这些文件,而这当然是您事先可能不会预料到的情况。 - Tim Parenti
我刚在Lubuntu上执行了这些步骤。现在我无法启动任何程序。甚至屏幕右下角的电源按钮也无法使用。Ctrl+Alt+Delete也不行。我只能发帖是因为Firefox已经在运行中。我现在要按硬件电源按钮了。--更新:不得不长按电源按钮。现在一切都正常了。主机名成功更改...但从技术上讲,仍然需要重新启动。 - Brent
如何在不重新启动的情况下恢复原始主机名? - hellboy
你需要在终端中运行“sudo hostname your-original-hostname”命令。 如果你不记得原来的主机名,也没有修改上述提到的文件,你可以查找它:“cat /etc/hostname”。 - jasperado
我的 /etc/hosts 文件中写着 127.0.1.1 localhost。所以你建议将 localhost 改成什么? - Dims
这取决于您系统的用途。如果只是一个桌面系统,请随意将其保留为原样。如果是一个服务器,并且可以通过实际域名访问,您应该将此名称添加到该行中:127.0.1.1 localhost localhost.localdomain your-domain.net - jasperado
如果您正在运行邮件的后缀,则建议检查/etc/postfix/main.cf文件以及myhostnamemydestination变量。 - forsvunnet
警告:不适用于默认运行cloud-init的Ubuntu 18+,该程序在启动时控制主机名。 - null
1警告:不适用于默认运行cloud-init的Ubuntu 18+,该程序在启动时控制主机名。请参阅下面的cloud-init解答。 - null

Ubuntu 13.04以后

hostnamectl命令是桌面版和服务器版默认安装的一部分。

它结合了使用hostname命令设置主机名和编辑/etc/hostname文件。除了设置静态主机名外,它还可以设置“pretty”主机名,但在Ubuntu中不会使用。不幸的是,编辑/etc/hosts仍然需要单独完成。

hostnamectl set-hostname new-hostname

这个命令是systemd-services包的一部分(从Ubuntu 14.04开始,该包还包括timedatectllocalectl命令)。随着Ubuntu迁移到systemd,这个工具是未来的方向。

1请注意,这并不适用于所有地方。我刚在我的Ubuntu 14.04 LTS ARM-7安装上查看了一下,发现hostnamectl命令并不存在。看来某些版本的Ubuntu还没有开始使用systemd。 - Stéphane
1@Stéphane,这些命令是systemd套件的一部分,但它们也可以独立使用。在这种情况下,13.04-14.10版本并不使用systemd作为初始化程序,但该命令仍然可用。 - muru
@muru,你显示需要2个项目:编辑/etc/hosts和调用hostnamectl。我认为可能还需要第三个项目,类似于export HOSTNAME=xxx。此外,顺序可能很重要。如果顺序错误,我在调用sudo时会遇到问题。我推断sudo依赖于/etc/hosts,所以最好先执行这个操作,如果其他两个操作中的任何一个需要sudo的话。 - H2ONaCl
2@H2ONaCl 在启动时设置了shell变量,只需打开另一个shell,主机名变量应该就没问题了。至于sudo,关于主机名解析的错误实际上从未阻止我做任何事情。 - muru
@muru,我同意sudo可以工作,但最好消除“错误”消息,即使它只是一个“警告”,所以我认为必须首先对/etc/hosts进行编辑。如果我们是交互式的,那么用户可以打开一个新终端,但如果我们在脚本中,我认为最好立即进行第三个更改,因此我建议使用export HOSTNAME=xxx - H2ONaCl
@H2ONaCl 我只在这方面使用脚本,从来没有遇到过任何问题。尤其是关于shell变量,我认为任何外部命令都不会关心它。我总是使用hostname命令。 - muru
@muru,是的,我应该说一下我的脚本依赖于$HOSTNAME,所以我需要执行export HOSTNAME=xxx。即使你的脚本不需要它,最完整的答案可能需要类似这样的操作才能普遍适用。我不知道是否有更好的方法,所以我就这样做了。 - H2ONaCl
1@H2ONaCl 啊,但是HOSTNAME变量不是标准的 - 如果我没记错,dash和ksh都没有它,zsh使用HOST,所以就shell变量而言,它是最底层的。 - muru
谢谢,这对我来说是个解决方案。在Ubuntu 16.04 LTS上,得票最高的答案不起作用。 - Sun
4仍然适用于Ubuntu 18.04 LTS。 - LucaM
如果你运行mDNS(在许多Linux上默认开启):sudo service avahi-daemon restart。Raspbian上的默认主机名是raspberrypi.local,如果你有多个这样的设备,重命名是一个常见的任务。 - Scott Prive

无需重启

在Ubuntu中更改主机名或计算机名无需重启

编辑/etc/hostname并更改为新值,

nano /etc/hostname 

编辑/etc/hosts文件,并将旧的127.0.1.1行更改为您的新主机名。
127.0.0.1   localhost
127.0.1.1   ubuntu.local    ubuntu   # change to your new hostname/fqdn

注意:我在一个论坛上看到这个信息 > 编辑 /etc/hosts 文件,将旧的 127.0.1.1 行改为你的新主机名(如果你不这样做,就无法再使用 sudo 命令了。如果你已经完成了这一步骤,请在 grub 菜单上按 ESC 键,选择恢复模式,并编辑你的主机文件以正确的设置)。
现在重新启动后,你的主机名将变成你选择的新名称。
无需重新启动
要在无需重新启动的情况下进行更改,你只需在编辑 /etc/hostname 文件后使用 hostname.sh 命令即可。在执行下面的命令之前,你必须在 /etc/hosts 文件中保留两个主机名(127.0.0.1 newhost oldhost)。
sudo service hostname start

注意:上述命令是为了使更改生效。在系统重新启动时,保存在此文件(/etc/hostname)中的主机名将被保留,并将使用相同的服务进行设置。

在Ubuntu 12.10上,最后一部分出现了以下错误信息sudo: unable to resolve host old-hostname。对于这个问题,@jesperado的解决方案效果很好。 - Frédéric Grosshans
3如果您不更新/etc/hosts,在Ubuntu 12.04.2 LTS中很多东西将无法正常运行,包括w命令、Apache、/sbin/reboot等等。请务必更新/etc/hosts文件。 - Josh
你同时提到了127.0.0.1代表localhost127.0.1.1代表自定义主机名。对吗?然后,在你的回答末尾,对于无需重启的操作,你提到了/etc/hosts127.0.0.1 newhost oldhost。所以,不需要127.0.1.1地址吗? - Nikos Alexandris
1对我来说没有用。我不得不使用sudo nano /etc/hosts才能使更改生效;如果没有sudo,只有nano /etc/hosts是无法保存更改的。 - musicman1979
3重启和重新启动有什么区别? - storm
@storm 我想他是在说要重新启动服务。 - Manchineel
我喜欢这个回答中说的“无需重新启动”,然后在同一部分中他又说“现在重新启动后,您选择的主机名将是新的”,很好...但这正是他/我们试图避免重新启动的原因 :) - Melardev

默认名称是在安装Ubuntu时设置的。您可以通过编辑hosts和hostname文件轻松将其更改为任何您想要的名称,无论是在桌面版还是服务器版。以下是如何操作:
1. 在键盘上按下Ctrl+Alt+t键打开终端。打开后,运行以下命令:sudo hostname NEW_NAME_HERE。
此操作会更改主机名,但在下次重新启动之前不会立即在当前终端中显示更改。请启动一个新的终端以查看新的主机名。
2. 要永久更改名称,请运行以下命令编辑主机文件:
sudo -H gedit /etc/hostname 和 sudo -H gedit /etc/hosts。
对于没有图形界面的Ubuntu服务器,请运行 sudo vi /etc/hostname 和 sudo vi /etc/hosts 并逐个进行编辑。 在这两个文件中,将名称更改为您想要的名称,并保存它们。
最后,重新启动计算机以应用更改。

Cloud-init(Ubuntu 18+)主机名持久性

尽管上述方法(hostnamectletc/hostname等)可用于立即更改主机名,在cloud-init出现后,它可以控制主机名的设置以及其他许多事项。因此,如果安装了cloud-init,则在重新启动后主机名将不会保留。如果您希望更改在重新启动后仍然生效,则需要编辑cloud-init配置文件,禁用cloud-init的主机名设置/更新模块

sudo sed 's/preserve_hostname: false/preserve_hostname: true/' /etc/cloud/cloud.cfg

或者完全禁用cloud-init:
sudo touch /etc/cloud/cloud-init.disabled

1请给这个答案点赞。对我来说,这个方法非常有效。其他的回答在采用cloud-init时不起作用。 - null
1@nslntmnx 在18.04桌面版上,默认安装了吗?只有服务器版才有吗?桌面版没有/etc/cloud/cloud.cfg文件。这个软件包的名称是什么?只是cloud-init吗? - Ciro Santilli OurBigBook.com
1另外,有没有办法使用cloud-init来更改主机名,而不仅仅是禁用其覆盖? - Ciro Santilli OurBigBook.com
1是的,您可以使用cloud-init更改许多设置-请参阅我回答中的文档链接-这是一个设置主机名的链接:https://cloudinit.readthedocs.io/en/latest/topics/modules.html#set-hostname - Pierz
如果您不想禁用它,但希望更改主机名:sudo cloud-init clean && sudo nano /var/lib/cloud/seed/nocloud*/user-data(更新 "hostname:")-- 重新启动。 - B. Shea

这是一个按照规定方式更改主机名的脚本。它确保不仅sudo,而且X11应用程序在无需重新启动的情况下继续正常运行。
使用方法:sudo ./change_hostname.sh 新主机名
#!/usr/bin/env bash
NEW_HOSTNAME=$1
echo $NEW_HOSTNAME > /proc/sys/kernel/hostname
sed -i 's/127.0.1.1.*/127.0.1.1\t'"$NEW_HOSTNAME"'/g' /etc/hosts
echo $NEW_HOSTNAME > /etc/hostname
service hostname start
su $SUDO_USER -c "xauth add $(xauth list | sed 's/^.*\//'"$NEW_HOSTNAME"'\//g' | awk 'NR==1 {sub($1,"\"&\""); print}')"

脚本中的最后一行su $SUDO_USER -c "xauth add $(xauth list | sed 's/^.*\//'"$NEW_HOSTNAME"'\//g' | awk 'NR==1 {sub($1,"\"&\""); print}')"是用来做什么的?只是好奇。 - Fr0zenFyr
4@Fr0zenFyr: 这个过程需要一个有效的 X11 身份验证令牌(xauth list),并使用新的主机名(sed)替换旧的主机名。然后,awk会在 xauth add 的第一个参数周围添加引号,因为 xauth 的输入和输出格式不对称。 - Lucas
谢谢解释。我之前一直重启电脑才能使更改生效。+1 - Fr0zenFyr
@trakz:实际上,无论是127.a.b.c中的任何数字,根据IETF RFC标准,都代表本地主机。(大多数人并不知道这一点,但由于大多数人不知道,编辑已批准) - Fabby

无需重新启动:

  1. /etc/hostname中更改主机名
  2. 相应地更新/etc/hosts
  3. sudo sysctl kernel.hostname=mynew.local.host

使用hostname -f检查当前主机名


使用16.04版本时,出现了sudo: unable to resolve host oldnamesysctl: setting key "kernel.hostname": Read-only file system的问题。可能是因为在Proxmox中运行的容器(CT)导致的。 - Pablo Bianchi

获取当前主机名:
cat /etc/hostname

这可以在任何文本编辑器中更改。您还需要在/etc/hosts中将除localhost以外的条目更新为127.0.0.1。

1或者只需在命令行中运行命令“hostname”。 - elomage

对于原帖提出的问题,传统的答案是,在编辑了/etc/hostname文件之后,你可以通过以root身份运行hostname(1)命令,并使用-F(或--file)选项来使其立即生效,而无需重启系统。
sudo hostname -F /etc/hostname

处理/etc/hostname的hostname(5)程序在Debian及其衍生版中已经保持了二十多年的一致性。提供该程序的软件包已被标记为必要的必需的,而且我记得init脚本几十年来一直使用相同的方法(/etc/init/hostname.conf里仍然包含它)。所以我真的很困惑,为什么之前没有人提到过这个问题 :)

警告:不适用于默认运行cloud-init的Ubuntu 18+,该程序在启动时控制主机名。 - null
@nslntmnx 嗯,什么?Ubuntu 18引入了哪个新的依赖项以默认方式引入cloud-init?你可能在考虑一些云定制镜像,如果是这样的话,它们运行自定义的云配置工具也不应该让人感到惊讶。 - Josip Rodin

Ubuntu 16.04

基于DigitalOcean社区的答案的解决方案。

编辑hosts文件。

$ sudo nano /etc/hosts

用新名称替换oldname

127.0.0.1 localhost newname

设置新主机名。

$ sudo hostnamectl set-hostname newname


警告:不适用于默认运行cloud-init的Ubuntu 18+,该程序在启动时控制主机名。 - null