Hands-on: Putting Ubuntu Linux on a Microsoft Surface Go

Run Ubuntu on Surface Go

Running Ubuntu 22.04 LTS on Surface Go.

Photo: Simon Besson

The original Surface Go is a nice little tablet that extracts a lot from a low-power Pentium processor and a 10-inch screen. It’s light and portable, the perfect form factor for a device you put in a bag, ready to be dragged and used anytime, anywhere. With three generations of hardware, the original is nice and cheap on the flea market, and it’s one of the better value skins.

But it has its limits. For one thing, even though it has a TPM, its processor is not supported for Windows 11. So how do you squeeze a device that will be out of support in a couple of years, with Microsoft quitting Windows 10? The answer is simple: run Linux on it.

Of course, some things are easier said than done. Microsoft uses a lot of custom hardware in its Surface devices. Yes, you can run a standard Linux kernel, but you want more than that. Fortunately for us there Linux desktop hosted on GitHub The project, which built a surface-optimized kernel that is a quick replacement for most existing distros.

We see: Feren OS is a beautiful and easy to use Linux distro

So, Linux is it. But which distro? After a bit of searching, I found that Ubuntu or similar would be my best choice. Surface Go may not have all the security features Windows 11 requires, but like most Windows devices since the launch of Windows 8, it uses Secure Boot to protect your data. This means using Linux that comes with the appropriate code signing certificate, unless you want to take the time to access your Surface UEFI settings and turn off most hardware security features — and then go through the relatively complex process of installing and booting Linux.

Using Ubuntu, I was able to download the latest 22.04 LTS build, before using Rufus’ bootable USB Creation Tool to convert the downloaded ISO to a live USB drive with support for GPT UEFI systems. It helped to have a USB C stick on hand, since the Surface Go only has one USB C port, and there can be issues installing Linux through a USB hub.

Installation was easy enough. I started from the Recovery section of the Update screen of the Windows 10 Settings app, where I chose to use Advanced Startup. This gives you the option to boot your device from a USB stick, in this case my Ubuntu live image. With my USB drive inserted, I was given the option to boot with Linpus Lite. It’s not actually a Linpus distro, it’s a bug in the Surface UEFI bootloader that determines which grub-based Linux media is like Linpus. Click it to start installing Ubuntu, with the Linux environment starting up first, so you can see how it will look on your Surface.

While you can set up dual boot, and repartition your Surface Go drive, the small size of eMMC or SSD drives makes it easy to wipe Windows and start from scratch with a fresh install. Ubuntu will partition and format the drive for you as part of the installation process, switching from Windows NTFS file system to Linux ext4 file system.

There was one small issue here: The Surface Go’s 10-inch display isn’t fully supported by the Ubuntu installer. As you go through the steps of setting up a wireless network, choosing a keyboard language, and configuring a time zone, you’ll find yourself having to use the tab to get to the desired button to advance to the next step. Alternatively, you can flip your tablet on its side and use touch to drag the buttons to view. Linux support is helpful for the Surface Go touchscreen right from the start, simplify using your Surface as a tablet during installation instead of having to work with the Surface Go Type Cover keyboard.

Once Ubuntu is configured and installed, your Surface will restart. You can remove the USB drive at this point. After first booting, Ubuntu will run at the original Surface Go resolution but at 200% scale. I recommend using the Display Properties tools in the Ubuntu Settings app to switch to using the fractional scale and run at a more suitable 125% or 150% scale. You should then make sure everything is up to date, using the familiar Debian apt tools, before installing a custom Surface kernel.

The Linux Surface GitHub repo is the next port of call. Here you will find instructions on how to install the latest kernelHeaders and key dependencies, including a set of drivers for the Surface Touchscreen.

You can copy and paste the required commands into the Ubuntu terminal, following the instructions for Debian-based Linux systems. First get the keys used to sign packages, before configuring Ubuntu to use Linux Surface repositories. With these items in place, you will then download and install the new kernel, enable monitor drivers, and finally download the new kernel secure boot key. This displays the instructions in the device, so follow them carefully to install the key before updating the grub bootloader and restarting your Surface.

Check to see if your Surface has an optimized kernel installed.

Check to see that the enhanced Surface kernel is installed using Neofetch.

Photo: Simon Besson

You should now have a custom Linux kernel running in Ubuntu. Install and use the familiar neofetch to get the details of your system, and check that the kernel version includes the “Surface” string.

Linux runs well on Surface Go; It’s fast and efficient, with good battery life and support for almost all your device hardware. Unfortunately, “almost” means that there is no support for its cameras. This means having to bundle beta drivers as part of libcam. Again, there are instructions in the Linux Surface GitHub repository, along with commands that can be pasted into the terminal.

We see: How to create a Linux virtual machine with VirtualBox

I did not find that not all required packages were installed as part of the apt command provided. It was because they had their own requirements, and so they needed to be installed separately. Once installed, I can clone the libcamera git repository and build the camera drivers. Once the drivers are installed, you will be able to access both front and back cameras from any application that uses libcamera or gstreamer.

Configure Surface Pen support in Ubuntu

Configure Surface Pen support in Ubuntu.

Photo: Simon Besson

The whole process, including the assembly of the camera drivers, took about an hour. Ubuntu 22.04 includes the LibreOffice suite, with Firefox as the default browser. I decided to install Microsoft’s Edge as an alternative, and use it to host PWAs for Outlook, OneDrive, and Twitter, which gives me a basic set of tools that should suffice if I want to fit a lightweight tablet in my backpack, just in case. There is also stylus support, using a version of the Ubuntu Wacom tablet drivers that have been modified to support the Microsoft Surface Pen protocol.

Running Linux on old hardware like this definitely gives it a new lease on life, and a long-term future that’s beyond Microsoft’s support tables. It’s a process that schools and businesses can use to revitalize devices that would otherwise be scrapped, get old devices out of retirement, and ready for tomorrow.

Leave a Comment