If you are running Ubuntu on Windows WSL (Windows Subsystem for Linux) and wondering how to change hostname permanently then follow all steps mentioned below.

Once hostname is changed, if you get "unable to resolve host <hostname>: Name or service not known" then follow the step #4 for the fix.

Video Tutorial:

1. Note down your hostname

abhijit@DESKTOP-ABC222:~$ hostname
DESKTOP-ABC222

Here, DESKTOP-ABC222 is hostname of Ubuntu running in my Windows 10 (OS Build 19043.1083) WSL.

2. Open /etc/wsl.conf or create the same if it does not exist.

abhijit@DESKTOP-ABC222:~$ sudo nano /etc/wsl.conf
[sudo] password for abhijit:

3. Add following lines in /etc/wsl.conf.

[network]
hostname = SrcCodes
generateHosts = false

hostname = SrcCodes will update the hostname in /etc/hostname.
generateHosts = false will prevent WSL from automatic generation of /etc/hosts file. Otherwise, hosts file change will be overwritten during re-launch of Ubuntu and we'll get "unable to resolve host <hostname>: Name or service not known"

abhijit@SrcCodes:~$ sudo apt update
sudo: unable to resolve host SrcCodes: Name or service not known
key value default notes
generateHosts boolean true true sets WSL to generate /etc/hosts. The hosts file contains a static map of hostnames corresponding IP address.

Reference: https://docs.microsoft.com/en-us/windows/wsl/wsl-config#network

4. Open /etc/hosts and update

abhijit@DESKTOP-ABC222:~$ sudo nano /etc/hosts

You will see some entries similar to below

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
127.0.1.1       DESKTOP-ABC222.localdomain     DESKTOP-ABC222
192.168.2.14    host.docker.internal
192.168.2.14    gateway.docker.internal
127.0.0.1       kubernetes.docker.internal
44.99.0.122     ip-44-99-0-122.lazerpenguin.com

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Find all occurences of hostname (e.g. "DESKTOP-ABC222") and replace with new one (e.g. "SrcCodes").

127.0.1.1       SrcCodes.localdomain     SrcCodes

Save and exit from the nano editor.

5. Close Ubuntu and re-launch.

Change will not reflect immediately. You must wait ~8 seconds as mentioned below in the document.

If you launch a distribution (ie. Ubuntu), modify the wsl.conf file, close the distribution, and then re-launch it. You might assume that your changes to the wsl.conf file have immediately gone into effect. This is not currently the case as the subsystem could still be running. You must wait ~8 seconds for the subsystem to stop before relaunching in order to give enough time for your changes to be picked up. You can check to see whether your Linux distribution (shell) is still running after closing it by using PowerShell with the command: wsl --list --running. If no distributions are running, you will receive the response: "There are no running distributions." You can now restart the distribution to see your wsl.conf updates applied.

Reference: https://docs.microsoft.com/en-us/windows/wsl/wsl-config#configure-per-distro-launch-settings-with-wslconf

If you don't want to wait, then open Windows Terminal or Windows PowerShell run wsl --shutdown to shut down the WSL 2 VM or terminate a specific distribution (e.g. "Ubuntu") using wsl -t Ubuntu and relaunch it.

Check what all are running.

PS C:\Users\Abhijit\Desktop> wsl --list --running
Windows Subsystem for Linux Distributions:
Ubuntu (Default)

Then run shutdown or terminate command.

PS C:\Users\Abhijit\Desktop> wsl --shutdown

or

PS C:\Users\Abhijit\Desktop> wsl -t Ubuntu

Verify it is stopped.

PS C:\Users\Abhijit\Desktop> wsl --list --running
There are no running distributions.
PS C:\Users\Abhijit\Desktop>

6. Finally re-launch and verify.

Launch Ubuntu and check hostname.

abhijit@SrcCodes:~$ hostname
SrcCodes

Verify "hosts" entry is also working correctly. You will not see following message anymore "unable to resolve host <hostname>: Name or service not known"

abhijit@SrcCodes:~$ sudo apt update
[sudo] password for abhijit:
Get:1 http://security.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Hit:2 http://archive.ubuntu.com/ubuntu focal InRelease
Hit:3 http://archive.ubuntu.com/ubuntu focal-updates InRelease
Hit:4 http://archive.ubuntu.com/ubuntu focal-backports InRelease
Fetched 114 kB in 1s (135 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
All packages are up to date.
abhijit@SrcCodes:~$

References