- SteamOS 3 on GPD Win 2 (Via Steamdeck recovery)
- Setting Expectations
- Installation
- Troubleshooting
- "setting times of '/usr': Read-only file system" or other read-only error
- My fixes are undone after a reboot!
- I totally updated both rootfs A & B, but now its broken again!
- How do I find my IP Address of my deck?
- How do I SSH into my Deck?
- Your demo video had menu UI sounds, I want that!
- Disable SteamOS Updates
- Citation & Sources
- Changelog
This is a intensive task, but highly rewarding. Also this is based off the SteamDeck recovery image which is designed for the SteamDeck, not third party appliances.
If this is intimidating, please wait for official SteamOS3 to release publically. This is a little extra fiddling as its designed to work with a SteamDeck.
This also requires some degree of knowledge working around a linux terminal. Though with patience, you'll get a finished result.
If this guide helped you, feel free to buy me a coffee via Ko-Fi!
- Launching & Playing Games
- Proper Screen Rotation
- WiFi
- Bluetooth
- Keyboard, and joystick selector modes
- Gamepad mode
- Mouse gamepad mode
- Touch screen needs calibration on Plasma Desktop
- Function Keys for Vol -/+
- Controller Game Rumble (obviously)
- Night Mode
- All Advanced power settings
- Framerate Limit
- TDP limit
- Scaling Filter
GPD Win 1 users: I've heard reports of random crashes. I don't have a unit to diagnose this and cannot troubleshoot. Please let me know if anyone fixes this, or knows why.
First the obvious disclaimer that I am NOT responsible for any damage you do. You can play around in the recovery USB though without installing.
- Download the recovery image
- Create bootable USB with Rufus
- Hit delete while booting to access BIOS and set boot order to prioritize my USB, and saved changes
- Boot into Recovery USB for SteamOS
- Edit
tools/repair_device.sh
in your home directory to change disk to/dev/sda
and remove the prefix (from "p").- You can do this in terminal with
nano ~/tools/repair_device.sh
- You can do this in terminal with
- Select option for "Reimage SteamDeck" on desktop
Let it run (it'll take some time). Don't reboot after.
This isn't required on all GPD Win devices, but its recommended just to play it safe. You're welcome to attempt to boot into SteamOS before trying this. If it fails, boot back into the Recovery USB and do these steps.
-
In terminal, via recovery, run
sudo blkid | grep sda | sort
. You'll see something similar to:/dev/sda4: LABEL="rootfs" UUID="85bac642-d35f-4b85-bd5b-4df56ae56308" UUID_SUB="32550c6d-819f-4c22-b2db-fb4cf890eb42" BLOCK_SIZE="4096" TYPE="btrfs" PARTLABEL="rootfs-A" PARTUUID="f1b55fb7-59de-b34e-a2e9-0a497b9513c0" /dev/sda5: LABEL="rootfs" UUID="ccafc966-0af4-432e-b74c-272a39754c8c" UUID_SUB="c23c5a68-0d00-4767-a75a-8cdf46cfea92" BLOCK_SIZE="4096" TYPE="btrfs" PARTLABEL="rootfs-B" PARTUUID="a707c36a-3ca1-6546-97e0-b2a0615b62b3" /dev/sda6: LABEL="var" UUID="f96b7861-0988-4b37-ad38-1f627a990738" BLOCK_SIZE="1024" TYPE="ext4" PARTLABEL="var-A" PARTUUID="fbc55735-d32b-d246-9d91-643f58fd837b" /dev/sda7: LABEL="var" UUID="e58a674e-a72c-4e30-aa02-af5bb52945e6" BLOCK_SIZE="1024" TYPE="ext4" PARTLABEL="var-B" PARTUUID="db1b1609-9dea-d74a-b0bd-b76fde7c3411" /dev/sda8: LABEL="home" UUID="60f9824b-32c8-4c48-abe3-06286459fd8c" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="home" PARTUUID="cc965a2c-2212-624b-9f63-51f338c8f926"
-
You'll have to update the grub config template to the radom UUID. Look for the partition labeled
rootfs-A
on the disk, copy the UUID field.- Example:
set STEAMOS_ROOT_A=d9b54a83-c3aa-479f-b630-8dac41101a77
- Example:
-
You'll also have to update the efi partition information. Look for the partition labeled
efi-A
, copy the disk device path.- Example:
set STEAMOS_EFI_A=/dev/sdb2
- Example:
Now the GPD Win 2 should boot into SteamOS. However, please read the next sections before proceeding. We're not done in recovery yet.
Booting now wont work entirely since Gamescope won't be happy with the version currently on your device. So we need to create a environment where we can boot in and correct the issue.
-
First mount the rootfs you would like to boot to writable, for example,
rootfs-A
sudo blkid
-
/dev/sdb4: LABEL="rootfs" UUID="d9b54a83-c3aa-479f-b630-8dac41101a77" UUID_SUB="c23c5a68-0d00-4767-a75a-8cdf46cfea92" BLOCK_SIZE="4096" TYPE="btrfs" PARTLABEL="rootfs-A" PARTUUID="fd5d0e43-e467-c443-8cfb-4dc086894ca2"
-
After that modify
/mnt/etc/sddm.conf.d/steamos.conf
to look like below, You'll need to usesudo nano
to modify this file. So typesudo nano /mnt/etc/sddm.conf.d/steamos.conf
.#Session=gamescope-wayland.desktop Session=plasmawayland.desktop
Use
CTRL-X
to exit the file, and hitY
to confirm changes and save.
If you're running through these steps on a GPD Win 2, continue to step 4a.
If you're doing this on a GPD Win 1, skip to step 4b.
If gamescope cannot start, one would just get a black screen. Which we need to fix. Gamescope currently has issues with Intel GPUs due to driver problems. You'll have to install older mesa packages and downgrade gamescope. See ValveSoftware/gamescope#392.
-
To modify the active partition once booted, first set a password on the deck user with command
passwd
-
Then run the following commands in terminal:
sudo mount -o remount,rw /
sudo btrfs property set -t subvol / ro false
sudo steamos-readonly disable
-
We need to add the repos needed, Edit
/etc/pacman.conf
with nano (sudo nano /etc/pacman.conf
). Find the[extra]
and[multilib]
sections to make them look like this:[extra] Include = /etc/pacman.d/mirrorlist SigLevel = Never [multilib] Include = /etc/pacman.d/mirrorlist SigLevel = Never
-
Finally: Downgrade Gamescope & install Intel Mesa:
- This requires internet. Connect to a network or use a dongle for ethernet.
sudo pacman -S extra/mesa extra/vulkan-intel multilib/lib32-mesa multilib/lib32-vulkan-intel holo/gamescope
-
Revert back to gamescope-wayland.desktop.
sudo nano /mnt/etc/sddm.conf.d/steamos.conf
and undo the changes we did earlier.- Remove
Session=plasmawayland.desktop
- Uncomment
Session=gamescope-wayland.desktop
- Remove
-
Reboot your device, and you should have working gamescope and Steam Game UI! 🤞
I do not own a GPD Win1, so I cannot provide troubleshooting. Thanks to "grump" for helping test out methods to get this guide working on their GPD Win1.
-
To modify the active partition once booted, first set a password on the deck user with command
passwd
-
Then run the following commands in terminal:
sudo mount -o remount,rw /
sudo btrfs property set -t subvol / ro false
sudo steamos-readonly disable
-
We need to add the repos needed, Edit
/etc/pacman.conf
with nano (sudo nano /etc/pacman.conf
). Find the[extra]
and[multilib]
sections to make them look like this:[extra] Include = /etc/pacman.d/mirrorlist SigLevel = Never [multilib] Include = /etc/pacman.d/mirrorlist SigLevel = Never
-
Grab the xf86-video-intel package from package manager with command
sudo pacman -S xf86-video-intel
-
After that make a xorg session from the wayland session.
sudo cp /usr/share/wayland-sessions/gamescope-wayland.desktop /usr/share/xsessions/gamescope-xorg.desktop
-
Then set sddm to launch the xorg session by changing /etc/sddm.conf.d/steamos.conf
- Command
sudo nano /etc/sddm.conf.d/steamos.conf
- Modify to look like:
#Session=gamescope-wayland.desktop Session=gamescope-xorg.desktop
- Command
-
Change gamescope-wayland.desktop to gamescope-xorg.desktop in
/usr/bin/steamos-session-select
... gamescope) #session_launcher="gamescope-wayland.desktop" session_launcher="gamescope-xorg.desktop" ;; ...
-
Add
sleep 5
to/usr/bin/gamescope-session
aftergamescope_pid="$!"
, So it looks like:gamescope -w ... gamescope_pid="$!" sleep 5 if read -r -t 3 response_x_display response_wl_display <> "$socket"; then
-
Attempt to go back to gamemode on the desktop. It won't work, but thats okay.
-
SSH into your device from another computer.
- In terminal, enter command
ip address show
and look for something likeinet 192.168.1.5
under wlan0.
- In terminal, enter command
-
The rest of these steps will be via SSH. Run
top
command to see processes and kill all the xorg / wayland / gamescope processes withkill PID_ID_HERE
. -
Run
sudo Xorg -configure
- If it worked, you should see something about
/root/xorg.conf.new
being created.
- If it worked, you should see something about
-
Run
cp /root/xorg.conf.new /etc/X11/xorg.conf
-
Run
sudo nano /etc/X11/xorg.conf
- In this file, look for a section called
Section "Monitor"
- In this section add
Option "Rotate" "right"
- For cleanliness, match the formatting of the other entries. Use spaces, not tabs.
- Hit
CTRL-X
to exit, HitY
to save the changes, andENTER
key to overwrite the file.
- In this file, look for a section called
-
Safely reboot your device with command
systemctl reboot
-
You should be running gamescope with proper monitor rotation.
-
We need to run some commands in terminal to configure the audio engine (Wire plumber):
mkdir -p ~/.config/wireplumber/main.lua.d cd ~/.config/wireplumber/main.lua.d cp /usr/share/wireplumber/main.lua.d/50-alsa-config.lua .
-
We need to modify 50-alsa-config.lua, run command
sudo nano 50-alsa-config.lua
-
Find and modify these lines (be sure to uncomment them!)
["api.alsa.period-size"] = 1024, ["api.alsa.headroom"] = 8192,
-
Restart the audio engine with command:
systemctl --user restart wireplumber pipewire pipewire-pulse
You need to mount the system as read/write. This can be done with sudo steamos-readonly disable
.
Its possible Steam updated itself. After an update, steam flips between two rootfs
filesystems for the OS. One is labeled rootfs-A
and the other is rootfs-B
. You just need to go through the fixes one more time and then you're good to go.
Sometimes performing an update will undo some of the driver level changes we made to intel / gamescope. This is rare, but you may need to downgrade gamescope again. Just perform these steps in SSH:
sudo steamos-readonly disable
sudo pacman -S extra/mesa extra/vulkan-intel multilib/lib32-mesa multilib/lib32-vulkan-intel holo/gamescope
In terminal, enter command ip address show
and look for something like inet 192.168.1.5
under wlan0.
Enable SSH with command in terminal:
sudo systemctl start sshd
sudo systemctl enable sshd
Then make sure you have a password set with passwd
. If you're using Windows, you can use something called PuTTY to SSH into your device.
You need to enable that. Go to "Settings" / Audio / "Enable UI Sounds".
I really don't recommend forcefully ceasing any updates to SteamOS as security patches and what not are important, plus you'd be missing out on the latest and greatest, but if you really don't want updates anymore, you can rename the two update scripts with the following commands:
mv /usr/bin/steamos-update /usr/bin/steamos-update-disabled
mv /usr/bin/steamos-update-os /usr/bin/steamos-update-os-disabled
If you want to re-enable updates, just rename the files back to their original filenames by removing the -disabled
postfix. This'll entirely stop all SteamOS updates and will show an error when it tries to fetch the latest updates.
- https://gist.github.com/Kethen/698cfa8cf387e131ebd36fbfbfe9272e
- https://www.reddit.com/r/gpdwin/comments/t6dw18/native_steamos3_on_gpd_win_2/
- 5/3/2022 : Instructions how to disable all SteamOS updates
- 4/26/2022 : Added some troubleshooting steps, steps to fix audio on GPD Win1 & removed loaner device section
- I decided that commiting to writing these guides for all the devices isn't worth the time, especially if they're going to eventually release SteamOS 3 officially down the road soon I hope.
- 4/19/2022 : Rewrote sections that were missing details. Added GPD Win1 instructions.
- 4/18/2022 : Updated some incorrect information, and a incorrect sudo blkid readout. Added troubleshooting section.
Thanks for the guide. It works on my brothers Win2. Question: Would it be possible to create a bash script that checks for drivers every time the OS boots and force the system to use the correct drivers? It seems that after updating, the system reverted back to the old drivers and I get booted into tty5. Reinstalling the correct drivers works, but for how long? Not sure. I know a little bit of bash scripting, but don't know if updating or rebooting would remove the bash script, especially if I use something like rc.local.