While many of the VMs I create are meant to be short-lived, some are created as working environments for me. For me, it is infinitely easier to have them all have the username 'ed' so that my brain doesn't have to do too much context-switching, and so I can use muscle memory.
When creating a new VM with an Ubuntu image, though, the default user is 'ubuntu'. It's rather simple to change that to 'ed', but to do it correctly requires a series of steps. Note that these steps are for the current 18.04 LTS release; other releases may need some small changes, but the general steps should be the same. And as I found out those steps by searching the web and finding blogs of people who had done similar things, I thought I'd write down the steps so that in the future others can find this posting and find it useful. And it'll also be easier for me to find all of it in one place!
So start by creating a VM, using whatever tool you prefer. I use OpenStack (surprise!), which gives me the ability to upload my public key and have it available in the VM so that passwords aren't needed. The one I'm working on today is for deploying my IRCbot using kubernetes, so I named the instance 'kubeirc'. I add a line to my /etc/hosts file to point that name to the IP address of the instance. Once the VM is running I can connect using:
Some people feel that using a password-less sudo reduces security, but if someone has access to your user in your VM, you are probably already pretty hosed. So I change sudo to not require passwords. To do this, run sudo visudo, and change the line beginning with '%sudo' to read:
%sudo ALL=NOPASSWD: ALL
One of the problems to overcome is that you cannot rename the user you used to SSH into the instance. So I create another user, and give them sudo powers:
sudo adduser temp
sudo usermod -a -G sudo temp
My cloud doesn't allow SSH with passwords, so the next thing to do is copy the public key from the ubuntu user to the temp user:
sudo cp -R .ssh /home/temp/
sudo chown -R temp:temp /home/temp
Once that's done, I disconnect the SSH session, and the re-connect as the temp user:
If that doesn't connect you, go back in as the ubuntu user and re-check the permissions on the /home/temp/.ssh directory and its contents – that's usually the problem. Once I'm connected as temp, I can then get to work on switching the ubuntu user.
# Change the ubuntu username to 'ed', and change the home directory
sudo usermod -l ed -d /home/ed -m ubuntu
# Rename the 'ubuntu' group
sudo groupmod -n ed ubuntu
That's it! Now to verify, disconnect the current SSH session, and re-connect with the new name. Since my username on my home system is 'ed' (I told you I like muscle memory), I can just run:
...and I'm in! The only thing left is to remove the 'temp' user. It's not critical that you do so, but I like to clean up after myself. To do that, run the following:
sudo deluser temp
That will delete the user and group named 'temp', as well as the '/home/temp' directory.
Now I can continue using that VM with the same username as my other development environments. And while this isn't a large amount of work to do each time, I'd rather not do such repetitive work if I don't have to. So I add my standard stuff, such as git and vim configuration files, and then take a snapshot of the instance at this point. In the future, whenever I need an Ubuntu 18.04 instance, I can create it from this snapshot, and I'm ready to go.