26

I searched for an answer to this question on serverfault and could not find it. I know it is possible, but I can't remember how to do it. How do I change a Linux host's hostname and get that change to take effect without a reboot?

I am using Ubuntu 16 and Ubuntu 18.

A big feature of Ubuntu is the graphical desktop and graphical system utilities. However, we are running Ubuntu in our production environment so we chose not to use the graphical desktop or utilities in order not to have those features consume resources we need in our production environment.

I know that to rename the host, I edit the files:

  • /etc/hostname
  • /etc/hosts

In the /etc/hostname one just replaces the current hostname (soon to be former hostname) with the new hostname.

Ubuntu in the /etc/hosts file has the line:

127.0.1.1 your-hostname your-hostname

It acts as bootstrapping while your host is booting up and establishing itself within your network. Prior to changing the hostname, your-hostname is the current (soon to be former hostname) and as a part of changing your host's hostname, one replaces that name with the new name.

What I am familiar with is executing the above two steps and then rebooting your host. But plenty of times, like with a production server, one would like to execute that rename, but not reboot one's host.

How can I change hostname on a host and get that change to take effect without rebooting the host?

Paul Gear
  • 4,367
  • 19
  • 38
  • 1
    There's no such thing as "Ubuntu 16" and "Ubuntu 18", there can be as big differences between 16.04 and 16.10 as there are between 16.10 and 17.04. – pipe Mar 27 '19 at 08:35

2 Answers2

49

You can change the kernel's idea of the hostname on a systemd-based system using the hostnamectl tool. For example:

hostnamectl set-hostname whatever

You can view the system's current idea of the hostname with:

hostnamectl             # equivalent to hostnamectl status

Keep in mind that this does not change a running process's idea of the hostname. Such a process would have to check the hostname again in order to be updated, and almost no process does. Thus such a process would need to be restarted. In order for every process to begin using the new hostname, they must be restarted. It's generally easier to just reboot the system than to restart every service individually.

Michael Hampton
  • 244,070
  • 43
  • 506
  • 972
  • 1
    Do I need to restart networking on my server if I do not wish to reboot it after the rename? I found this: `sudo /etc/init.d/network restart` Aside from that, restarting networking on my server via that command your point about restarting any running process that needs to know the server's name is valid. Agreed that restarting the host would fix that. That said, there are times that I really want to rename a host, but really do not want to reboot it. Any opinion about `sudo /etc/init.d/network restart` and its usefulness in getting the new hostname to take effect w\out reboot? – Peter Jirak Eldritch Mar 26 '19 at 08:51
  • 3
    @PeterJirak: Completely useless. If those programs (which need to know the hostname) didn't bother to watch for hostname updates before, then they won't bother now. Telling the system to reconfigure IP addresses on eth0 won't affect that even a little bit. – user1686 Mar 26 '19 at 12:14
  • @PeterJirak What do you mean by "getting the new hostname to take effect"? As previously discussed, it takes effect immediately, and any newly started process will be aware of it. I also don't understand why you're asking about restarting the network? What does that have to do with the hostname? – Michael Hampton Mar 26 '19 at 17:35
  • 5
    It's a common misconception that the entirety of "networking" is a userspace service that can be restarted, just because there's an /etc/init.d script named like that. – user1686 Mar 26 '19 at 18:37
  • 2
    @PeterJirak As a side note, running services in `/etc/init.d` is the wrong way on systemd systems. It is just there for backward compatibility to the old System V. – rexkogitans Mar 27 '19 at 05:45
  • And just for completeness, the external world might not care about the hostname at all, you would need to change DNS for beeing reachable under a different name or mapping the IP to a different name. – eckes Mar 28 '19 at 06:40
22

You can change the in-kernel hostname using:

hostname NEWNAME

On Linux this is practically equal to either of the following:

sysctl kernel.hostname=NEWNAME

echo NEWNAME > /proc/sys/kernel/hostname

This does not depend on systemd (unlike hostnamectl which requires systemd-hostnamed) or any other non-standard tools, and often (especially in shellscript-init systems) is how the initial hostname was set in the first place.

Most programs and services don't actually use the hostname; the few which do (e.g. Postfix or services using Kerberos) can be restarted one-by-one.

(Some programs cache the hostname until restart, others query it every time they need it. Programs also have the ability to poll(2) /proc/sys/kernel/hostname to receive change notifications, but few do.)

user1686
  • 10,162
  • 1
  • 26
  • 42