A careless hostnamectl call can quietly rewrite three different hostnames at once. This guide gets you a checked hostname change, or a read-only way to inspect the current names before deciding whether a change is even needed. The examples use hostnamectl from systemd 255.4 on Ubuntu 24.04.5 LTS.
Allow about ten minutes. You need a shell on the target machine and permission to use the system hostname service. Reading status is normally unprivileged; changing a hostname usually requires authentication and can affect prompts, monitoring, certificates, inventory and service discovery.
This guide changes the local machine only. Remote operation is covered near the end, and the examples use deliberately obvious placeholder names so none of them can be mistaken for a real host.
Start with the local binary and its version, both ordinary read-only commands:
$ command -v hostnamectl
/usr/bin/hostnamectl
$ hostnamectl --version
systemd 255 (255.4-1ubuntu8.17)
Your package revision may differ even when the systemd major version matches. Read the installed manpage when an option matters:
$ man hostnamectl
Checkpoint: if hostnamectl --version reports an older major version, do not assume every command in this guide is available. The hostname, icon-name, chassis, deployment and location subcommands used here are documented as added in systemd 249.
With no arguments, hostnamectl shows status. The service distinguishes a pretty hostname for people, a static hostname for persistent system configuration, and a transient hostname supplied by network configuration; a valid static hostname takes precedence over the transient one.
$ hostnamectl status
Static hostname: server.example.test
Icon name: computer-desktop
Chassis: desktop
Deployment: production
Location: Rack 2, shelf 1
Operating System: Ubuntu 24.04.5 LTS
Kernel: Linux 6.8.0-139-generic
The fields shown depend on the machine. The point of this step is to check whether the current name is static, transient or absent, before you change anything.
For scripts, request one value or structured JSON instead of scraping aligned human-readable output:
$ hostnamectl --static
server.example.test
$ hostnamectl --json=short status
{"Hostname":"server.example.test","StaticHostname":"server.example.test","PrettyHostname":null,"DefaultHostname":"localhost","HostnameSource":"static"}
The JSON object can carry more fields than this shortened example. Do not compare the whole output as a fixed string: read the field your script needs, and treat a missing or null value as meaningful.
Checkpoint: record the value from hostnamectl --static before making a change. That is your simplest rollback value when a static hostname is already configured.
For a normal server rename, set the static hostname explicitly, using a lower-case DNS-style name with labels separated by dots if you need a fully qualified domain name:
$ sudo hostnamectl hostname app-01.example.test
A static or transient hostname must follow the usual DNS label rules and is limited to 64 characters on Linux. A pretty hostname has fewer restrictions and is meant for human display:
$ sudo hostnamectl --pretty hostname "Application server 01"
This is the trap that catches people out: without a selector, setting hostname changes the pretty, static and transient hostnames all at once. --pretty, --static and --transient each limit the update to that one value. A pretty name such as "Application server 01" is fine in a desktop interface, but it is not a valid static DNS name, so when the pretty and static or transient values update together, hostnamectl simplifies the string for the latter by stripping special characters and spaces.
Use a single selector whenever you mean to change only one layer:
$ sudo hostnamectl --static hostname app-01.example.test
$ sudo hostnamectl --pretty hostname "Application server 01"
These commands need elevated privileges on most systems. If authentication is refused, fix the account or policy rather than adding more flags: --no-ask-password only suppresses the prompt, it does not grant permission.
Run the same selectors after the update:
$ hostnamectl --static
app-01.example.test
$ hostnamectl --pretty
Application server 01
$ hostnamectl status
Static hostname: app-01.example.test
Pretty hostname: Application server 01
Status can also show a transient hostname if a network manager supplies one:
$ hostnamectl --transient
app-01.example.test
An empty result here is normal when no transient hostname exists. For automation, treat exit status 0 as the success signal and only parse JSON when you need several fields at once:
$ hostnamectl --json=short status > /tmp/hostname-status.json
$ test "$?" -eq 0 && echo "hostname status read successfully"
hostname status read successfully
That temporary file contains host information, so remove it once a script has consumed it if its contents are sensitive in your environment. This guide does not rely on it for rollback.
Changing the name can interrupt assumptions baked into monitoring, shell prompts and any application that caches the hostname. It does not rewrite DNS records, certificates or inventory systems for you, so update those dependent systems and pick a maintenance window before a planned production rename.
If the old static value was old-name.example.test, restore it with:
$ sudo hostnamectl --static hostname old-name.example.test
$ hostnamectl --static
old-name.example.test
If you also changed the pretty hostname, restore or clear it separately. An empty string clears a hostname value that the command's hostname operation supports:
$ sudo hostnamectl --pretty hostname ""
$ hostnamectl --pretty
Do not clear a value merely to tidy the output. A transient name can return once a network service renews its configuration, a static name remains the persistent choice, and if another provisioning or network system manages the machine, it may change the transient value again regardless of what you set here.
hostnamectl can also set the icon name, chassis, deployment environment and location that systemd-hostnamed and graphical tools read. These are metadata, not a replacement for the hostname:
$ sudo hostnamectl chassis server
$ sudo hostnamectl deployment production
$ sudo hostnamectl location "Rack 2, shelf 1"
$ hostnamectl chassis
server
server, desktop, laptop, vm or container.development, staging and production are suggested labels, not an access-control mechanism.These updates still change system metadata and may require authentication. Undo a mistaken value by setting the intended replacement, or clear it with an empty argument where your installed command accepts one, and verify each field immediately rather than bundling unrelated metadata changes into a hostname migration.
The --host= option uses SSH to talk to a remote machine manager; --machine= targets a local container. Both widen the blast radius, so make the target visible in your shell history and verify it before running a write operation:
$ hostnamectl [email protected] status
$ hostnamectl --machine=container-name status
Only swap the read-only status command for a hostname update after confirming the target. For a remote change, keep the old value and a tested reconnect path close at hand: a hostname update can make prompts and inventory less recognisable while you are still connected through it.