How to Change Hostname on Debian Jessie Without Rebooting: Systemd vs Traditional Methods


3 views

When working with Debian Jessie on EC2 instances, many administrators encounter an unexpected challenge - the hostnamectl command fails with the error:

sudo hostnamectl
sudo: unable to resolve host ip-172-30-0-17
Failed to create bus connection: No such file or directory

This occurs because the EC2 image doesn't include the full systemd infrastructure by default. The traditional Debian method (/etc/hostname modification) works but requires a reboot to take effect.

For environments where rebooting isn't an option, try these approaches:

Method 1: The sysctl Approach

sudo sysctl kernel.hostname=mynewhostname
sudo hostname mynewhostname

This changes the hostname immediately in the running kernel. However, this is temporary and will reset after reboot. To make it permanent:

echo "mynewhostname" | sudo tee /etc/hostname
sudo sed -i "s/^127.0.0.1.*/127.0.0.1 localhost mynewhostname/" /etc/hosts
sudo sysctl kernel.hostname=mynewhostname
sudo hostname mynewhostname

Method 2: The hostname.sh Alternative

The traditional Debian script can be forced to update immediately:

sudo /etc/init.d/hostname.sh start
sudo service networking reload

For systemd systems (even when hostnamectl isn't working):

sudo systemctl restart systemd-hostnamed

On EC2 instances, there are additional factors to consider:

# Check cloud-init configuration
sudo nano /etc/cloud/cloud.cfg

# If preserve_hostname is set to true:
sudo sed -i 's/preserve_hostname: true/preserve_hostname: false/' /etc/cloud/cloud.cfg

After making changes, verify with multiple commands:

hostname
hostnamectl
uname -n
cat /proc/sys/kernel/hostname

For SSH sessions, you may need to reconnect to see the change in shell prompts.

If changes don't appear:

  1. Check /etc/hosts for proper entries
  2. Verify no trailing spaces in /etc/hostname
  3. Check for conflicting services (like NetworkManager)
  4. Review system logs: journalctl -xe

For a persistent fix across reboots:

#!/bin/bash
NEW_HOSTNAME="prod-web-01"

# Update hostname files
echo $NEW_HOSTNAME | sudo tee /etc/hostname
sudo sed -i "/127.0.0.1/c\127.0.0.1 localhost $NEW_HOSTNAME" /etc/hosts

# Apply immediately without reboot
sudo hostname $NEW_HOSTNAME
sudo sysctl kernel.hostname=$NEW_HOSTNAME

# Optional: Clean up any cloud-init conflicts
sudo cloud-init clean --logs

When working with Debian Jessie on EC2 instances, many administrators encounter unexpected behavior when trying to modify the hostname. Unlike previous Debian versions, Jessie's adoption of systemd introduces new complexities while maintaining backward compatibility.

The standard systemd approach fails because EC2's minimal Jessie image lacks the D-Bus system connection required by hostnamectl:


# This fails on EC2 instances
sudo hostnamectl set-hostname newhostname
Failed to create bus connection: No such file or directory

For immediate changes without reboot, use this comprehensive approach:


# Step 1: Update static hostname
echo "newhostname" | sudo tee /etc/hostname

# Step 2: Modify hosts file
sudo sed -i "s/^127.0.1.1.*/127.0.1.1\tnewhostname/" /etc/hosts

# Step 3: Apply changes immediately
sudo hostname newhostname

# Step 4: Refresh services
sudo service hostname.sh start
sudo service networking restart  # Or specific network interface

For temporary changes (lost after reboot):


sudo hostname temporaryname

For permanent changes (persistent across reboots):


sudo sysctl kernel.hostname=newhostname

After changing the hostname, you might need to update these services:


# For systems using avahi-daemon
sudo service avahi-daemon restart

# If using Postfix
sudo service postfix restart

# For systems with active mail services
sudo service exim4 restart

To verify your changes took effect:


# Check current hostname
hostname
hostnamectl status  # If D-Bus is available

# Verify DNS resolution
getent hosts newhostname

# Check system logs for errors
journalctl -xe

On EC2 instances, cloud-init may override your changes. To prevent this:


# Edit cloud-init configuration
sudo nano /etc/cloud/cloud.cfg

# Set preserve_hostname: true
preserve_hostname: true