Jump to content

Steam/zh: Difference between revisions

From NixOS Wiki
Weijia (talk | contribs)
Created page with "=== Proton ==="
Tags: Mobile edit Mobile web edit
Weijia (talk | contribs)
Created page with "== 参考 =="
Tags: Mobile edit Mobile web edit
 
(11 intermediate revisions by the same user not shown)
Line 159: Line 159:
By default, Steam also looks for custom Proton versions in <code>~/.steam/root/compatibilitytools.d</code>. The environment variable <code>STEAM_EXTRA_COMPAT_TOOLS_PATHS</code> can be set to add other search paths.
By default, Steam also looks for custom Proton versions in <code>~/.steam/root/compatibilitytools.d</code>. The environment variable <code>STEAM_EXTRA_COMPAT_TOOLS_PATHS</code> can be set to add other search paths.
</div>
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
自定义 Proton 版本的声明式安装(例如 GE-Proton):
Declarative install of custom Proton versions (e.g. GE-Proton):
</div>
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
programs.steam.extraCompatPackages = with pkgs; [
programs.steam.extraCompatPackages = with pkgs; [
Line 167: Line 165:
];
];
</syntaxhighlight>
</syntaxhighlight>
<div lang="en" dir="ltr" class="mw-content-ltr">
可使用 ProtonUp-Qt 手动管理多个 Proton 版本:
Manual management of multiple Proton versions can be done with ProtonUp-Qt:
</div>
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
environment.systemPackages = with pkgs; [
environment.systemPackages = with pkgs; [
Line 175: Line 171:
];
];
</syntaxhighlight>
</syntaxhighlight>
<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Overriding_the_Steam_package"></span>
=== Overriding the Steam package ===
=== 覆盖 Steam 软件包 ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
In some cases, you may need to override the default Steam package to provide missing dependencies or modify its build. Use the <code>programs.steam.package</code> option for this. Steam on NixOS runs many games in an FHS environment, but the Steam client itself or certain tools might need extra libraries.
In some cases, you may need to override the default Steam package to provide missing dependencies or modify its build. Use the <code>programs.steam.package</code> option for this. Steam on NixOS runs many games in an FHS environment, but the Steam client itself or certain tools might need extra libraries.
Line 214: Line 209:
</syntaxhighlight>
</syntaxhighlight>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Troubleshooting"></span>
== Troubleshooting ==
== 故障排除 ==
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Line 222: Line 216:
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Steam_fails_to_start._What_do_I_do?"></span>
=== Steam fails to start. What do I do? ===
=== Steam 无法启动。我该怎么办? ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Run <code>strace steam -dev -console 2> steam.logs</code> in the terminal. If <code>strace</code> is not installed, temporarily install it using <code>nix-shell -p strace</code> or <code>nix run nixpkgs#strace -- steam -dev -console 2> steam.logs</code> (if using Flakes). After that, create a bug report. <!-- This is vague. Where should the user create a bug report?  -->
Run <code>strace steam -dev -console 2> steam.logs</code> in the terminal. If <code>strace</code> is not installed, temporarily install it using <code>nix-shell -p strace</code> or <code>nix run nixpkgs#strace -- steam -dev -console 2> steam.logs</code> (if using Flakes). After that, create a bug report. <!-- This is vague. Where should the user create a bug report?  -->
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Steam_is_not_updated"></span>
=== Steam is not updated ===
=== Steam 未更新 ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
When you restart [[Steam]] after an update, it starts the old version. ([https://github.com/NixOS/nixpkgs/issues/181904 #181904])
When you restart [[Steam]] after an update, it starts the old version. ([https://github.com/NixOS/nixpkgs/issues/181904 #181904])
Line 237: Line 229:
</div>
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Game_fails_to_start"></span>
=== Game fails to start ===
=== 游戏无法启动 ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Games may fail to start because they lack dependencies (this should be added to the script, for now), or because they cannot be patched. The steps to launch a game directly are:
Games may fail to start because they lack dependencies (this should be added to the script, for now), or because they cannot be patched. The steps to launch a game directly are:
Line 276: Line 267:
To "reset" your driver to radv when both radv and amdvlk are installed, set either <code>AMD_VULKAN_ICD = "RADV"</code> or <code>VK_ICD_FILENAMES = "/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json"</code> environment variable. For example, if you start [[Steam]] from the shell, you can enable radv for the current session by running <code>AMD_VULKAN_ICD="RADV" steam</code>. If you are unsure which driver you currently use, you can launch a game with [https://github.com/flightlessmango/MangoHud MangoHud] enabled, which has the capability to show what driver is currently in use.
To "reset" your driver to radv when both radv and amdvlk are installed, set either <code>AMD_VULKAN_ICD = "RADV"</code> or <code>VK_ICD_FILENAMES = "/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json"</code> environment variable. For example, if you start [[Steam]] from the shell, you can enable radv for the current session by running <code>AMD_VULKAN_ICD="RADV" steam</code>. If you are unsure which driver you currently use, you can launch a game with [https://github.com/flightlessmango/MangoHud MangoHud] enabled, which has the capability to show what driver is currently in use.
</div>
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
=== SteamVR ===
=== SteamVR ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
The setcap issue at SteamVR start can be fixed with:
The setcap issue at SteamVR start can be fixed with:
<code>sudo setcap CAP_SYS_NICE+ep ~/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/vrcompositor-launcher</code>
<code>sudo setcap CAP_SYS_NICE+ep ~/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/vrcompositor-launcher</code>
</div>
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Gamescope_fails_to_launch_when_used_within_Steam"></span>
=== Gamescope fails to launch when used within Steam ===
=== 与 Steam 使用时 Gamescope 无法启动 ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
Gamescope may fail to start due to missing Xorg libraries. ([https://github.com/NixOS/nixpkgs/issues/214275 #214275]) To resolve this override the steam package to add them:
Gamescope may fail to start due to missing Xorg libraries. ([https://github.com/NixOS/nixpkgs/issues/214275 #214275]) To resolve this override the steam package to add them:
Line 306: Line 294:
};
};
</syntaxhighlight>
</syntaxhighlight>
<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Udev_rules_for_additional_Gamepads"></span>
=== Udev rules for additional Gamepads ===
=== 额外游戏手柄的 udev 规则 ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
In specific scenarios gamepads, might require some additional configuration in order to function properly in the form of udev rules. This can be achieved with <code>services.udev.extraRules</code>.
In specific scenarios gamepads, might require some additional configuration in order to function properly in the form of udev rules. This can be achieved with <code>services.udev.extraRules</code>.
Line 323: Line 310:
To find the vendor and product ID of a device [https://search.nixos.org/packages?channel=unstable&show=usbutils&from=0&size=50&sort=relevance&type=packages&query=usbutils usbutils] might be useful
To find the vendor and product ID of a device [https://search.nixos.org/packages?channel=unstable&show=usbutils&from=0&size=50&sort=relevance&type=packages&query=usbutils usbutils] might be useful
</div>
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="Known_issues"></span>
=== Known issues ===
=== 已知问题 ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<div lang="en" dir="ltr" class="mw-content-ltr">
"Project Zomboid" may report "couldn't determine 32/64 bit of java". This is not related to java at all, it carries its own outdated java binary that refuses to start if path contains non-Latin characters. Check for errors by directly starting local java binary within <code>steam-run bash</code>.
"Project Zomboid" may report "couldn't determine 32/64 bit of java". This is not related to java at all, it carries its own outdated java binary that refuses to start if path contains non-Latin characters. Check for errors by directly starting local java binary within <code>steam-run bash</code>.
Line 333: Line 319:
Resetting your password through the [[Steam]] app may fail at the CAPTCHA step repeatedly, with [[Steam]] itself reporting that the CAPTCHA was not correct, even though the CAPTCHA UI shows success. Resetting password through the [[Steam]] website should work around that.
Resetting your password through the [[Steam]] app may fail at the CAPTCHA step repeatedly, with [[Steam]] itself reporting that the CAPTCHA was not correct, even though the CAPTCHA UI shows success. Resetting password through the [[Steam]] website should work around that.
</div>
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
<span id="References"></span>
== References ==
== 参考 ==
</div>


[[Category:Applications]]
[[Category:Applications]]
[[Category:Gaming]]
[[Category:Gaming]]

Latest revision as of 19:02, 28 August 2025

Steam is a digital distribution platform for video games, offering a vast library for purchase, download, and management. On NixOS, Steam is generally easy to install and use, often working "out-of-the-box". It supports running many Windows games on Linux through its compatibility layer, Proton.[1]

安装

Shell

To temporarily use Steam-related tools like steam-run (for FHS environments) or steamcmd (for server management or tools like steam-tui setup) in a shell environment, you can run:

nix-shell -p steam-run # For FHS environment
nix-shell -p steamcmd  # For steamcmd

This provides the tools in your current shell without adding them to your system configuration. For steamcmd to work correctly for some tasks (like initializing for steam-tui), you might need to run it once to generate necessary files, as shown in the `steam-tui` section.

系统设置

To install the Steam package and enable all the system options necessary to allow it to run, add the following to your /etc/nixos/configuration.nix:

# Example for /etc/nixos/configuration.nix
programs.steam = {
  enable = true;
  remotePlay.openFirewall = true; # Open ports in the firewall for Steam Remote Play
  dedicatedServer.openFirewall = true; # Open ports in the firewall for Source Dedicated Server
};

# Optional: If you encounter amdgpu issues with newer kernels (e.g., 6.10+ reported issues),
# you might consider using the LTS kernel or a known stable version.
# boot.kernelPackages = pkgs.linuxPackages_lts; # Example for LTS
Note: Enabling steam installs several unfree packages. If you are using allowUnfreePredicate you will need to ensure that your configurations permit all of them.
{
  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
    "steam"
    "steam-unwrapped"
  ];
}

配置

Basic Steam features can be enabled directly within the programs.steam attribute set:

programs.steam = {
  enable = true; # Master switch, already covered in installation
  remotePlay.openFirewall = true;  # For Steam Remote Play
  dedicatedServer.openFirewall = true; # For Source Dedicated Server hosting
  # Other general flags if available can be set here.
  # Tip: For improved gaming performance, you can also enable GameMode:
  # programs.gamemode.enable = true;
};

If you are using a Steam Controller or a Valve Index, ensure Steam hardware support is enabled. This is typically handled by programs.steam.enable = true; which sets hardware.steam-hardware.enable = true; implicitly. You can verify or explicitly set it if needed:

hardware.steam-hardware.enable = true;

提示和技巧

Gamescope Compositor / "启动至 Steam Deck"

Gamescope can function as a minimal desktop environment, meaning you can launch it from a TTY and have an experience very similar to the Steam Deck hardware console.

# Clean Quiet Boot
boot.kernelParams = [ "quiet" "splash" "console=/dev/null" ];
plymouth.enable = true;

programs.gamescope = {
  enable = true;
  capSysNice = true;
};
programs.steam.gamescopeSession.enable = true; # Integrates with programs.steam

# Gamescope Auto Boot from TTY (example)
services.xserver.enable = false; # Assuming no other Xserver needed
services.getty.autologinUser = "USERNAME_HERE";

services.greetd = {
  enable = true;
  settings = {
    default_session = {
      command = "${pkgs.gamescope}/bin/gamescope -W 1920 -H 1080 -f -e --xwayland-count 2 --hdr-enabled --hdr-itm-enabled -- steam -pipewire-dmabuf -gamepadui -steamos > /dev/null 2>&1";
      user = "USERNAME_HERE";
    };
  };
};

steam-tui

If you want the steam-tui client, you'll have to install it. It relies on steamcmd being set up, so you'll need to run steamcmd once to generate the necessary configuration files. First, ensure steamcmd is available (e.g., via nix-shell -p steamcmd or by adding it to environment.systemPackages), then run:

steamcmd +quit # This initializes steamcmd's directory structure

Then install and run `steam-tui`. You may need to log in within `steamcmd` first if `steam-tui` has issues:

# (Inside steamcmd prompt, if needed for full login before steam-tui)
# login <username> <password> <steam_2fa_code>
# quit

After setup, steam-tui (if installed e.g. via home.packages or environment.systemPackages) should start fine.

仅 FHS 环境

To run proprietary games or software downloaded from the internet that expect a typical Linux Filesystem Hierarchy Standard (FHS), you can use steam-run. This provides an FHS-like environment without needing to patch the software. Note that this is not necessary for clients installed from Nixpkgs (like Minigalaxy or Itch), which already use the FHS environment as needed. There are two options to make steam-run available: 1. Install steam-run system-wide or user-specifically:

# In /etc/nixos/configuration.nix
environment.systemPackages = with pkgs; [
  steam-run
];

2. If you need more flexibility or want to use an overridden Steam package's FHS environment:

# In /etc/nixos/configuration.nix
environment.systemPackages = with pkgs; [
  (steam.override { /* Your overrides here */ }).run
];

Proton

You should be able to play most Windows games using Proton. If a game has a native Linux version that causes issues on NixOS, you can force the use of Proton by selecting a specific Proton version in the game's compatibility settings in Steam.

By default, Steam also looks for custom Proton versions in ~/.steam/root/compatibilitytools.d. The environment variable STEAM_EXTRA_COMPAT_TOOLS_PATHS can be set to add other search paths.

自定义 Proton 版本的声明式安装(例如 GE-Proton):

programs.steam.extraCompatPackages = with pkgs; [
  proton-ge-bin
];

可使用 ProtonUp-Qt 手动管理多个 Proton 版本:

environment.systemPackages = with pkgs; [
  protonup-qt
];

覆盖 Steam 软件包

In some cases, you may need to override the default Steam package to provide missing dependencies or modify its build. Use the programs.steam.package option for this. Steam on NixOS runs many games in an FHS environment, but the Steam client itself or certain tools might need extra libraries.

Example: Adding Bumblebee and Primus (for NVIDIA Optimus):

programs.steam.package = pkgs.steam.override {
  extraPkgs = pkgs': with pkgs'; [ bumblebee primus ];
};

# For 32-bit applications with Steam, if using steamFull:
# programs.steam.package = pkgs.steamFull.override { extraPkgs = pkgs': with pkgs'; [ bumblebee primus ]; };

Example: Adding Xorg libraries for Gamescope (when used within Steam):

programs.steam.package = pkgs.steam.override {
  extraPkgs = pkgs': with pkgs'; [
    xorg.libXcursor
    xorg.libXi
    xorg.libXinerama
    xorg.libXScrnSaver
    libpng
    libpulseaudio
    libvorbis
    stdenv.cc.cc.lib # Provides libstdc++.so.6
    libkrb5
    keyutils
    # Add other libraries as needed
  ];
};

故障排除

For all issues: first run steam -dev -console through the terminal and read the output.

Steam 无法启动。我该怎么办?

Run strace steam -dev -console 2> steam.logs in the terminal. If strace is not installed, temporarily install it using nix-shell -p strace or nix run nixpkgs#strace -- steam -dev -console 2> steam.logs (if using Flakes). After that, create a bug report.

Steam 未更新

When you restart Steam after an update, it starts the old version. (#181904) A workaround is to remove the user files in /home/<USER>/.local/share/Steam/userdata. This can be done with rm -rf /home/<USER>/.local/share/Steam/userdata in the terminal or with your file manager. After that, Steam can be set up again by restarting.

游戏无法启动

Games may fail to start because they lack dependencies (this should be added to the script, for now), or because they cannot be patched. The steps to launch a game directly are:

  • Patch the script/binary if you can
  • Add a file named steam_appid.txt in the binary folder, with the appid as contents (it can be found in the stdout from steam)
  • Using the LD_LIBRARY_PATH from the nix/store steam script, with some additions, launch the game binary
LD_LIBRARY_PATH=~/.steam/bin32:$LD_LIBRARY_PATH:/nix/store/pfsa... blabla ...curl-7.29.0/lib:. ./Osmos.bin32 (if you could not patchelf the game, call ld.so directly with the binary as parameter)

Note: If a game gets stuck on Installing scripts, check for a DXSETUP.EXE process and run it manually, then restart the game launch.

Changing the driver on AMD GPUs

Note: This is not recommended because radv drivers tend to perform better and are generally more stable than amdvlk.

Sometimes, changing the driver on AMD GPUs helps. To try this, first, install multiple drivers such as radv and amdvlk:

hardware.graphics = {
  ## radv: an open-source Vulkan driver from freedesktop
  enable32Bit = true;

  ## amdvlk: an open-source Vulkan driver from AMD
  extraPackages = [ pkgs.amdvlk ];
  extraPackages32 = [ pkgs.driversi686Linux.amdvlk ];
};

In the presence of both drivers, Steam will default to amdvlk. The amdvlk driver can be considered more correct regarding Vulkan specification implementation, but less performant than radv. However, this tradeoff between correctness and performance can sometimes make or break the gaming experience.

To "reset" your driver to radv when both radv and amdvlk are installed, set either AMD_VULKAN_ICD = "RADV" or VK_ICD_FILENAMES = "/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json" environment variable. For example, if you start Steam from the shell, you can enable radv for the current session by running AMD_VULKAN_ICD="RADV" steam. If you are unsure which driver you currently use, you can launch a game with MangoHud enabled, which has the capability to show what driver is currently in use.

SteamVR

The setcap issue at SteamVR start can be fixed with: sudo setcap CAP_SYS_NICE+ep ~/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/vrcompositor-launcher

与 Steam 使用时 Gamescope 无法启动

Gamescope may fail to start due to missing Xorg libraries. (#214275) To resolve this override the steam package to add them:

programs.steam.package = pkgs.steam.override {
  extraPkgs = pkgs': with pkgs'; [
    xorg.libXcursor
    xorg.libXi
    xorg.libXinerama
    xorg.libXScrnSaver
    libpng
    libpulseaudio
    libvorbis
    stdenv.cc.cc.lib # Provides libstdc++.so.6
    libkrb5
    keyutils
    # Add other libraries as needed
  ];
};

额外游戏手柄的 udev 规则

In specific scenarios gamepads, might require some additional configuration in order to function properly in the form of udev rules. This can be achieved with services.udev.extraRules.

The following example is for the 8bitdo Ultimate Bluetooth controller, different controllers will require knowledge of the vendor and product ID for the device:

  services.udev.extraRules = ''
    SUBSYSTEM=="input", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3106", MODE="0660", GROUP="input"
  '';

To find the vendor and product ID of a device usbutils might be useful

已知问题

"Project Zomboid" may report "couldn't determine 32/64 bit of java". This is not related to java at all, it carries its own outdated java binary that refuses to start if path contains non-Latin characters. Check for errors by directly starting local java binary within steam-run bash.

Resetting your password through the Steam app may fail at the CAPTCHA step repeatedly, with Steam itself reporting that the CAPTCHA was not correct, even though the CAPTCHA UI shows success. Resetting password through the Steam website should work around that.

参考