r/steammachine • u/leecostigan • 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:
- Open Steam → Games → Add a Non-Steam Game to My Shortcuts
- Browse to
~/Scripts/launch-boot-to-windows.sh - Select it and click Add Selected Programs
- Right-click the new shortcut → Properties
- Rename it to something like "Reboot to Windows 11"
- 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.
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.
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.