Raspberry Pi 4 Ubuntu Server 18.04.2 Installation Guide

Ubuntu Server logo
Ubuntu Server logo

Ubuntu Server has been my favorite Linux distribution for years. On everything but the Raspberry Pi I run Ubuntu Server but felt stuck with Raspbian on the Pi. Until now! Ubuntu Server 18.04.2 has been released and major improvements have been made to the official Pi branch.

The Raspberry Pi 4 is not officially supported out of the box yet on the current Ubuntu Server Raspberry Pi images but you can get it working by manually updating the firmware. Solid state storage is also working but with the catch of having to use a micro SD card as a bootloader since the Pi 4 does not have official boot support yet. I describe how to do both in this article.

The Raspberry Pi’s peripherals such as WiFi / Bluetooth are now fully supported. Previous Ubuntu Server versions for Raspberry Pi (like many other distros) had broken or completely missing drivers for core components such as WiFi / Bluetooth. In the 18.04.2 update the firmware for the WiFi and other components is now included out of the box making it a fully functional distribution!

This is the first distribution besides Raspbian that feels like you can just image it and everything works. I’ll guide you through the process in this guide. It only takes a few minutes to set up.

Recommended Gear

I highly recommend upgrading to a solid state setup. The performance gains are gigantic. It’s now less than 30 bucks to take your Pi solid state. This is the best performance upgrade you can possibly get for a Pi.

With the new Raspberry Pi 4 it’s even more beneficial to use USB storage since a USB 3.0 bus was finally added in the Pi 4 letting it take full advantage of solid state drives. This is the setup I am currently using:

Raspberry Pi 4 Model B 2 GB

StarTech 2.5″ SATA to USB 3.0 Adapter -AND- Kingston A400 SSD 120GB SATA 3 2.5” Solid State Drive

Or for a compact setup: SanDisk Extreme Pro 128 GB USB Solid State Flash Drive

For a micro SD card setup: SanDisk Extreme 64 GB A2 Application Class Micro SD Card

Getting Ubuntu Server

Head to the official Ubuntu Raspberry Pi page at https://wiki.ubuntu.com/ARM/RaspberryPi and scroll to the “Official Images” section.

32 bit (armhf) vs 64 bit (aarch64)

Getting the 32 bit version of Ubuntu Server booting is easier and faster than the 64 bit version right now. If you choose to install 64 bit pay close attention to the 64 bit specific steps in the instructions as missing any of them will cause your Pi to not boot!

Right now there is a memory limitation of 1 GB in 64 bit mode on the Raspberry Pi 4. I recommend using the 32 bit version of Ubuntu or waiting until the Raspberry Pi 4 support catches up. If you want to run the 64 bit one now anyway it works fine other than the memory limitation.

You should choose the armhf 32 bit version for now unless you have a specific need for a 64 bit distribution. The 32 bit version is faster and more stable for the overwhelming majority of use cases. The 64 bit version has come a very long way and is totally usable at this point but there are still some significant downsides.

The Raspberry Pi 4 brought us all the way up to the 4 GB barrier but to expand past that Raspbian will eventually have to go 64 bit as one of the limitations of a 32 bit operating system is it can only address 4 GB of RAM. To break the 4 GB memory addressing barrier the operating system is going to *have* to go 64 bit (aarch64/arm64).

For now 64 bit support works on the Pi but due to Raspbian and the Pi’s firmware not having an official 64 bit release it can be quirky and more difficult to configure.

Writing the Base Image

This part is easy. Extract the image from xz format to img format (7zip is great and free and can extract these). Now write the img to your media (Micro SD card, solid state drive, USB storage, etc). the same way you would for any other distribution!

Updating Firmware for Raspberry Pi 4

Remove Existing Firmware

The firmware in the current release was not built with Raspberry Pi 4 support so we need to update the firmware on the /boot/ partition for the Pi 4 to be able to boot correctly.

Insert/mount the micro SD card in your computer and navigate to the “boot” partition. Delete everything in the existing folder so it is completely empty.

Download Latest Firmware

32 bit Firmware Instructions

If you are trying to run the 64 bit version of Ubuntu skip to the 64 bit instruction section next. For 32 bit versions of Ubuntu download the firmware from the official GitHib repository here: https://github.com/raspberrypi/firmware/archive/master.zip

The latest firmware is everything inside master.zip “boot” folder (including subfolders). We want to extract everything from “boot” (including subfolders) to our micro SD’s “boot” partition that we just emptied in the previous step. Don’t forget to get the “overlays” folder as that contains overlays necessary to boot correctly.

The end result will look something like this on the “boot” drive:

$ ls
  COPYING.linux                bcm2711-rpi-4-b.dtb   kernel.img
  LICENCE.broadcom             bootcode.bin          kernel7.img
 'System Volume Information'   cmdline.txt           kernel7l.img
  bcm2708-rpi-b-plus.dtb       config.txt            overlays
  bcm2708-rpi-b.dtb            fixup.dat             start.elf
  bcm2708-rpi-cm.dtb           fixup4.dat            start4.elf
  bcm2708-rpi-zero-w.dtb       fixup4cd.dat          start4cd.elf
  bcm2708-rpi-zero.dtb         fixup4db.dat          start4db.elf
  bcm2709-rpi-2-b.dtb          fixup4x.dat           start4x.elf
  bcm2710-rpi-3-b-plus.dtb     fixup_cd.dat          start_cd.elf
  bcm2710-rpi-3-b.dtb          fixup_db.dat          start_db.elf
  bcm2710-rpi-cm3.dtb          fixup_x.dat           start_x.elf

64 bit Firmware Instructions

To boot Ubuntu Server in 64 bit mode we need to download the 64 bit version of the firmware. The .dtb files are different between 32 bit and 64 bit operating systems. Raspbian does not come with a 64 bit bootloader and one isn’t provided in the official GitHub repo either.

Building the 64 bit version of the firmware yourself requires a cross compile toolchain and a lot of time but it is an option. Fortunately sakiki has provided a blob of the 64 bit version firmware intended to be used to boot Raspberry Pi 4 64 bit devices in the mean time while support continues to catch up.

Download the firmware blob: https://github.com/sakaki-/gentoo-on-rpi3-64bit/releases/download/v1.4.2/deploy_root_p4.tar.xz

Extract the files from deploy-root/bootfs in the archive to the “boot” partition on the SD card that we cleaned out in the previous step. This will give us our 64 bit bootloader.

Create/Update config.txt and cmdline.txt

Navigate to the micro SD /boot/ partition. Create a blank cmdline.txt file with the following line:

dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0

Next we are going to create config.txt with the following content:

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

[pi4]

[all]

64 bit config.txt Configuration

To boot the Pi in 64 bit mode we need to add the following lines to the config.txt:

total_mem=1024
arm_64bit=1
enable_gic=1
armstub=armstub8-gic.bin 

The final configuration for 64 bit will look like this:

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

[pi4]

total_mem=1024
arm_64bit=1
enable_gic=1
armstub=armstub8-gic.bin

[all]

These enable all the different 64 bit related options you need to perform a 64 bit boot on the Pi.

Note on total_mem=1024: at the moment the Raspberry Pi 4’s SD card won’t work in 64 bit mode without capping the total memory to 1 GB. This is being worked on and will be fixed as soon as official support rolls out.

Boot Ubuntu Server

We are now ready to boot the device. Insert the micro SD card and power on the device.

Note: The very first startup can be very slow. Be patient. It can take up to 2-3 minutes with no activity lights then all the sudden everything will start blinking and SSH will open up.

Fix apt-get update

If you try to apt-get update now it will try to update your firmware with older firmware from the Ubuntu repository. The workaround for now is to remove that package so it keeps your existing firmware. Make a note to remember you did this step as later on we will want to reenable updates from the repository once support has been added.

sudo apt remove flash-kernel initramfs-tools

You may now run sudo apt-get update && sudo apt-get upgrade but don’t use dist-upgrade yet because the kernels in the repository it will update you to don’t support the Pi 4 yet. But this should get you all up to date on the packages!

Solid State Drive (SSD) Configuration (Optional)

USB booting has not been added into the Raspberry Pi 4 firmware yet but is being worked on right now. In the mean time you can use your micro SD card as a bootloader and still boot the whole operating system (rootfs) from the solid state drive giving you the full USB 3.0 speed increases system wide. Once the Pi USB booting is officially released you should be able to boot directly from the device without any makeshift bootloader SD card necessary.

First create a fully imaged and booting micro SD card following the earlier steps in the tutorial. After you have created the micro SD installation you should now image your SSD / USB drive with the same Ubuntu image you used to create the SD card.

Now navigate to the “boot” partition on the newly created SSD / USB drive and remove everything in there just like we did with the SD card earlier. Now copy the “boot” folder from the micro SD card to the solid state drive. This is necessary because even though the files in “boot” are read off our micro SD card initially some firmware files in the later load stages are read off the mounted drive and if the necessary firmware files are missing the system won’t boot.

Now that you’ve created the SSD / USB drive partitions and copied the “boot” partition from the SD card to your new drive we need to update your SD card’s cmdline.txt to point to the SSD / USB drive’s partition.

dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0

The key part we need to change here is the “root=/dev/mmcblk0p2” section. mmcblk0p2 is a hardware identifier for micro SD storage. We need to change this to the device your storage is detected as.

If you are using a USB to solid state drive adapter it’s very likely your drive will be addressed as /dev/sda2. Therefore we will change the root=/dev/mmcblk0p2 to root=/dev/sda2

root=/dev/sda2

The final line will be:

dwc_otg.fiq_fix_enable=2 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 rootwait rootflags=noload net.ifnames=0

Plug both the micro SD and the solid state drive into the Pi and boot it up.

Remember: the first boot can take 2-3 minutes for first startup so give it some time before assuming it didn’t work.

Configuration

Default User / Password

The username and password for your initial login to Ubuntu Server will be:

user: ubuntu
password: ubuntu

You will be required to change your password after logging in for the first time. Make sure on the prompt you enter the current “ubuntu” password before typing in your new password or the device will kick you out completely and you’ll have to log in again.

Set Time Zone

To configure the correct time zone for Ubuntu Server use the following command:

sudo dpkg-reconfigure tzdata

This will take you to a very easy to follow menu to select your correct time zone and applies it to the system.

Update System

For best stability, security and performance you should immediately update your system and packages to the latest version. This will also grab all of the latest fixes/improvements making your Raspberry Pi Ubuntu experience much better.

This part is easy. Type:

sudo apt-get update && sudo apt-get upgrade

Change Default GPU Memory Split

The default amount of memory allocated to the GPU on the Raspberry Pi is around 76 MB of our 1 GB. In 2 GB and 4 GB models the amount gained from this is negligible but is still worth it for the 1 GB model.

If you type the command “free” you will see that your Raspberry Pi is missing this memory under the “total” column. We can reclaim most of this memory back by setting the GPU memory split to 16 MB. If you are planning on installing a GUI in the future you should not make this change.

This option is set in the config.txt file. It’s exactly the same file as Raspbian uses but it is located at /boot/firmware/config.txt instead of /boot/config.txt. Open config.txt with the following command:

sudo nano /boot/firmware/config.txt

We will add the following line at the bottom of config.txt:

gpu_mem=16

Press Ctrl + X and type yes to save the file. Now restart the Pi by typing

sudo reboot

After the reboot finishes type “free” again and you will see that your total available memory has increased and can now be used by the system and your applications!

Conclusion

I’m very excited to see my favorite Linux distributions continue to evolve to the point where they are comparable in performance and stability to Raspbian. I’ve been testing extensively on Ubuntu Server 32 bit and 64 bit for my Raspberry Pi Minecraft Server project and not only is it on par with Raspbian but starting to do things so well it sometimes makes Raspbian feel a little dated.

If you have any questions or suggestions don’t hesitate to leave me a comment on the post or use my contact form to message me privately! I’m good about responding quickly and my articles are constantly revised to address questions or do something a better way that a reader pointed out.

Have fun!

36 thoughts on “Raspberry Pi 4 Ubuntu Server 18.04.2 Installation Guide”

  1. Avatar for Fred Lee

    Thanks for this article! I’ve got a couple SSDs being delivered today, and I plan to upgrade a couple of my RPI 3B+ to SSD and Ubuntu 18.04 this weekend.

    Do you have any insights on memory usage of Raspbian vs 32-bit Ubuntu Server? With stock installs are they in the same ballpark?

    Thanks!

    1. Avatar for jamesachambers

      Hey Fred,

      On the completely stock images (before changing gpu_mem to 16MB to get back the memory from the GPU split) I’m showing:

      Raspbian Stretch 32-bit – 858304 available
      Ubuntu Server 18.04.2 32-bit – 844460 available

      So they’re extremely close. Closer than I thought it would be actually!

  2. Avatar for tran

    I have a Raspberry Pi 3 +, but i tried to install ubuntu server 10.04 failure,when i started up it that screen show out multicolored color, cant not into system, why?

      1. Avatar for jamesachambers

        Hey tran,

        It sounds like you’re on the right track! The multicolored screen is basically the Raspberry Pi bootloader. If all is well that should go away quickly and you’ll see the command window come up in the case of Ubuntu Server.

        If you are using the premade image in the guide you shouldn’t run into too much trouble theoretically. Just make sure you have the right version for your Raspberry Pi as the Pi 2 has a different image than the Pi 3 for example.

  3. Avatar for tran

    Thank you jamesachambers, i skip the “Solid State Drive (SSD) Configuration (Optional)” step, do i need to take this step?

    1. Avatar for jamesachambers

      If you are using a Micro SD card instead of a solid state attached via USB then go ahead and skip it

  4. Avatar for Mario

    If I want the Rasberry Pi 3 B+ to boot from SSD instead of microSD do I write the UBUNTU image to both SSD and microSSD?

  5. Avatar for Raf

    Hi, If correctly understand you make RaspberryPi 4 worked with Ubuntu Server 18.04? In my case I’m doing everything like you said and nothing my RPi4 doesn’t boot 🙁 Any tips for me?

  6. Avatar for Kurt

    James,

    Did you get this working with an RPi4? I followed your instructions but 18.04 doesn’t seem to even boot. (Raspbian buster works fine.)

    1. Avatar for jamesachambers

      Hey Kurt,

      I’m still working on the Ubuntu one. I was able to install Kali Linux on the Raspberry Pi 4 using the new bootloader but haven’t been able to get it to work with Ubuntu.

      I’m traveling for a couple of days and if someone else hasn’t posted the answer I’ll get it to boot!

  7. Avatar for Altback

    Using the steps mentioned, the armhf version of Ubuntu boots but the arm64 version gets stuck on multicolored screen and the boot doesn’t proceed.

    I think firmware that was downloaded only support 32bit is right now.

    Also, I got an error while upgrading the system using apt-get.

        1. Avatar for Altback

          It booted up.
          But I got the following errors while updating and upgrading:

          Setting up initramfs-tools (0.130ubuntu3.8) …
          update-initramfs: deferring update (trigger activated)
          Processing triggers for initramfs-tools (0.130ubuntu3.8) …
          update-initramfs: Generating /boot/initrd.img-4.15.0-1031-raspi2
          W: mkconf: MD subsystem is not loaded, thus I cannot scan for arrays.
          W: mdadm: failed to auto-generate temporary mdadm.conf file.
          Unsupported platform.
          run-parts: /etc/initramfs/post-update.d//flash-kernel exited with return code 1
          dpkg: error processing package initramfs-tools (–configure):
          installed initramfs-tools package post-installation script subprocess returned error exit status 1
          Errors were encountered while processing:
          initramfs-tools
          E: Sub-process /usr/bin/dpkg returned an error code (1)

          1. Avatar for jamesachambers

            Very nice, glad you got in!

            Ubuntu is trying to update the firmware with an older version from their repository. The workaround for now is to remove that package.

            Use: sudo apt remove flash-kernel initramfs-tools

            You may now run sudo apt-get update && sudo apt-get upgrade but *don’t* use dist-upgrade yet because the kernels in the repository it will update you to don’t support the Pi 4 yet. But this should get you all up to date on the packages!

            1. Avatar for Altback

              Thank you, that did it. Packages did got updated.

              I noticed one thing on reboot after logging into user it said some packages are available for upgrade out of which few are security updates.
              But, when I again ran the command for update and upgrade, nothing was there to be updated.

              Anyways, this will keep me going for testing Ubuntu 18.04.02 LTS on Raspberry Pi 4b.

              I tried few packages. Virtualmin installation failed because few packages were not found in the repository. I think lot of packages don’t have their ports for ARM64/32. But, the most common packages are available.

              Again, thank a lot for the prompt updates.

  8. Avatar for AWDDude

    Any idea on when we can get rid of the 1024 ram limit for the 64bit os? The main reason i for the rpi4 was to have more ram?

    1. Avatar for Altback

      I think when the official Ubuntu images for Raspberry Pi 4b would come, they would have support for full RAM. Hoping they release them soon.

  9. Avatar for Tom

    Thanks for these detailed instructions, they have been really helpful in trying to get a 64bit OS running on a pi 4.

    I’m having an issue with getting the 64bit version working fully, but I’m not sure if I have misunderstood your instructions, or possibly even just how raspi bootloading works.

    When I clear out the boot partition and replace it with the contents of the bootfs from the archive provided by sakaki, that also replaces the kernel8.img, which then means I’m not booting the ubuntu kernel, and the kernel modules fail to load on boot as it’s looking for modules in /lib/modules/4.19.56-v8+ (which doesn’t exist) rather than the 4.15.0-1031-raspi2. It does still boot successfully, but I can’t get things that rely on kernel modules to work (LVM for instance). Is this the intended behaviour, or am I doing something wrong?

    1. Avatar for jamesachambers

      Hey Tom,

      Great questions! Once you boot into Ubuntu can you try copying the files from rootfs to the Pi? This is the /lib/modules/4.x folder for the newer kernel.

      1. Avatar for Tom

        Thanks James, I ended up compiling the raspi kernel for arm64 and using the modules and kernel from that with the raspi3 arm64 ubuntu image, but your suggestion would have been the sensible option.

        Now I’m just waiting for proper 2711 v8 support (or for a suitable workaround for the 1GB ram limit).

  10. Avatar for Ibrahim

    Thanks for your instructions. I wrote the Ubuntu image on the SD card, but I do not find the boot partition. Should not be a folder on the SD card?

    1. Avatar for jamesachambers

      Hey lbrahim,

      It definitely should just be a folder on the SD card (FAT format for boot). Try writing the image then ejecting the card and plugging it back in (sometimes that works for me if it doesn’t show up right away).

  11. Avatar for foo

    thanks for the tutorial, as some code is 64bit only these days… =)

    After trying the bootloader patch, I find the system reboots never after trying:
    sudo shutdown -r now

    Yet this seems to work fine, after a powercycle:
    sudo shutdown -h now

  12. Avatar for James

    Can’t get this working for the Pi4, just sits there with a blank screen. Still it’s early days and I look forward for the official release!

    1. Avatar for jamesachambers

      Hey James,

      I think we’re all expecting it to get dramatically better very soon as they update their preinstalled server image for the Pi 4. For now it’s definitely kind of hacky and some configurations still aren’t working.

      The second I hear of it coming out everything will be updated!

  13. Avatar for Adam Beeman

    I followed the 32-bit directions, and it works up to a point; the system boots up and gets on the network, but I’m connecting an Apple Magic Keyboard via USB and it doesn’t work; console is unresponsive to keyboard input but I can ssh into whatever IP eth0 picks up from DHCP.

    (My usb keyboard works fine with everything else including Raspbian Buster on the Pi 4, so this is odd….)

    1. Avatar for jamesachambers

      Hey Adam,

      Have you tried in both the blue USB 3.0 ports and black USB 2.0 ports?

      It may be worth typing sudo lsusb to see if anything is being detected when it’s plugged i.

      1. Avatar for Adam Beeman

        Hi James,

        Connecting a Logitech wired USB keyboard worked for me. So the Apple keyboard does show up (but doesn’t work):

        Bus 001 Device 004: ID 05ac:0267 Apple, Inc.

        It doesn’t seem to matter which USB port the Apple keyboard is connected to, no luck with it so far.
        At least the Logitech works!

  14. Avatar for Bruce

    Hi James,

    Thanks for the great article. I am able to boot up the ARM64 version of 18.04 on my new Pi 4. However, i2c does not appear to be working even though I removed the comment (#) in front of dtparam=i2c_arm=on in /boot/firmware/config.txt. An “ls /dev/i2c*” returns nothing found. Any idea what I need to do to enable i2c on the Pi 4?

  15. Avatar for Bruce

    Hi James,

    I was able to make I2C work on the 64 bit version of Ubuntu18.04 on the RPi4 by copying the files from rootfs provided by Sakaki to the Pi. This was suggested by you to Tom back on July 12th.

    A few things I have noticed….I have to manually start Ethernet from the command line using “sudo dhclient -v eth0”. No luck with WiFi so far.

Leave a Comment

Your email address will not be published. Required fields are marked *

Type here..