Introduction
As we all know, running a computer operating system on an ARM64 platform comes with its fair share of compatibility headaches. Thanks to Microsoft's long-term efforts, Windows on ARM has become increasingly usable—it can even handle x86_64 apps through emulation with surprisingly low performance overhead, all while delivering better battery life. For instance, the Surface Pro X can last an impressive 6–7 hours on a single charge when running native ARM apps, whereas the Surface Pro 9 (Intel version), despite having about 20% more battery capacity, barely manages 3.5 hours or even less (without power-saving mode). What's more, even though the Pro X was released a full three years earlier than the Pro 9, its everyday performance is on par, and under heavy load, the Pro 9's fan spins up, the system stutters, and it actually feels less responsive than the second-generation Surface Pro X from 2020. So, running a desktop OS on ARM chips is becoming increasingly promising for portable devices.
However, none of the Linux distributions currently on the market support Snapdragon chips, especially the 8cx Gen 1 and Gen 2. I initially tried to start with a distro, but after attempting to boot seven or eight different ones, they all failed. I scoured nearly every resource I could find (in Chinese, English, and other languages) and discovered that no one had written an installation guide for the Surface or other 8cx devices. That made my task even more challenging.
So, if Windows on ARM is so great, why would I go out of my way to get Linux running on it?
Well, that brings us to the infamous WeChat. It doesn't offer an ARM64 version for Windows. The battery life I mentioned earlier only holds up if all your apps are ARM64-native. The moment you run a few x86-64 apps simultaneously, battery life drops back to around 4 hours—losing 1–2 hours. That's just not worth it. So, I decided to install Linux on this machine.
The Rocky Road
Why It's Hard
First off, running an OS on an ARM device isn't inherently difficult. As long as the BIOS is straightforward, the chip is supported, and the OS kernel can handle the device's key drivers, your ARM64 machine should boot up. Most Linux kernels come with a wide range of common open-source drivers, so you often don't need to go through the tedious driver installation process on a typical PC—just boot from a live USB, click install, wait for the progress bar to finish, and you're good to go.
But this is a Surface.
Not only does the Surface differ from regular PCs—its touchscreen, keyboard, speakers, and other components aren't standard plug-and-play hardware, making drivers hard to come by—but the Snapdragon 8cx Gen 2 chip itself is incompatible with almost all Linux distros. And to make things worse, this particular chip isn't even the stock 8cx Gen 2; it's a customized version that Microsoft calls the Microsoft SQ2. So, we're left waiting for someone skilled enough to make it work.
The Process
Day 1: Naive as I was, I started with the distros: from Ubuntu to Debian, from CentOS to deepin. Debian 13's non-free firmware version actually managed to boot to the installer, but the USB, Surface keyboard, and touchscreen were all unusable. That's when I realized that a generic kernel just wouldn't cut it for installing Linux on hardware like the Surface.
Day 2: I gave up on distros and turned to the linux-surface project.
But this project was a bit misleading. The device support page clearly didn't list the Surface Pro X (all supported devices were x86-based), so I initially dismissed it and kept searching for a Linux system that could boot on the Snapdragon 8cx. Then, back on the project's homepage, I noticed an inconspicuous project: aarch64-arch-mkimg. It turned out to be a bootable image (Arch Linux ARM—I'd considered it before, but it wasn't officially supported), essentially a live USB image that could boot into a live environment. To my surprise, after flashing it to a USB drive, the display worked, USB worked, and even the Surface keyboard and Wi-Fi were recognized.
With this image, even though you can't directly install Linux to the hard drive from it, at least you get the necessary kernel files.
My plan was to follow the AI's instructions step by step to partition the disk and install the system. But those tiny letters on the screen were a real strain on my eyes. After a whole morning of squinting, I felt like my eyesight had actually improved... but it didn't work—the system failed to boot into Linux.
Then I made a wrong turn: I decided to investigate the Debian that had successfully booted to the installer. I won't go into the details, but that wasted a few more hours...
Just when I was at my wit's end, a thought struck me: since it could connect to Wi-Fi, why not use an agent to SSH into my computer and let the AI take over?
So I did just that. I connected to the Surface using Mimo Code on my computer and got to work (though setting up SSH was a chore in itself—every failure meant rebooting into the live environment, reconnecting to Wi-Fi, switching to root, and enabling SSH, which was a real test of patience for my eyes, brain, and fingers). After seven or eight consecutive reboots with errors, I worked from 1 PM all the way to 4 PM.
But then I realized I was just being stubborn.
Because I was too lazy to log in, I'd been using Xiaomi's free basic model, thinking that any small model could handle this. The turning point came when I hit the peak usage hours in the late afternoon—the free model was lagging terribly. So I finally logged into Mimo and had it redo the task. When I gave the AI my final instruction, it worked. The system booted successfully into a Linux command-line interface! It was still a bare-bones setup, but it was a huge step forward.
Believe it or not, I even recorded a continuous video of the whole process. The moment I switched to the Pro model, it succeeded on the first try. So what was I doing for those two days? Just torturing myself, right?!
Day 3: Time to furnish the bare-bones setup. It was a real hassle, and without the AI's help, it would've taken a week or two. The challenges were: first, the system was missing drivers, Wi-Fi wouldn't connect, and I couldn't SSH in directly. The weirdest part? I didn't even have a username or password. So, the first step was to fix the login issue (even this trivial task could be handled by the AI). After that came the real hurdle: no internet access. Even plugging in an Ethernet cable didn't help. So, I had to reformat the USB drive I'd used for booting, and have the AI write a script based on the image with the useful kernel I'd downloaded, install networking tools, set up OpenSSH, and automatically display the IP address. This step also required patience—you have to face the errors head-on. I'll summarize the key points in a future post.
Next, it was time to get SSH working again. The timeline moved to the afternoon. But at least the hard parts were done. We continued to work hands-free, letting MimoCode install GNOME (you could also go with KDE if you prefer, but I wanted to try Nyarcher, a patch that gives Arch Linux a touch of anime aesthetics), along with Linux ARM64 versions of WeChat and QQ, and other common software. (Of course, at this point, Wi-Fi and Bluetooth might occasionally drop their drivers, so that might need fixing.) And then, for the rest of these three days, it was time to relax with some tea. Wait, no—that's for you all. I still had to study for my driver's license exam, so the computer just sat there. (Sigh, it's been a month since the college entrance exam, but every day feels like work—I haven't given myself a break at all!)
And that's the end of installing Linux on the Surface.
Stay tuned for the next part with photos and a detailed tutorial!