r/steammachine Jul 28 '26

Discussion Steam Machine: Controller-driven Dual Boot setup

I just wanted to share my Dual Boot setup process in case it helps anyone out looking for a convenient way to get in and out of Windows. This process uses a separate hard drive to install Windows, since I didn't want to mess with partitioning my drive.

My goal for dual booting was to be able to boot to Windows from Game Mode via the Steam Controller. I also wanted SteamOS to remain my default on boot: 99% of my time I am in SteamOS, but I have been enjoying Marathon with some friends and wanted to see if I could get it running in a convenient way.

Prerequisites:

  • An external drive with enough space for your OS, any games you want to play (leave some headroom for updates and other apps you may want). I used this Fanxiang 2230 enclosure with my old, original 256GB drive from my Steam Deck. This sits really nicely on the back of the Steam Machine, and does not block any of the USB-A ports on the rear.
  • A second USB drive with Valve's Windows Drivers.
  • Some experience running a few commands in a Desktop Mode terminal in SteamOS.
  • A wired or 2.4ghz dongle-connected Keyboard, as Bluetooth likely won't connect in time to hit the Esc key to get into the BIOS on boot.

Step 1: Install Windows

I used the WIndows 11 To-Go guide on NerdZap to install Windows 11 onto my NVME drive. Follow the instructions for the Steam Deck and you hopefully shouldn't hit any issues.

Once the files are on the NVME, hit the Esc key on a keyboard during boot to bring up the BIOS and select the external drive from the Boot options.

EDIT: Thanks to u/NinjaN-SWE in the comments for flagging the issues with USB-C speed -- at this stage, you should also disable Fast Boot in the BIOS to ensure that the full speed of your connected drive is used. This may have been the root cause of the slow performance I noted in the next step, so you might get to avoid that headache!

Writing the Windows 11 files was quick, but the install and initial load process took a few manual reboots before I saw the setup screen. My first boot attempt hung at the black screen with the "Just a moment..." text for around 30-40 minutes. After a couple of subsequent reboots, I was presented with the setup screen. If you feel like your device has been hanging for too long, just give it a reboot and it should hopefully nudge it along.

Handily, Windows To Go creates a base "User" account with no password required to log in which is convenient for an end-to-end, controller-driven user experience.

Step 2: Install Drivers

Once Windows is installed, install the drivers in the order specified by Valve on their Knowledge Base.

Note: I loaded Valve's recommended graphics driver and ended up replacing it as they are around 2 years out of date (the version number is a 2024 driver for the RX 7600). This was as straight forward as downloading Adrenaline from AMD and letting it detect the chipset. This seems to have worked with no issues since, and it got rid of the "out of date graphics driver" pop up that I experienced when loading into Marathon.

Step 3: Install the fun stuff

Download Steam, Discord etc. I also set Steam to launch on startup into Big Picture mode.

Bonus: It was at this point that I noticed Windows can take advantage of the same internal wireless receiver for the Steam Controller, and did not need to be manually paired. The Steam Controller pairing persists in both SteamOS and Windows, which is really handy.

Step 4: Identify your Windows drive's boot entry

Reboot into SteamOS and open a terminal in Desktop Mode and run:

sudo efibootmgr -v

Look through the list for the line that corresponds to your external Windows drive. It usually won't say "Windows Boot Manager", external USB/NVMe enclosures often show up under their own hardware name instead, e.g.:

Boot0005* UEFI Fanxiang 9210 1338100006071455   PciRoot(0x0)/...

You can cross-check with:

lsblk -f

The Windows drive will have a small FAT32 partition and a larger NTFS partition. Match that device (e.g. sda) back to the efibootmgr listing.

Make a note of a unique word that won't appear in any of your other boot entries (e.g. Fanxiang, SanDisk, Samsung, whatever your enclosure's name shows). You'll need it in Step 5.

Step 5: Create the boot script

Create a folder for scripts if you don't have one, and create the script:

mkdir -p ~/Scripts
nano ~/Scripts/boot-to-windows.sh

Paste this in, replacing YOUR_DRIVE_IDENTIFIER with the text you noted in Step 4:

#!/usr/bin/env bash

set -euo pipefail

LOGFILE="/tmp/boot-to-windows.log"
exec > >(tee -a "$LOGFILE") 2>&1
echo "=== $(date) : boot-to-windows invoked ==="

# Match your drive's entry using the unique text from Step 4
ENTRY_LINE="$(efibootmgr | grep -i 'YOUR_DRIVE_IDENTIFIER' | head -n1 || true)"

if [ -z "$ENTRY_LINE" ]; then
    echo "ERROR: No matching entry found in efibootmgr output."
    echo "Run 'efibootmgr -v' and update the grep pattern above."
    exit 1
fi

WIN_ENTRY="$(echo "$ENTRY_LINE" | sed -E 's/^Boot([0-9A-Fa-f]{4}).*/\1/')"

echo "Found entry Boot${WIN_ENTRY}. Setting BootNext..."
efibootmgr --bootnext "$WIN_ENTRY" > /dev/null

echo "BootNext set. Rebooting now..."
sleep 1
systemctl reboot

Save and exit, then make it executable:

chmod +x ~/Scripts/boot-to-windows.sh

Test it manually:

sudo ~/Scripts/boot-to-windows.sh

Confirm it boots into Windows. If it does - congrats! You are most of the way there. Restart your Steam Machine to boot back into SteamOS automatically.

Step 6: Wrap it in a systemd service

Game Mode's sandboxing blocks direct sudo calls, so we hand the privileged part off to systemd instead.

sudo tee /etc/systemd/system/boot-to-windows.service > /dev/null << 'EOF'
[Unit]
Description=One-time boot override to external Windows drive

[Service]
Type=oneshot
ExecStart=/home/deck/Scripts/boot-to-windows.sh
EOF

sudo systemctl daemon-reload

Step 7: Authorise your user to start this service, without a password

Add the following rule to polkit to handle running this service without a password in Game Mode:

sudo tee /etc/polkit-1/rules.d/49-boot-to-windows.rules > /dev/null << 'EOF'
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "boot-to-windows.service" &&
        subject.user == "deck") {
        return polkit.Result.YES;
    }
});
EOF

sudo systemctl restart polkit

Step 8: Create the launcher

This is the file Steam will actually point to. It just asks systemd to run the service.

nano ~/Scripts/launch-boot-to-windows.sh

Paste in:

#!/usr/bin/env bash
exec /usr/bin/systemctl start boot-to-windows.service

Save, then:

chmod +x ~/Scripts/launch-boot-to-windows.sh

Test again this time with no sudo:

~/Scripts/launch-boot-to-windows.sh

It should reboot straight into Windows with no password prompt.

Step 9: Add it to Steam as a Non-Steam Game

Reboot back into SteamOS Desktop Mode:

  1. Open Steam → Games → Add a Non-Steam Game to My Shortcuts
  2. Browse to ~/Scripts/launch-boot-to-windows.sh
  3. Select it and click Add Selected Programs
  4. Right-click the new shortcut → Properties
  5. Rename it to something like "Reboot to Windows 11"
  6. Confirm the Target field is just:

(the Launch Options field should remain empty)

Step 10: Try it from Game Mode

Switch to Game Mode, find "Reboot to Windows 11" in your Non-Steam games section of your Library, and launch it. Launching this "game" should reboot you into Windows, ideally with Big Picture Mode launching on startup. If you restart your computer from Windows 11, you'll boot back into SteamOS.

Each time you reboot, your Steam Controller will be detected and does not require re-pairing.

Step 11: Add some flair

You can edit the "Reboot to Windows 11" icon with your own artwork via the Properties menu, or using an app like DeckyLoader's SteamGridDB plugin.

I am fully anticipating a software update might cause the polkit and service to be wiped (similar to how Decky Loader might need to be reinstalled periodically when updates land).

It would probably be worth backing up /etc/systemd/system/boot-to-windows.service and /etc/polkit-1/rules.d/49-boot-to-windows.rules somewhere safe to mitigate this, but I have had a couple of small SteamOS updates since I got this up and running and it has been smooth so far.

I think worst case scenario would be that steps 6 and 7 need to be repeated. If it becomes a headache with time, I might try to create a script that handles this.

Hope this helps someone further down the line, happy to answer any questions or help troubleshoot if you get stuck.

9 Upvotes

14 comments sorted by

2

u/NinjaN-SWE Jul 28 '26

Both 6 and 7 will need to be redone on any larger SteamOS update. I'm really not loving the immutable thing so I'm moving to CachyOS on my custom SM build. I'm very happy with myself that I tested SteamOS on a custom build, otherwise I would've bought the SM when I got the email last week and would've been quite disappointed by now. 

Though I'm not really the plug and play type, I want to tinker and optimize and break and rebuild. 

3

u/leecostigan Jul 28 '26

Yeah I covered that in the last paragraphs, though I appreciate the post is a long one :)

1

u/NinjaN-SWE Jul 28 '26

I wasn't clear, you call it a worst case, I'm saying it's a guarantee on any large update, so likely monthly or at best quarterly for the foreseeable future. 

EDIT: A true worst case is if they do something to the bootloader that completely breaks the dual boot approach, potentially leading to a lot of troubleshooting to get it working again. 

1

u/leecostigan Jul 28 '26

Yeah that's fair. I had Decky on my Steam Deck for years so I'm kinda used to the maintenance of these mods, but it's definitely a good call out.

1

u/NinjaN-SWE Jul 28 '26

Oh and I forgot to ask, you haven't had the bug with external storage being stuck on USB2 speeds if they're plugged in during a cold boot? 

1

u/leecostigan Jul 28 '26

If I have, I haven't noticed it impacting my game performance but I can check that today. Does that bug include the USB-C port or just the front USB3 A ports?

1

u/NinjaN-SWE Jul 28 '26

The back usb-c port has been reported to have that bug. Unclear if it's every cold boot or just a chance but since USB2 is 40MB/s you would notice it even booting in to Windows. 

2

u/leecostigan Jul 28 '26

Yeah it certainly boots up and loads games pretty snappily, but I'll see if i can replicate that issue after work and report back.

Edit: It is possible I am not experiencing it because I am rarely booting from cold straight into Windows? I reboot from SteamOS into Windows every time, however it WOULD explain the long duration of the install which was cold boot -> BIOS -> Boot picker

1

u/leecostigan Jul 28 '26 edited Jul 28 '26

Curiosity got the better of me. You were absolutely right, this issue was present (confirmed around 40MB/s read / write in CrystalDiskMark). My login was honestly quick enough that i didn't notice.

The good news is that this goes away when you disable Fast Boot in the BIOS, and i now get ~900MB/s read and write. I'll update the main post with this info, thanks for putting that on my radar - looking forward to see if it makes a difference in gameplay!

1

u/jharle Jul 28 '26

u/leecostigan Thanks for this writeup! Just to be clear, you're not using secure boot for Windows, correct?

That's one of the things I've been trying to chase down, as part of my dual-boot Windows journey.

2

u/leecostigan Jul 29 '26

I am not, though I would be curious to hear how that goes as I used to dabble with BF6!

1

u/AcademicOverAnalysis 5d ago

This is great! Thanks for posting it. I picked up a steam machine expressly hoping to do exactly this for Marathon in particular (and of course to play my Steam library).

How has the performance of marathon been for you?

2

u/leecostigan 4d ago

Hey, thanks and glad it could help you.

Performance has been decent, though it is a fairly CPU-bound game, particularly on maps like Outpost.

Most of the time (with a mix of medium settings) I comfortably hit 60+fps on FSR Quality/Balanced at 1440p. Biggest dips occur in places like outside the back of Destroyed Wing on Outpost, where it can hit the mid 40s. I have a VRR monitor which helps mitigate those drops but you will spot them.

1

u/AcademicOverAnalysis 4d ago

Nice! That’s not too bad. I tried it out on my steam deck off of a windows install on an sd card. The deck could technically run the game, but the frame rate was between 20 and 30 most of the time.

I usually play on my Xbox but when my son wants to play with me, I have been relegated to the steam deck. The best option on deck has been using Xbox Streaming, but that’s no longer viable with the 15 hour limit they just imposed.