← Back to Articles

Why I chose WSL for embedded development

When good enough and practical beats chasing beautiful

What embedded development requires

Embedded development is different from building a full Linux workstation. You are not developing Linux itself or tweaking kernels. You are not working with niche low-level peripherals as the core problem.

Instead, embedded workflows need a reliable Linux user space for compilers, scripts, simulations, containers, and fast IDE integration. Robotics and embedded projects typically involve C/C++ cross-compilation, Python automation, simulation loops, CI-like checks, container-based tooling, and web development for documentation.

What I recently discovered is that WSL2 gives you exactly this capability without forcing a fragile machine setup. That becomes harder and harder with modern hardware. If your goal is to develop Linux itself, dual boot remains the better option. But if you want Linux as a professional development environment and you are OK to keep Windows as your main OS, WSL is the better engineering tradeoff.

The day dual boot broke me

I gave dual boot a lot of credit during my adulthood. If I remember well, the first time I set up two partitions to have Windows and Linux in my computer was around 15 years ago, in my freshman year at university.

So, I recently bought a new ASUS Zenbook: lightweight, beautiful, and with great performance. But because this kind of machine is highly optimized for Windows out of the box, there are usually many constraints that make alternative setups less straightforward.

That is fine when you stay inside the Windows lane. It becomes painful when you try to step outside it.

Without really realizing it, I did the full checklist to prepare the dual boot installation: secure boot settings, encryption-related prep, USB stick live boot, and all the usual painful steps that can easily consume your first full day of work.

Even after encountering familiar issues like video and GPU driver problems, even after GRUB and recovery-mode attempts, reaching live boot was not enough. I faced yet another problem specific to these lightweight notebooks: Ubuntu could not mount my hard drive. As far as I could tell, this was a compatibility gap between recent Ubuntu versions and very recent hardware. Not a simple setup mistake.

At some point I realized I was debugging my laptop more than my projects. There were hints that better support for my SSD stack would only come with future Ubuntu releases, which basically meant: keep waiting and hoping.

At that point, the lesson became clear. The kind of lesson that costs real time to learn: dual boot was the wrong battle for my use case. The real issue is that engineers should debug products, not their own machines. That is when I learned about WSL.

What is WSL?

WSL stands for Windows Subsystem for Linux. The simplest way to think about it: stay on Windows, but open a real Linux environment when you need it. No reboot, no dual boot menu. You open a terminal and it feels like Ubuntu, but it is living inside your Windows setup.

If you already know Windows and Linux, WSL feels like having a Linux workstation that can be started and stopped in seconds. You can run your usual tools, edit the same project files, and still keep all your Windows apps and drivers working normally. It is not a fake shell. In WSL2, it does use a lightweight virtual machine under the hood, but it feels integrated into Windows and behaves like a real Linux user space. That makes it perfect for development work where you want Linux tooling without turning your laptop into a constant troubleshooting exercise.

WSL vs. dual boot

Why does this choice matter? The decision between WSL and dual boot hinges on what your workflow actually needs. For embedded developers, this distinction becomes critical.

Setup and repeatability are the first big wins. WSL installation takes minutes and is fully reversible. You can set up an identical environment on a new machine without fiddling with partitions, bootloaders, or storage controllers, and switching between OSes is instant (no reboots).

As a downside, you may need extra setup for hardware access on WSL, like USB pass-through for certain debug probes and explicit port forwarding for tools that expect native Linux networking.

Dual boot, though, offers native Linux access to hardware. If you need direct control over low-level drivers, device flashing without USB pass-through complications, or real-time workflows with precise hardware timing, dual boot provides that native coupling.

For work requiring bare metal access or kernel-level debugging, it remains the more robust choice. In embedded development, however, this low-level interfacing happens on your target board, not on your development machine. So those concerns are not directly relevant.

Thus, for someone asking the practical question (does this setup maximize output with minimum operational friction?), WSL delivers clearly. It keeps Linux available where it matters while preserving stability and a straightforward installation process, without touching Windows or BIOS settings.

A practical embedded development setup

A comfortable, productive embedded setup does not need much: keep Windows 11 as the host and run WSL2 with Ubuntu 24.04.

As a terminal emulator, Warp stands out if combined with this setup. It is beautiful, packed with features, and its native AI assistance genuinely saves time navigating command workflows.

VS Code with the Remote - WSL extension integrates easily with the Linux side, and GitHub Copilot deserves the reputation. You use it constantly and it genuinely changes how fast you can move through problems.

ARM toolchains and standard Python packages inside Ubuntu behave identically to native Linux machines. Build loops and simulation runs execute without compromise, immediately available when needed.

Expect about 15 minutes on a machine with decent internet to install this setup on a fresh Windows 11 machine. Docker is included since it can be useful, but most embedded workflows can skip it if containers are not in your core toolchain.

If you want to replicate this setup, here is the exact order I used:

  1. Install WSL2 on Windows 11. Open PowerShell as administrator and run:
    wsl --install
    Docs: Install WSL
  2. Install Ubuntu 24.04. From Microsoft Store, install "Ubuntu 24.04 LTS", or run:
    wsl --install -d Ubuntu-24.04
    Docs: Ubuntu on WSL
  3. Install Warp terminal. Install Warp on Windows and point it to your WSL distro profile.
    Docs: Warp Quickstart
  4. Install VS Code + Remote - WSL. Install VS Code, then install the Microsoft WSL extension.
    Docs: Developing in WSL
  5. Enable GitHub Copilot. Install GitHub Copilot extension and sign in.
    Docs: GitHub Copilot Docs
  6. Optional: Docker integration. Install Docker Desktop and enable WSL integration for your Ubuntu distro.
    Docs: Docker Desktop + WSL

Final step: open your project folder in WSL, launch VS Code from there, and start working. The environment is ready for reproducible builds.

When to use WSL

Dual boot still works when hardware cooperates. For a long time it was my default choice for serious Linux work, but lately the setup has become less repeatable as I moved from one hardware platform to another. That legitimacy remains for certain workflows, but not for embedded developers.