How I put Linux on a Microsoft Surface Go - in just an hour

Can you take an old Surface and run modern Linux on it?
Written by Simon Bisson, Contributor
Ubuntu running on a Surface Go

Ubuntu 22.04 LTS running on a Surface Go.

Image: Simon Bisson

The original Surface Go is a nice little tablet that squeezes a lot out of a low-power Pentium-class processor and a 10" display. It's light and portable, the ideal form factor for a device that you put in a bag, ready to pull out and use whenever and wherever. And with three generations of hardware, the original version is nice and cheap on the second-hand market, one of the better value Surfaces around.

But it does have its limits. For one thing, while it has a TPM, its processor isn't supported for Windows 11. So how do you squeeze more life out of a device that will drop out of support in a couple of years, as Microsoft winds down Windows 10? The answer is a simple one: 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're going to want more than that. Luckily for us there's the GitHub-hosted Linux Surface project, which has built a Surface-optimised kernel that's a drop-in replacement for most existing distros.

SEE: Feren OS is a Linux distribution that is as lovely as it is easy to use

So then, Linux it is. But which distro? After a bit of research, I found that Ubuntu or similar would be my best option. The Surface Go might not have all the security features required by Windows 11, but like most Windows devices since the launch of Windows 8, it uses secure boot to protect your data. That means using Linux that comes with the appropriate code-signing certificate, unless you want to spend time getting into the Surface UEFI settings and turning off most of the hardware security features – and then going through a relatively complex process to get Linux installed and booting.

SEE: How I revived three ancient computers with ChromeOS Flex

With Ubuntu I was able to download the latest 22.04 LTS release, before using the familiar Rufus bootable USB creation tool to turn the downloaded ISO into a live USB stick with support for GPT UEFI systems. It helped to have a USB C stick to hand, as the Surface Go only has one USB C port, and there can be issues installing Linux through a USB hub.

Getting installed was easy enough. I started from the Recovery section on the Update screen in Windows 10's Settings app, where I chose to use Advanced startup. This gives you the option of booting your device from a USB device, in this case my Ubuntu live image. With my USB drive inserted I was given the option of booting using Linpus Lite. It's not actually the Linpus distro, it's a bug in the Surface UEFI bootloaders that identify any bootable grub-based Linux media as Linpus. Click it to start the Ubuntu install, first launching a Linux environment, so you can see how it will look on your Surface.

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

SEE: How to create users and groups in Linux from the command line

There was one minor problem here: the Surface Go's 10" screen 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 will find yourself having to use tab to get to the button needed to progress to the next step. Alternatively, you can turn your tablet on its side and use touch to drag the buttons into view. Usefully Linux support for the Surface Go touch screen is available right from the start, simplifying using your Surface as a tablet during install rather than having to work with a Surface Go Type Cover keyboard.

Once Ubuntu is configured and installed, your Surface will reboot. You can remove the USB stick at this point. After booting for the first time Ubuntu will be working at the Surface Go's native resolution but using 200% scaling. I recommend using the display properties tooling in the Ubuntu settings app to switch to using fractional scaling and run at a more appropriate 125% or 150% scaling. You should next make sure that everything is up to date, using the familiar Debian apt tooling, before installing a custom Surface kernel.

The Linux Surface GitHub repo is your next port of call. Here you'll find instructions on how to install the latest kernel, headers, and key dependencies, including a set of drivers for the Surface touchscreen.

SEE: Linux Mint 21 arrives. Here's what's new

You can copy and paste the commands needed into the Ubuntu terminal, following the instructions for Debian-based Linuxes. First get the keys used to sign packages, before configuring Ubuntu to use the Linux Surface repositories. With these in place, you'll next download and install the new kernel, enabling the screen drivers, and finally downloading the new kernel's secure boot key. This displays instructions in the terminal, so follow them carefully to install the key before updating the grub bootloader and rebooting your Surface.

Checking to see that the Surface-optimized kernel has been installed.

Checking to see that the Surface-optimized kernel has been installed using neofetch.

Image: Simon Bisson

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

Linux runs well on the Surface Go; it's quick and efficient, with good battery life and support for almost all your device's hardware. Unfortunately the 'almost' all means that out the box there's no support for its cameras. That means having to compile experimental 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. 

SEE: How to create a Linux virtual machine with VirtualBox

I did find that not all the required packages installed as part of the provided apt command. That was because they had their own prerequisites, and so needed to be installed separately. Once installed, I could clone the libcamera git repository and build the camera drivers. And once the drivers are installed, you'll have access to both front and rear cameras from any application that uses libcamera or gstreamer.

Configuring Surface Pen support in Ubuntu

Configuring Surface Pen support in Ubuntu.

Image: Simon Bisson

The whole process, including compiling the camera drivers, took about an hour. Out the box Ubuntu 22.04 includes the LibreOffice suite, with Firefox as the default browser. I decided to install Microsoft's own Edge as an alternative, using it to host PWAs for Outlook, OneDrive, and Twitter, giving me a basic set of tools that should be enough if I want to throw a lightweight tablet into my backpack, just in case. There's even pen support, using a version of the Ubuntu Wacom tablet drivers that have been modified to support Microsoft's Surface pen protocol.

Running Linux on older hardware like this definitely gives it a new lease of life, and a long-term future beyond Microsoft's support schedules. It's a process that schools and businesses can use to revitalise hardware that would otherwise be scrapped, bringing older hardware out of retirement, ready for tomorrow.

Editorial standards