Jump to content

Steam

From Official NixOS Wiki
This page is a translated version of the page Steam and the translation is 100% complete.

Steam 是一個數字遊戲發行平台,提供龐大的遊戲庫供用戶購買、下載和管理。在 NixOS 系統上,Steam 通常易於安裝和使用,很多時候都能「開箱即用」。它通過兼容層 Proton 支持在 Linux 上運行許多 Windows 遊戲。[1]

安裝

Shell

要在 shell 環境中臨時使用 Steam 相關工具,例如 steam-run(用於 FHS 環境)或 steamcmd(用於伺服器管理或 steam-tui 設置等工具),可以運行以下命令。

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

這樣就可以在當前 shell 中使用這些工具,而無需將其添加到系統配置中。為了使 steamcmd 能夠正確執行某些任務(例如初始化 steam-tui),您可能需要運行一次 steamcmd 來生成必要的文件,如 steam-tui 部分所示。

系統設置

要安裝 Steam 軟件包並啟用所有必要的系統選項以使其運行,請將以下內容添加到您的系統配置中:

❄︎ /etc/nixos/configuration.nix
programs.steam = {
  enable = true;
};

# 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

關於內核 6.10 問題的軼事

Note: 啟用 Steam 會安裝多個非自由軟件包。如果您使用了 allowUnfreePredicate,則需要確保您的配置允許安裝所有這些軟件包。
  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
    "steam"
    "steam-unwrapped"
  ];

配置

基本 Steam 功能可以直接在 programs.steam 屬性集中啟用:

❄︎ /etc/nixos/configuration.nix
programs.steam = {
  enable = true; # Master switch, already covered in installation
  remotePlay.openFirewall = true;  # Open ports in the firewall for Steam Remote Play
  dedicatedServer.openFirewall = true; # Open ports 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;
Note: 如果您使用的是 Steam 控制器或 Valve Index,Steam 硬件支持會通過設置 programs.steam.enable = true;hardware.steam-hardware.enable 選項同步設置為 true 來隱性啟用

提示和技巧

Gamescope Compositor / "啟動至 Steam Deck"

Gamescope 可以作為最小桌面環境運行,這意味着您可以從 TTY 啟動它,並獲得與 Steam Deck 硬件控制台非常相似的體驗。

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

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

# Gamescope Auto Boot from TTY (example)
services = {
  xserver.enable = false; # Assuming no other Xserver needed
  getty.autologinUser = <"USERNAME_HERE">;
  greetd = {
    enable = true;
    settings = {
      default_session = {
        command = "${lib.getExe pkgs.gamescope} -W 1920 -H 1080 -f -e --xwayland-count 2 --hdr-enabled --hdr-itm-enabled -- steam -pipewire-dmabuf -gamepadui -steamdeck -steamos3 > /dev/null 2>&1";
        user = <"USERNAME HERE">;
      };
    };
  };
};

Gamescope HDR

要使 HDR 在 gamescope 中工作,您需要在啟用 gamescope 程序的同時,單獨安裝 gamescope-wsi 軟件包。

programs.gamescope = {
  enable = true;
  capSysNice = false;
};
environment.systemPackages = with pkgs; [
  gamescope-wsi # HDR won't work without this
];

此外,在 Steam 中配置遊戲啟動選項時,可能需要使用參數 --hdr-debug-force-output 以在 gamescope 中強制啟用 HDR(參考以下示例)。

gamescope -W 3840 -H 2160 -r 120 -f --adaptive-sync --hdr-enabled --hdr-debug-force-output --mangoapp -- %command%

steam-tui

如果您想使用 steam-tui 客戶端,則需要自行安裝。它依賴於 steamcmd 的設置,因此您需要運行一次 steamcmd 來生成必要的配置文件。 首先,確保 steamcmd 可用(例如,運行 nix-shell -p steamcmd 或將其添加到 environment.systemPackages ),然後運行:

steamcmd +quit # This initializes steamcmd's directory structure

然後安裝並運行 steam-tui。如果 steamcmd 出現問題,您可能需要先在 steam-tui 中登錄:

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

安裝完成後, steam-tui (例如通過 home.packagesenvironment.systemPackages 安裝)應該可以正常啟動。

僅 FHS 環境

要運行需要標準 Linux 文件系統層次結構標準 (FHS) 的專有遊戲或從互聯網下載的軟件,可以使用 steam-run 。它提供了一個類似 FHS 的環境,而無需對軟件進行任何修改。 請注意,對於從 Nixpkgs 安裝的客戶端(如 Minigalaxy 或 Itch),這並非必要,因為它們已經根據需要使用 FHS 環境。 有兩種方法可以實現 steam-run 功能: 1. 安裝 steam-run ,可選擇系統級安裝或用戶級安裝:

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

2. 如果您需要更大的靈活性,或者想要使用已覆蓋的 Steam 包的 FHS 環境:

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

Proton

您應該可以使用 Proton 運行大多數 Windows 遊戲。如果某個遊戲有原生 Linux 版本,但在 NixOS 上會出現問題,您可以通過在 Steam 的遊戲兼容性設置中選擇特定的 Proton 版本來強制使用 Proton。

默認情況下,Steam 還會在 ~/.steam/root/compatibilitytools.d 中查找自定義 Proton 版本。可以通過設置環境變量 STEAM_EXTRA_COMPAT_TOOLS_PATHS 來添加其他搜索路徑。

自定義 Proton 版本的聲明式安裝(例如 GE-Proton):

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

可使用 ProtonUp-Qt 手動管理多個 Proton 版本:

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

覆蓋 Steam 軟件包

在某些情況下,您可能需要覆蓋默認的 Steam 程序包以提供缺失的依賴項或修改其構建。為此,請使用 programs.steam.package 選項。NixOS 上的 Steam 會在 FHS 環境下運行許多遊戲,但 Steam 客戶端本身或某些工具可能需要額外的庫。

示例:添加 Bumblebee 和 Primus(適用於 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 ]; };

示例:為 Gamescope 添加 Xorg 庫(在 Steam 中使用時):

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

修復 GNOME Dock 欄和活動概覽中遊戲圖標缺失的問題

GNOME 使用窗口類來確定與窗口關聯的圖標。Steam 目前在其 .desktop 文件中沒有設置所需的鍵值[2],但您可以通過編輯每個遊戲的 .desktop 文件中的 StartupWMClass 鍵值來手動修復此問題,該文件位於 ~/.local/share/applications/ 目錄下。

對於通過 Proton 運行的遊戲,該值應為 steam_app_<game_id> (在哪裏<game_id>Exec 行中 steam://rungameid/ 之後的值匹配)。

對於原生運行的遊戲,該值應與遊戲的主可執行文件匹配。

例如,Valheim 的修改後的 .desktop 文件如下所示:

[Desktop Entry]
Name=Valheim
Comment=Play this game on Steam
Exec=steam steam://rungameid/892970
Icon=steam_icon_892970
Terminal=false
Type=Application
Categories=Game;
StartupWMClass=valheim.x86_64

故障排除

對於所有問題:首先通過終端運行 steam -dev -console 並讀取輸出。

Steam 無法啟動。我該怎麼辦?

至少在 x86-64 平台上,導致 Steam 無法啟動的一個常見問題是未在 /etc/nixos/hardware-configuration.nix 文件中啟用以下選項:

 {
   hardware.graphics.enable = true;
   hardware.graphics.enable32Bit = true;
 }

如果您已設置這些選項(或者 32 位不適用於您的系統/平台),但仍然無法運行 Steam,請在終端運行 strace steam -dev -console 2> steam.logs 命令。如果未安裝 strace ,請使用 nix-shell -p stracenix run nixpkgs#strace -- steam -dev -console 2> steam.logs (如果使用 Flakes 版本)臨時安裝。之後,請提交錯誤報告。

Steam 未更新

更新後重啟 Steam 時,它會啟動舊版本。(#181904) 一個解決方法是刪除 /home/<USER>/.local/share/Steam/userdata 目錄下的用戶文件。您可以在終端中使用 rm -rf /home/<USER>/.local/share/Steam/userdata 命令或文件管理器來完成此操作。之後,重啟 Steam 即可重新生成配置。

遊戲無法啟動

遊戲可能無法啟動,原因可能是缺少依賴項(目前應將此添加到腳本中),或者無法進行補丁更新。直接啟動遊戲的步驟如下: 如果可以,請修補腳本/二進制文件。

  • 在二進制文件夾中添加一個名為 steam_appid.txt 的文件,內容為 appid(可在 Steam 的標準輸出中找到)。
  • 使用來自 nix/store steam 腳本的 LD_LIBRARY_PATH,啟動遊戲二進制文件
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)

注意:如果遊戲卡在「正在安裝腳本」界面,請檢查是否存在 DXSETUP.EXE 進程並手動運行它,然後重新啟動遊戲。

更改 AMD GPU 的驅動程序

Note: 不建議這樣做,因為 radv 驅動程序往往性能更好,而且通常比 amdvlk 驅動程序更穩定。

有時,更換 AMD GPU 的驅動程序會有幫助。要嘗試此方法,首先,安裝多個驅動程序,例如 radv 和 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 ];
};

如果兩個驅動程序都存在,Steam 將默認使用 amdvlk。amdvlk 驅動程序在 Vulkan 規範實現方面更準確,但性能不如 radv。然而,這種在正確性和性能之間的權衡有時會直接影響遊戲體驗。

如果同時安裝了 radv 和 amdvlk,要將驅動程序「重置」為 radv,請設置環境變量 AMD_VULKAN_ICD = "RADV"VK_ICD_FILENAMES = "/run/opengl-driver/share/vulkan/icd.d/radeon_icd.x86_64.json" 。例如,如果您從 shell 啟動 Steam,則可以通過運行 AMD_VULKAN_ICD="RADV" steam 為當前會話啟用 radv。如果您不確定當前使用的是哪個驅動程序,可以啟動一個啟用了 MangoHud 的遊戲,MangoHud 可以顯示當前正在使用的驅動程序。

SteamVR

SteamVR 啟動時的 setcap 問題可以通過以下方法解決: sudo setcap CAP_SYS_NICE+ep ~/.local/share/Steam/steamapps/common/SteamVR/bin/linux64/vrcompositor-launcher

與 Steam 使用時 Gamescope 無法啟動

Gamescope 可能由於缺少 Xorg 庫而無法啟動。(#214275) 要解決此問題,請添加以下內容覆蓋 steam 包:

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

額外遊戲手柄的 udev 規則

在某些特定情況下,遊戲手柄可能需要一些額外的配置才能正常工作,這些配置以 udev 規則的形式表示。這可以通過 services.udev.extraRules 來配置。

以下示例適用於 8bitdo Ultimate 藍牙控制器,不同的控制器需要知道設備的供應商和產品 ID:

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

要查找設備的供應商和產品 ID,usbutils 可能有用。

已知問題

「Project Zomboid」可能會報告「無法確定Java是32位還是64位」。這與Java本身無關,是由其使用自身過時的Java二進制文件解析路徑時,其中包含非拉丁字符導致的。請通過在steam-run bash中直接啟動本地Java二進制文件來解決錯誤。

通過 Steam 應用重置密碼可能會反覆在驗證碼環節失敗,即使驗證碼界面顯示成功,Steam 本身也會提示驗證碼錯誤。通過 Steam 網站重置密碼應該可以解決這個問題。

參考