Advice Needed: Fedora/Ubuntu + Windows Dev VM on Framework 13

Hi everyone,

I’m planning to get a Framework 13 Pro and wanted to ask for opinions from people already running Linux + virtualization-heavy workflows on it.

Currently I am a Windows user because my work requires .NET development and some Windows-only applications/tooling. However, I would really like to switch back to Linux as my primary OS. I used Linux more than 12 years ago, but I haven’t daily-driven it since then.

One of my biggest issues with Windows is that my laptop is both my personal machine and work machine, and over time the OS gets heavily polluted with work-related software, services, Docker setups, SDKs, etc. My idea is to instead use Linux as the main OS and run a powerful Windows VM as an isolated workspace for work-related tasks.

Another big reason I’m considering this setup is stability and recoverability. Right now, every time there are Windows updates, SDK updates, Visual Studio updates, Docker updates, etc., I’m always slightly nervous about whether something in my development environment will break afterward. If the entire work environment lived inside a VM, I could snapshot it before major updates/changes and quickly roll back if something goes wrong. That level of isolation and recoverability is very appealing to me.

At the moment I’m basically 50/50 between Fedora and Ubuntu and would really appreciate opinions on which one would better suit the workflow described below.

The hardware I’m planning to use:

  • Framework 13 Pro

  • Intel Core Ultra X9 388H

  • 64 GB LPDDR5X

  • WD/SanDisk SN850X 4 TB NVMe SSD

The Windows VM would be fairly heavy:

  • .NET development

  • Visual Studio

  • Docker-heavy workloads

  • multiple bind mounts

  • lots of RAM/CPU allocation

  • ideally support for 3 external 4K monitors

One thing I’m still trying to figure out is architecture and partitioning.

After discussing this with AI, the following layout was suggested:

  • / → Linux system partition (ext4 or btrfs)

  • /home → user data/configs/documents/VMs/etc.

  • /shared → shared workspace/codebase used for work projects and Docker bind mounts that also need to be visible from the Windows VM

The idea for /shared is that it would probably use NTFS so both Linux and the Windows VM can access it easily. The goal is for this partition to act as a common workspace between the Linux host, Docker containers, and the Windows VM. I also plan to run Docker on the Linux host directly (not inside the Windows VM).

Another idea that came up was possibly having a separate /data partition instead, where all large user data would live:

  • VMs

  • documents

  • etc

In that model:

  • /home would mostly hold Linux user-level configuration and dotfiles

  • /data would hold everything important and persistent

  • when switching between Fedora and Ubuntu (or reinstalling), /home could potentially just be recreated instead of preserved

I’m curious whether people think this separation actually makes sense in practice, or if it just adds unnecessary complexity.

The overall goal is:

  • keep the OS relatively disposable

  • be able to reinstall Fedora/Ubuntu without touching work data

  • potentially switch between Ubuntu and Fedora by replacing only /

  • keep development data and VMs intact

Questions I would love opinions on:

  1. Does this partition layout make sense for this type of workflow?

  2. Would you change anything?

  3. Is sharing /home between Fedora and Ubuntu actually practical long term, or does it eventually become problematic because of config differences?

  4. Would it be better to treat /home as disposable and instead keep all important data in a separate /data partition?

  5. Is NTFS a reasonable choice for /shared, or is there a better approach for sharing data between Linux, Docker, and the Windows VM?

  6. For the Windows VM, what is the best approach for using 3 external 4K monitors?

  7. At the end of the day, does this sound practical, or is it honestly better to just stick with Windows as the host OS?

Would really appreciate hearing real-world experiences, especially from people doing development work or running Docker/VM-heavy setups on Framework laptops.

Thanks!

You may want to isolate work Docker in a second Linux VM to keep it away from your personal stuff. For isolating dotfiles and user config, you might keep the /home partition but create new users such as lukas-ubuntu and lukas-fedora who’d store their user-specific stuff in /home/lukas-ubuntu and /home/lukas-fedora respectively.

Put the Windows VM on a dedicated partition and pass the raw blocks through qemu-kvm.
Same if you go for a Linux VM running your Docker daemon.
Use a bridged networking setup to allow your VM’s and containers to talk to each other and the outside world.

Put the files you want to share on ExFAT, not NTFS, because Linux can read and write this more speedily and reliably than NTFS. Probably don’t store container images on a non-Unix FS (really POSIX with the user-id and group-id metadata), so maybe have the ExFAT partition for /media/shared-data alongside ext4/btrfs/XFS /media/virt-container-config.

Spreading across 3 monitors should be OK with qemu-kevm or other VirtManager-type tools to start and stop VM’s. There may be an avenue to carve a virtual-GPU from your Xe³ iGPU and add that to the Windows VM, too, at the cost of some of your RAM.

1 Like

Yup, agree with most of this. Not sure I’d bother splitting the VMs onto raw separate partitions as I think the KVM virtualised drivers are pretty low-impact these days… but other than that I’d agree.

Running Docker on Windows VM seems overly taxing, much better to have it in a separate linux VM if you feel you really need that isolation.

I’ve done something similar for most of the past ~ 13 years: Fedora host, and Fedora guest(s) along with the very occasional Windows guest (Win 8 - yikes).

Highlights (and a lowlight):

  • Used “native” tools: libvirt and qemu/KVM. Had used Virtualbox and even VMware in the long long ago (WinXP guest for Symbian OS development - long long ago), but these days I haven’t felt the reason for straying from the default/open source side of things. No custom kernel modules or anything like that.

  • Shared part of /home between host and guest. Initially I used a gnarly sshfs to mount guest directory to host, but once virtiofs matured I switched to that. Sharing pattern looks like:

    On host: /home/$HOSTUSER/projects/foo; mounted in guest as virtiofs filesystem with label bar under /home/$GUESTUSER/baz.

  • I’ve always preferred to run guests in what libvirt calls the user session, i.e. as my regular user, not root. Some of virtiofs maturation I mentioned had to do with this (and uid:gid mapping, IIRC).

  • Networking: I do create a “system” libvirt network bridge and still have user session guests use that. Host still acts as NAT for guests but vastly more efficient than the old SLIRP based user mode networking. Also makes it easier to expose guest services to each other if needed (and to the host for e.g. browser access).

  • The lowlight: One improvement I tried and failed to make: Use virtiofs not just for (parts of) /home/$GUESTUSER but for the guest’s root filesystem too. I wanted to do this because differential backups of the host are really slowed down by the (default) qcow2 disk images that libvirt configures for guests. I don’t remember the details of where I got stuck with this (SELinux label mapping?) but I stuck I got.

While planning this, also take a look at toolbx too. Might be useful instead of (or in conjunction with) VM guests some of your use cases.

You might want to keep your Windows and Linux on completely separate drives. If Windows doesn’t know that Linux exists on another drive, it probably won’t be able to goof up Linux in some way. This might be the simplest solution.

For a brief period I used to help friends set up dual boot Linux + Windows setups because they had to use Windows for some reason. Windows updates frequently clobbered the Linux boot loader.

I suppose that since then there may be a number of ways to keep Windows from interfering with Linux but fortunately these days I very rarely run into people who have to run Windows programs.

There are several ways you can have Linux installed on one drive and Windows on a completely separate drive.

On a Framework 12 or Framework 13 where you only have one internal M.2 NVMe socket, you can install Linux on an external USB M.2 NVMe SSD. The external USB Linux SSD won’t be quite as fast as it would be on the internal SSD but it should still be quite usable.

With the Framework 16 or Framework Desktop, you have two internal M.2 NVMe sockets and you can have two internal drives.

I have a friend whose elderly mother had an iMac. She became blind and he had to read her email to her and reply to the email she received as well as help her with other things she did on her Mac. My friend has been using Linux for 20 years and the differences between the KDE Plasma GUI and the Mac OS were driving him crazy. He asked me if there was some way that he could run Linux on the iMac but he didn’t want to overwrite the Mac OS on the iMac’s internal drive in case she wanted to use some Mac-specific app. I installed Linux on a USB external drive and he was able to use that to boot her iMac with Linux and use that for her email and the other things she did on her Mac. After his mother died at 99, we copied her personal files off the iMac, which had been declared “obsolete” by Apple five years earlier, installed Linux on the internal drive and gave it to a friend whose Windows 10 PC had just been declared obsolete by Microsoft. We also installed Linux on his “obsolete” Windows 10 PC and he gave it to a nephew who used the Steam store to play Windows and Linux games on it.

As your use case is very resource heavy and even requires multiple monitors on Windows side I’d recommend having separate laptops for Windows & Linux.

1 Like

Thanks everyone for all the advice and for sharing your experiences. There is a lot of useful information here.

I think the next step for me is simply to give it a try and spend some time experimenting with the setup.

My biggest concern is still the practical side of the workflow: sharing project files between the Linux host, Docker containers, and the Windows VM without introducing too much complexity, performance overhead, or filesystem-related issues. Some of the suggestions here (virtiofs, SMB shares, separate VMs, dedicated storage layouts, etc.) have definitely given me more options to explore.

Another alternative I have been considering is making the Windows VM completely self-contained. In that scenario, the VM would contain everything needed for work, including its own Docker installation and container workloads. The idea would be to bundle the entire development environment inside the VM so it would not depend on shared project directories or host-to-guest filesystem integration. I realize this would likely come with some performance and resource overhead, but it would also significantly simplify the architecture and make snapshots, backups, and rollbacks easier. I’d be interested to hear if anyone has gone down this route and whether they were happy with the result.

That said, I’m also trying to be realistic. If I end up spending too much time fighting the setup, or if there is a noticeable performance penalty compared to running Windows directly, I may simply go with a two-machine approach instead, as Zack1 suggested.

I currently have an 11th Gen laptop that I am going to repurpose as a home server. If the Linux host + Windows VM workflow doesn’t work out as smoothly as I’d like, I will probably get an older AMD or Intel board for my empty laptop chassis and install Linux there, while keeping a separate Windows laptop dedicated to work. It would be less elegant, but potentially simpler and more reliable.

Either way, I appreciate all the feedback. It’s been very helpful in understanding both the possibilities and the tradeoffs before setting everything up.

If anyone reading this has additional experience with a Linux host + Windows development VM setup, especially involving Docker, shared project directories, or multi-monitor workflows, I’d still be very interested in hearing your thoughts. More opinions and real-world experiences are definitely welcome.

Really? I haven’t had any problems with Linux reading and writing NTFS. And what is the largest file size ExFAT can handle? I know FAT32 is limited to 4GB for a single file, but don’t know what ExFAT is limited to.

Quite frankly I would use NTFS for the shared partition.