Tinkering on Windows

Terminal access has become so integral to the way I interact with computer systems that when I finished building my gaming PC a few months back, I immediately began looking for ways to enable this on Windows.

I didn’t want to deal with dual booting since a lot of the time I work by interrupts. Having to restart my computer and select OS by the bootloader would require a mental context switch, which is not preferred. The last time I used Windows, I remember comparing the performance of Virtualbox VM with an early version of the Windows Subsystem for Linux (WSL). I started there to evaluate my options.

Learning Powershell

Out of the question. While this might work for higher level work that to the dev is system-agnostic, I really didn’t want to learn powershell.

WSL/WSL2

This was pretty promising at first, as it had been a while since I had first used WSL when it was in beta. Had some initial troubles getting it installed due to conflicting hypervisors, but I eventually got it working. I use this as my daily driver since it spins up so quickly. Of course, I can’t use this direcly like Linux, so for other projects I must use another solution. This was apparent when I first tried to install Jepsen, which requires access to cgroups. You also can’t use systemd, which while controversial, is necessary for installing certain projects.

WSL was good for various web projects, as it did not rely on features of the operating system by nature. Docker Desktop on Windows and WSL integration was also a pleasant surprise. All this seems tuned for web developers though, e.g. as long as Docker works, no need to dig deeper into system-level stuff.

Virtualbox

It was a bit clunky to use, and involved a graphical component that I was unfamiliar with. I could run it in headless mode of course, but I ran into various issues in getting it installed. There was a weird Hash sum mismatch when using apt that I seemed to only get in Virtualbox. I tried for a few hours to get this debugged, but decided there was a better use of my time. Something had caught my eye when I went on the Ubuntu website to download the latest ISO that I hadn’t seen before – something called Multipass.

Multipass

Multipass is a CLI tool to spin up and manage linux virtual machines. On windows, it uses Hyper-V, and its calling syntax is quite similar to Docker, which is a plus. I’ve since settled on using WSL2 + Multipass. WSL being my daily driver, and Multipass when I need to run certain projects in a Linux machine. For example, I have an Ethereum fullnode for development running in a single Multipass VM.

To avoid many layers of virtualization, I’ve installed Multipass directly on Windows, and am using the CLI tool passed into WSL, e.g. alias multipass='multipass.exe'. This presents some problems when mounting directories outside of the WSL filesystem. A workaround is to just launch multipass in Powershell, which has access to the classic Windows letter-name drives.

multipass.exe mount D:\data\ default:/data

It’s still a bit unfortunate that I have to use powershell for this, but once the VM is started with the right volumes mounted, I can use WSL to manage it. SSH also works nicely with multipass, so I’m able to connect it with remote editors like VScode.

Next steps

I’m happy so far with this setup. Granted, I’m not doing too much work with this setup these days, as I use a Macbook for work, but I’ll see what I can do in my spare time tinkering with things. Next step is to get a cluster of VMs up and hook up the networking so it works with kubernetes. It would be fun to play with public blockchain fullnodes and do some tinkering there.