Baby's First Raspberry Pi Ubuntu Server: 20.10
In this post we walk through the initial setup for Ubuntu Server 20.10 64-bit on a Raspberry Pi 4: 4Gig.
Getting Started
We'll be using the Raspberry Pi Imager to write the OS to our SD Card. At the time of writing this, I am using a Windows 10 Pro PC to image the SD Card and we'll be using the Ubuntu Server 20.10 x64 image.
Download the Raspberry Pi Imager and install the .exe. From there we'll insert the SD Card into our system and open up the Raspberry Pi Imager. Once open we'll click on the "CHOOSE OS" button, select "Other general purpose OS" > Ubuntu > Ubuntu Server 20.10 64-bit. Next you'll click on "CHOOSE SD CARD" and select the SD Card that we're going to be using for the OS; click "WRITE" and read the warning that pops up. If you agree to the warning, click yes and wait for the process to finish.
** Please note that if there is anything written to your SD Card, the image flash will delete all of its contents.
First Boot
Now that the image has been successfully written to the SD Card, you may pull it out of your PC and insert the card into your Raspberry Pi. Turn on the Raspberry Pi while connected to your monitor and keyboard. Once booted up, you'll notice that unlike a regular Ubuntu Server install, there is no setup screen. You will be taken directly to the login prompt. The default username and password is "ubuntu" minus the quotation marks.
Now we'll sign in using the default credentials noted above.
Setting a Static IP
By default your gigabit ethernet port will be set to DHCP and will receive a DHCP lease from your DHCP server (may be a stand-alone DHCP server or off of your ISP provided router). As this is a server that will be used to host different services, I like to set the IP address statically to prevent any hassle in the future if the DHCP provided IP is lost.
**You may skip to the next section if you plan on keeping the interface set to DHCP.**
To do this we'll start by locating the netplan config which is found in the /etc/netplan/ directory. To locate the name of the file, we'll use the ls command as seen below:
ubuntu@ubuntu:~$ ls /etc/netplan/
50-cloud-init.yaml
From the output we see the file 50-cloud-init.yaml, this is the file we'll be editing next. To edit the file we'll use nano, a text editor, which already comes installed with our Ubuntu Server image. You should see something similar to the below.
ubuntu@ubuntu:~$ sudo nano /etc/netplan/50-cloud-init.yaml
network:
ethernets:
eth0:
dhcp4: true
match:
driver: bcmgenet smsc95xx lan78xx
optional: true
set-name: eth0
version: 2
In my case, I will be assigning this device the IP of 10.0.100.242/24 with a gateway of 10.0.100.1. The gateway will also act as the DNS server. So we'll need to change the config up above to match the one below:
network:
ethernets:
eth0:
addresses: [10.0.100.242/24]
gateway4: 10.0.100.1
nameservers:
addresses: [10.0.100.1]
match:
driver: bcmgenet smsc95xx lan78xx
optional: true
set-name: eth0
version: 2
**Make sure to select an IP address and gateway that works with your environment.
Now we will apply the config:
ubuntu@ubuntu:~$ sudo netplan apply
Then we'll check the interface to ensure it's using our config:
ubuntu@ubuntu:~$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether REDACTEDLUL brd REDACTEDLUL
inet 10.0.100.242/24 brd 10.0.100.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 REDACTEDLUL scope link
valid_lft forever preferred_lft forever
Finally, we'll ping Google DNS in order to confirm we can leave our internal network:
ubuntu@ubuntu:~$ ping 8.8.8.8 -c 4
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=118 time=24.3 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=118 time=23.8 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=118 time=24.4 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=118 time=25.3 ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 23.770/24.437/25.302/0.552 ms
If all goes well, you'll see four packets transmitted and 4 received!
Updating Your Raspberry Pi
Now that we've confirmed we have internet access, we'll want to update our Ubuntu Server install, this will include package and security updates.
First we'll update the list of packages:
ubuntu@ubuntu:~$ sudo apt update
~
Fetched 1194 kB in 2s (541 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
49 packages can be upgraded. Run 'apt list --upgradable' to see them.
ubuntu@ubuntu:~$
As seen above, there are 49 packages that can be upgraded. To upgrade all of the packages at once, we'll use apt full-upgrade with the -y flag which will auto accept all Yes/No requests.
ubuntu@ubuntu:~$ sudo apt full-upgrade -y
Once this is complete we'll adjust the time zone of the device:
ubuntu@ubuntu:~$ sudo dpkg-reconfigure tzdata
You'll be greeted by the screen below, go through the prompts using your arrow keys and select your time zone.
If successful, you should see the following with correct local time:
ubuntu@ubuntu:~$ sudo dpkg-reconfigure tzdata
Current default time zone: 'US/Eastern'
Local time is now: Sat Jan 2 06:39:22 EST 2021.
Universal Time is now: Sat Jan 2 11:39:22 UTC 2021.
ubuntu@ubuntu:~$
Yes, I was writing this at 6AM =).
Changing the Username and Hostname on the Raspberry Pi
As I'm sure you've noticed, we're still using the default username and hostname on our Raspberry Pi. Lets change that!
As we're already logged in with our ubuntu user, we'll set a password for root using the below and follow the prompts:
ubuntu@ubuntu:~$ sudo passwd root
Once the root password is set, you'll want to exit the ubuntu user session
ubuntu@ubuntu:~$ exit
Sign in as root and run commands below.
First we'll edit the ubuntu username:
ubuntu@ubuntu:~$ usermod -l <new username> -d /home/<new username> -m <old username>
Example:
ubuntu@ubuntu:~$ usermod -l Spooky -d /home/Spooky -m ubuntu
Next we'll edit the user's group:
ubuntu@ubuntu:~$ groupmod -n <new group name> <old group name>
Example:
ubuntu@ubuntu:~$ groupmod -n SpookyGroup ubuntu
Lastly, we'll lock the root account to prevent login:
ubuntu@ubuntu:~$ passwd -l root
Now we'll exit the root session and log in with our new username.
Finally we'll edit the hostname file with the hostname of the your choice!
Spooky@ubuntu:~$ sudo nano /etc/hostname
You'll see that the file only contains the ubuntu hostname, change it to what you'd like and save. Then we'll restart the Pi for the change to take effect.
Spooky@ubuntu:~$ sudo reboot
And we're done!
Conclusion
To sum this up, we've used the Raspberry Pi Imager to image the Ubuntu Server 20.10 OS onto our SD Card. We then set a static IP, updated the installed packages, changed the time zone to our own, updated the username/group name and hostname on our Raspberry Pi.
You should now have a good base to start messing around with your Raspberry Pi. I believe the next step to go through after this will be to create SSH keys for more secure access.
That tutorial from me will have to wait until I'm not lazy. =)
**<WIP>**
This is a WIP as I'm lazy. More info and screenshots soon =)! Maybe a comments section once I figure out how to do it.