Stylized Alex Ward logo

Putting Bluefin on a Surface Go

by cthos
About 6 min


Surface Go Showing the Bluefin Desktop

So, since Microsoft decided to shove AI into everything, destroying what little trust I had left in them in the process, I’ve been giving Linux another go! Now, disclaimers first, I’m still primarily in the Apple ecosystem. All my Cthonic Studios work is done on Macs (and this is partly for software reasons, which I’ll get into in a future post), and I have some Windows Gaming Handhelds (also more on that at the end) but I’m slowly converting some of my tech over.

Today I want to talk a bit about putting a Linux distribution on a Surface Go 1, which is something I wish I’d had the ability to read more about when starting this project, but before we get there I need to do a bit of preamble.

Back to Linux, a surprisingly pleasant journey

Permalink to “Back to Linux, a surprisingly pleasant journey”

A couple of weeks ago, I put Bazzite on my Framework 13”, and it’s been absolutely stellar. I’ve had zero major issues (and only a small number of minor issues) with that. Games still work! Doing development work still works great thanks to magical containerization! The wifi drivers just work! all in all it just works. It was a wonderful experience.

And all of this is thanks, under the hood, to Fedora.

Bazzite and the other distributions is based on Fedora Atomic Desktops, which are really neat. They’re basically the latest iteration of immutable desktops, which use various techniques to ensure that stuff in user-space remains isolated from the bits that make the computer go “brrrrr” which makes it easier to rollback or make changes to the core OS more safely.

One of the major barriers for me using Linux on the desktop for the longest time has been the propensity of updates to completely bork the system, making it unusable and taking upwards of hours to recover. Fedora Atomic Desktops promises to remove this problem by keeping updates contained and allowing you to boot back into previous versions of the OS after updates. You can even rebase your own version against another version to get yourself back to a known-good state in minutes and pin yourself there until the problem is corrected.

This is amazing. Universal Blue (the people behind Bazzite) also have a handy support document which covers how that functionally works. I’ve done a few updates on the Framework and so far nothing has exploded, so I haven’t had to resort to any of this yet, but just knowing it’s there and how easy it is to roll back is a comfort.

So, I’ve had this Surface Go 1 since it was first released and it’s gone through a series of being wiped about 4 times. Most recently I put Windows 10 back on it and it was…well… painful. The whole thing is super slow, and while the AI nonsense hasn’t made it everywhere, that damned Copilot button did get popped in. I don’t like this.

There’s no reason to get a Surface Go 1 in 2024. I’ve had one sitting around that I’m saving from eWaste and it seemed like a fun project.

So, it was time to try something different. I was so impressed with Bazzite, I wanted to see what it’d take to get Linux running on the Surface.

Here’s where the research started to get a bit concerning.

Running Linux on a Surface device requires a specialized Kernel

Permalink to “Running Linux on a Surface device requires a specialized Kernel”

Right, so the very first thing you’ll run into when wanting to run Linux on a Surface is that because the hardware is specialized you’ll need a specialized kernel. Fortunately, the folks over at linux-surface have done all of that workand even have a well documented way to get it working. That said, if you start reading the documentation, there are several steps you have to take post-installation to get the kernel installed.

The easiest way, of course, is through the package manager but for some surface devices you’ll need an ethernet port because the Wifi chip isn’t going to work out of the box.

But, I’m lazy. I don’t want to do that. Universal Blue to the rescue.

Universal Blue Images have linux-surface kernels built in

Permalink to “Universal Blue Images have linux-surface kernels built in”

That’s right kids, Bazzite and its peer systems (Bluefin, Aurora, uCore) have an image you can download which includes the linux-surface kernel in it.

Since I figured the Surface Go wasn’t going to be giving me a lot of gaming mileage in 2024, I went with Bluefin with the developer tools not preinstalled.

Sidebar, near as I can tell Bluefin and Aurora are the same except for Aurora uses KDE and Bluefin uses Gnome as the desktop manager.

This turned out to work great. I had zero problems wiping the entire drive, installing Bluefin, and then running it, though I did run into a couple of issues.

Surface Go showing a text editor side-by-side

This was an extremely straightforward process, so I’m just going to use a numbered list:

⚠️ Now, you might notice that below I don’t re-enable Secure Boot. This is because I didn’t update the BIOS before starting this process and older versions of the UEFI menu do not allow you to boot 3rd party systems with secure boot. I’ve not tried fixing this yet via linux, but I will update this post if I get around to it. So if you’re coming behind me, update your BIOS to the latest before doing this using Microsoft’s update tools.

  1. Download the surface image from the Bluefin site. Follow the prompts and they’ll give you the right options.
  2. Flash the image to a USB stick using the Fedora Media Writer (or using Balena Etcher)
  3. Reboot the Surface, and hold Volume+ while pressing the power button. This will boot you into the UEFI menu.
  4. Disable Secure Boot, and reorder the boot order to have external media be up top (getting the older Surface to show me the boot menu was difficult).
  5. Plug in your new USB drive and reboot (I used a USB-C stick, and did the whole install on battery).
  6. Boot to the linpus-lite drive and follow the prompts to install Bluefin.
  7. It will prompt you on the next reboot to Enroll the MOK for Bluefin to allow you to reenable secure boot.
  8. Profit!

After doing all of that I had a fully-functional Surface Go running Linux! Here are the things that work which surprised me immediately:

  1. The keyboard cover! (though it does take several seconds to recognize it on a fresh boot which is weird).
  2. The Pen is recognized as an input device! Pressure Sensitivity actually works in Krita!
  3. USB plug-and-play
  4. Trackpad gestures!
  5. Screen Rotation!
  6. DisplayLink Drivers for my external dock!

Surface go Docked to an external 2k monitor

All in all, everything again just works ™️ which was certainly not my experience for Linux on the desktop the last time I was daily driving it.

This thing isn't going to win any speed contests any time soon. Earlier, I was watching a youtube video while trying to multitask on it to see what it'd do, and while it behaved admirably given its aging hardware, it still stuttered when displaying the second display at 2k, playing video, opening discord, and trying to open LibreOffice.

Once everything was running, it wasn't a bad experience (certainly better than windows), but it was still kinda sluggish.

The other thing that I had thought / hoped we'd solved is the blurry bits on a high DPI display with Electron / Chromium apps. The tl;dr here is you have to enable the Ozone settings and set it to use ozone as the renderer in each of these apps flags: --enable-features=UseOzonePlatform --ozone-platform=wayland which will fix the display to work properly.

One final bit: you need to remember to suspend it manually if you don't want the battery to drain while you're not using it. I suspended it and left it overnight (for around 10 hours before I checked) and it'd drained about 10% in suspend, which was pretty good all things considered.

But yeah, otherwise everything worked pretty well!

So, I also have a Aya Neo Air which I’m barely using and guess what “mostly works” on it? ChimeraOS. So, I’m going to tinker around with getting that installed and working on it in the nearish future and see how it goes. I’m not 100% sure I want to do this since I’ll lose some of the Aya Neo niceness (for example, the TDP switcher is broken in Chimera so you have to use a different app).

I can’t do this on the Ally as no distribution will ever properly work with that proprietary connector for the XG Mobile so I’m going to have to keep playing cat-and-mouse with Windows on that one, but…yeah.

Anyhow! Hopefully I’ll get to report back with good news next time.