Jump to content

VR/zh: Difference between revisions

From Official NixOS Wiki
Ardenet (talk | contribs)
Created page with "[https://gitlab.com/znixian/OpenOVR OpenComposite] 是一个兼容层,用于在 Monado 等 OpenXR 运行时上运行 OpenVR 应用程序。它与 DXVK 或 vkd3d 等工具类似,但用于将 OpenVR 调用转换为 OpenXR。"
FuzzyBot (talk | contribs)
Updating to match new version of source page
Line 55: Line 55:


有关可用环境变量和调整的更多信息,请参阅 [https://lvra.gitlab.io/docs/fossvr/monado/ Linux VR Adventures wiki] 和 [https://monado.freedesktop.org/getting-started.html#environment-variables Monado 文档关于环境变量的部分]
有关可用环境变量和调整的更多信息,请参阅 [https://lvra.gitlab.io/docs/fossvr/monado/ Linux VR Adventures wiki] 和 [https://monado.freedesktop.org/getting-started.html#environment-variables Monado 文档关于环境变量的部分]


== OpenComposite ==
== OpenComposite ==
Line 63: Line 62:
为了在 SteamVR 以外的任何平台上运行 OpenVR 游戏,您需要配置 <code>~/.config/openvr/openvrpaths.vrpath</code> 中定义的 OpenVR 运行时路径。一个可靠的方法是使用 [[Special:MyLanguage/Home Manager|Home Manager]] 创建此文件。
为了在 SteamVR 以外的任何平台上运行 OpenVR 游戏,您需要配置 <code>~/.config/openvr/openvrpaths.vrpath</code> 中定义的 OpenVR 运行时路径。一个可靠的方法是使用 [[Special:MyLanguage/Home Manager|Home Manager]] 创建此文件。


{{Warning|旧版本的 Proton 将始终查询当前的 OpenVR 和 OpenXR 运行时。如果您使用 OpenComposite,并且它无法初始化 OpenXR 环境,Proton 将无法启动。解决方法是删除 ~/.config/openvr/openvrpaths.vrpath 文件,然后重试启动游戏。}}
{{Warning|<span class="mw-translate-fuzzy">{{Warning|旧版本的 Proton 将始终查询当前的 OpenVR 和 OpenXR 运行时。如果您使用 OpenComposite,并且它无法初始化 OpenXR 环境,Proton 将无法启动。解决方法是删除 ~/.config/openvr/openvrpaths.vrpath 文件,然后重试启动游戏。}}</span>}}


如果此文件未设置为只读,SteamVR 将添加其运行时路径,因此可以使用 Home Manager。
如果此文件未设置为只读,SteamVR 将添加其运行时路径,因此可以使用 Home Manager。
Line 102: Line 101:
WiVRn 模块的示例用法:
WiVRn 模块的示例用法:


{{Warning|从 WiVRn 0.23 版本开始,WiVRn 会自行管理 opencomposite 路径。仅在使用低于 v0.23 的版本时使用上述 opencomposite 配置。}}
{{Warning|<span class="mw-translate-fuzzy">{{Warning|从 WiVRn 0.23 版本开始,WiVRn 会自行管理 opencomposite 路径。仅在使用低于 v0.23 的版本时使用上述 opencomposite 配置。}}</span>}}


{{File|/etc/nixos/configuration.nix|nix|3=services.wivrn = {
{{File|/etc/nixos/configuration.nix|nix|3=services.wivrn = {
Line 158: Line 157:
在初始设置时,SteamVR 会请求提升权限,以便为其某个二进制文件设置文件能力(file capability)。这是使异步再投影技术正常工作所必需的。客户端需要拥有 <code>CAP_SYS_NICE</code> 授权来获取高优先级环境,这是异步再投影技术的必要条件。
在初始设置时,SteamVR 会请求提升权限,以便为其某个二进制文件设置文件能力(file capability)。这是使异步再投影技术正常工作所必需的。客户端需要拥有 <code>CAP_SYS_NICE</code> 授权来获取高优先级环境,这是异步再投影技术的必要条件。


{{Note|Steam 在基于 bubblewrap 的 FHS 环境中运行。此环境在用户命名空间中运行 Steam,这阻止它使用任何能力(capabilities)或为二进制文件 setuid。这意味着除非修补内核以完全消除这些限制,否则异步再投影技术无法在 NixOS 上使用。请参阅此 [https://github.com/NixOS/nixpkgs/issues/217119 Nixpkgs 问题]}}
{{Note|<span class="mw-translate-fuzzy">{{Note|Steam 在基于 bubblewrap 的 FHS 环境中运行。此环境在用户命名空间中运行 Steam,这阻止它使用任何能力(capabilities)或为二进制文件 setuid。这意味着除非修补内核以完全消除这些限制,否则异步再投影技术无法在 NixOS 上使用。请参阅此 [https://github.com/NixOS/nixpkgs/issues/217119 Nixpkgs 问题]}}</span>}}


<span id="Patching_AMDGPU_to_allow_high_priority_queues"></span>
<span id="Patching_AMDGPU_to_allow_high_priority_queues"></span>
Line 165: Line 164:
通过应用 [https://github.com/Frogging-Family/community-patches/blob/a6a468420c0df18d51342ac6864ecd3f99f7011e/linux61-tkg/cap_sys_nice_begone.mypatch 此补丁],AMDGPU 内核驱动程序将忽略进程权限并允许任何应用程序创建高优先级环境(high priority contexts)。
通过应用 [https://github.com/Frogging-Family/community-patches/blob/a6a468420c0df18d51342ac6864ecd3f99f7011e/linux61-tkg/cap_sys_nice_begone.mypatch 此补丁],AMDGPU 内核驱动程序将忽略进程权限并允许任何应用程序创建高优先级环境(high priority contexts)。


{{Warning|这将移除内核中特意设置的限制,并可能导致调度问题。虽然目前尚未收到导致问题的报告,但这应被视为不受支持的配置。}}
{{Warning|<span class="mw-translate-fuzzy">{{Warning|这将移除内核中特意设置的限制,并可能导致调度问题。虽然目前尚未收到导致问题的报告,但这应被视为不受支持的配置。}}</span>}}


<span id="Applying_as_a_NixOS_kernel_patch"></span>
<span id="Applying_as_a_NixOS_kernel_patch"></span>
Line 185: Line 184:


也可以只修补 amdgpu 并将其构建为树外模块(out-of-tree module),如 [[Special:MyLanguage/Linux_kernel#Patching_a_single_In-tree_kernel_module|Pacthing a single In-tree Kernel Module]] 中所述
也可以只修补 amdgpu 并将其构建为树外模块(out-of-tree module),如 [[Special:MyLanguage/Linux_kernel#Patching_a_single_In-tree_kernel_module|Pacthing a single In-tree Kernel Module]] 中所述
<div lang="en" dir="ltr" class="mw-content-ltr">
=== Patching bubblewrap to allow capabilities ===
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
By modifying the bubblewrap binary used for running Steam, you can allow processes in that FHS environment to acquire capabilities. This removes the need for patching the kernel directly.
</div>
{{Warning|<span lang="en" dir="ltr" class="mw-content-ltr">This circumvents an intended security mechanism in bubblewrap, and allows all other software launched by steam, or running via steam-run to acquire these capabilities as well.</span>}}
{{file|/etc/nixos/configuration.nix|nix|3=programs.steam = let
  patchedBwrap = pkgs.bubblewrap.overrideAttrs (o: {
    patches = (o.patches or []) ++ [
      ./bwrap.patch
    ];
  });
in {
  enable = true;
  package = pkgs.steam.override {
    buildFHSEnv = (args: ((pkgs.buildFHSEnv.override {
      bubblewrap = patchedBwrap;
    }) (args // {
      extraBwrapArgs = (args.extraBwrapArgs or []) ++ [ "--cap-add ALL" ];
    })));
  };
};
}}
{{file|/etc/nixos/bwrap.patch|diff|3=diff --git a/bubblewrap.c b/bubblewrap.c
index 8322ea0..4e20262 100644
--- a/bubblewrap.c
+++ b/bubblewrap.c
@@ -868,13 +868,6 @@ acquire_privs (void)
      /* Keep only the required capabilities for setup */
      set_required_caps ();
    }
-  else if (real_uid != 0 && has_caps ())
-    {
-      /* We have some capabilities in the non-setuid case, which should not happen.
-        Probably caused by the binary being setcap instead of setuid which we
-        don't support anymore */
-      die ("Unexpected capabilities but not setuid, old file caps config?");
-    }
  else if (real_uid == 0)
    {
      /* If our uid is 0, default to inheriting all caps; the caller
}}
<div lang="en" dir="ltr" class="mw-content-ltr">
as an additional change, you may also need to replace Steam's own bwrap binary with a symbolic link to this modified bwrap binary, found at <code>~/.local/share/Steam/ubuntu12_32/steam-runtime/usr/libexec/steam-runtime-tools-0/srt-bwrap</code>.
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
Steam will periodically replace this modification with its own binary when steam-runtime updates, so you may need to re-apply this change if it breaks.
</div>


== wlx-overlay-s ==
== wlx-overlay-s ==
Line 193: Line 247:
==== SteamVR 自动启动 ====
==== SteamVR 自动启动 ====


<div class="mw-translate-fuzzy">
在 SteamVR(或任何 OpenVR 合成器)中启动 wlx-overlay-s 时,它会注册一个自动启动清单。目前,此清单将引用 wlx-overlay-s 的 Nix 存储路径,该路径可能会在重建 NixOS/Nix 配置文件后被垃圾回收。一种解决方法是定期运行以下命令来更新清单的存储路径:{{Commands|
在 SteamVR(或任何 OpenVR 合成器)中启动 wlx-overlay-s 时,它会注册一个自动启动清单。目前,此清单将引用 wlx-overlay-s 的 Nix 存储路径,该路径可能会在重建 NixOS/Nix 配置文件后被垃圾回收。一种解决方法是定期运行以下命令来更新清单的存储路径:{{Commands|
# 运行 wlx-overlay-s 并替换任何正在运行的实例
# 运行 wlx-overlay-s 并替换任何正在运行的实例
$ wlx-overlay-s --replace}}
</div>
{{Commands|
# <span lang="en" dir="ltr" class="mw-content-ltr">Run wlx-overlay-s and replace any running instance</span>
$ wlx-overlay-s --replace}}
$ wlx-overlay-s --replace}}


Line 200: Line 260:
== 另见 ==
== 另见 ==


<div class="mw-translate-fuzzy">
* [https://lvra.gitlab.io Linux VR Adventures Wiki]
* [https://lvra.gitlab.io Linux VR Adventures Wiki]
[[Category:Video/zh|分类:视频]]
[[Category:Video/zh|分类:视频]]
Line 205: Line 266:
[[Category:Desktop/zh|分类:桌面]]
[[Category:Desktop/zh|分类:桌面]]
[[Category:Gaming/zh|分类:游戏]]
[[Category:Gaming/zh|分类:游戏]]
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
[[Category:Video]]
[[Category:Hardware]]
[[Category:Desktop]]
[[Category:Gaming]]
</div>

Revision as of 14:35, 10 October 2025

Monado

Monado 是一個開源的 OpenXR 運行時。它使用內置驅動程序支持各種硬件,使其可以運行任何 OpenXR 程序,並且在 OpenComposite 的幫助下,還可以運行大多數 OpenVR 應用程式。

可以使用其 NixOS 選項 services.monado.enable 配置 Monado:

❄︎ /etc/nixos/configuration.nix
services.monado = {
  enable = true;
  defaultRuntime = true; # Register as default OpenXR runtime
};

為了配置 Monado,您可能需要添加其他環境變量:

❄︎ /etc/nixos/configuration.nix
systemd.user.services.monado.environment = {
  STEAMVR_LH_ENABLE = "1";
  XRT_COMPOSITOR_COMPUTE = "1";
};

配置完成後,Monado 可以在 systemd 用戶會話中啟動和停止。

例如,以下命令將啟動 Monado,然後打印其日誌輸出:

$ systemctl --user start monado.service
$ journalctl --user --follow --unit monado.service

手部追蹤

您可能會注意到,由於缺少手部追蹤數據,運行 monado-services 會失敗。有兩種方法可以解決這個問題:完全禁用手部追蹤,或下載手部追蹤數據。

要禁用手部追蹤,請修改環境變量以包含 WMR_HANDTRACKING = "0";,使其如下所示。

❄︎ /etc/nixos/configuration.nix
systemd.user.services.monado.environment = {
  STEAMVR_LH_ENABLE = "1";
  XRT_COMPOSITOR_COMPUTE = "1";
  WMR_HANDTRACKING = "0";
};

要使手部追蹤功能正常工作,您需要啟用 git-lfs。啟用 git-lfs 的標準方法是通過以下配置

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

確保 git-lfs 功能啟用後,運行以下命令並重新啟動 monado-service

$ mkdir -p ~/.local/share/monado
$ cd ~/.local/share/monado
$ git clone https://gitlab.freedesktop.org/monado/utilities/hand-tracking-models

有關可用環境變量和調整的更多信息,請參閱 Linux VR Adventures wikiMonado 文檔關於環境變量的部分

OpenComposite

OpenComposite 是一個兼容層,用於在 Monado 等 OpenXR 運行時上運行 OpenVR 應用程式。它與 DXVK 或 vkd3d 等工具類似,但用於將 OpenVR 調用轉換為 OpenXR。

為了在 SteamVR 以外的任何平台上運行 OpenVR 遊戲,您需要配置 ~/.config/openvr/openvrpaths.vrpath 中定義的 OpenVR 運行時路徑。一個可靠的方法是使用 Home Manager 創建此文件。

⚠︎
Warning: {{{1}}}

如果此文件未設置為只讀,SteamVR 將添加其運行時路徑,因此可以使用 Home Manager。

啟用 OpenComposite 的示例配置可能如下所示:

❄︎ ~/.config/home-manager/home.nix
# For Monado:
xdg.configFile."openxr/1/active_runtime.json".source = "${pkgs.monado}/share/openxr/1/openxr_monado.json";

# For WiVRn v0.22 and below:
xdg.configFile."openxr/1/active_runtime.json".source = "${pkgs.wivrn}/share/openxr/1/openxr_wivrn.json";

xdg.configFile."openvr/openvrpaths.vrpath".text = ''
  {
    "config" :
    [
      "${config.xdg.dataHome}/Steam/config"
    ],
    "external_drivers" : null,
    "jsonid" : "vrpathreg",
    "log" :
    [
      "${config.xdg.dataHome}/Steam/logs"
    ],
    "runtime" :
    [
      "${pkgs.opencomposite}/lib/opencomposite"
    ],
    "version" : 1
  }
'';

如果您計劃在 Steam 上玩任何 OpenVR 遊戲或通過 Proton 遊玩 OpenXR 遊戲,則必須以這種方式使用 OpenComposite。在大多數情況下,您還必須允許 Steam 運行時訪問您的 OpenXR 運行時的 Socket 路徑,方法是使用以下 Steam 上 XR 應用程式的啟動選項:env PRESSURE_VESSEL_FILESYSTEMS_RW=$XDG_RUNTIME_DIR/monado_comp_ipc %command%。此示例適用於 Monado,其他 XR 運行時可能有所不同。

WiVRn

WiVRn 是一款基於 Monado 構建的 OpenXR 流媒體應用程式。它能夠將獨立的 VR 頭戴設備無線連接到 Linux 計算機。如果您的頭戴設備不是無線的,請查閱 Monado。 WiVRn 模塊的示例用法:

⚠︎
Warning: {{{1}}}
❄︎ /etc/nixos/configuration.nix
services.wivrn = {
  enable = true;
  openFirewall = true;

  # Write information to /etc/xdg/openxr/1/active_runtime.json, VR applications
  # will automatically read this and work with WiVRn (Note: This does not currently
  # apply for games run in Valve's Proton)
    defaultRuntime = true;

  # Run WiVRn as a systemd service on startup
  autoStart = true;

  # Config for WiVRn (https://github.com/WiVRn/WiVRn/blob/master/docs/configuration.md)
  config = {
    enable = true;
    json = {
      # 1.0x foveation scaling
      scale = 1.0;
      # 100 Mb/s
      bitrate = 100000000;
      encoders = [
        {
          encoder = "vaapi";
          codec = "h265";
          # 1.0 x 1.0 scaling
          width = 1.0;
          height = 1.0;
          offset_x = 0.0;
          offset_y = 0.0;
        }
      ];
    };
  };
};

與 Monado 一樣,您還須添加 WiVRn 的啟動參數以允許訪問 Socket:PRESSURE_VESSEL_FILESYSTEMS_RW=$XDG_RUNTIME_DIR/wivrn/comp_ipc %command%

Envision

Envision 是用於 FOSS VR 程序棧的編排器(Orchestrator)。它負責構建和配置 Monado、WiVRn、OpenComposite 以及 FOSS VR 程序棧的其他實用程序,例如 Lighthouse 驅動程序、OpenHMD、Survive 和 WMR。您可以使用 Envision 模塊啟用它:

❄︎ /etc/nixos/configuration.nix
programs.envision = {
  enable = true;
  openFirewall = true; # This is set true by default
};

SteamVR

SteamVR 是一個專有的 OpenVR 運行時,兼容 OpenXR。它是 Steam 的一部分,除了啟用 Steam 之外,在 NixOS 上無需進行任何其他設置。

通過 Steam 安裝 SteamVR 並插入兼容 SteamVR 的耳機後,SteamVR 應該就可以正常工作。

在初始設置時,SteamVR 會請求提升權限,以便為其某個二進制文件設置文件能力(file capability)。這是使異步再投影技術正常工作所必需的。客戶端需要擁有 CAP_SYS_NICE 授權來獲取高優先級環境,這是異步再投影技術的必要條件。

Note: {{{1}}}

修補 AMDGPU 以允許高優先級隊列

通過應用 此補丁,AMDGPU 內核驅動程序將忽略進程權限並允許任何應用程式創建高優先級環境(high priority contexts)。

⚠︎
Warning: {{{1}}}

作為 NixOS 內核補丁進行應用

為了解決 CAP_SYS_NICE 要求,我們可以使用以下 NixOS 配置片段應用內核補丁:

❄︎ /etc/nixos/configuration.nix
boot.kernelPatches = [
  {
    name = "amdgpu-ignore-ctx-privileges";
    patch = pkgs.fetchpatch {
      name = "cap_sys_nice_begone.patch";
      url = "https://github.com/Frogging-Family/community-patches/raw/master/linux61-tkg/cap_sys_nice_begone.mypatch";
      hash = "sha256-Y3a0+x2xvHsfLax/uwycdJf3xLxvVfkfDVqjkxNaYEo=";
    };
  }
];

也可以只修補 amdgpu 並將其構建為樹外模塊(out-of-tree module),如 Pacthing a single In-tree Kernel Module 中所述

Patching bubblewrap to allow capabilities

By modifying the bubblewrap binary used for running Steam, you can allow processes in that FHS environment to acquire capabilities. This removes the need for patching the kernel directly.

⚠︎
Warning: {{{1}}}
❄︎ /etc/nixos/configuration.nix
programs.steam = let
  patchedBwrap = pkgs.bubblewrap.overrideAttrs (o: {
    patches = (o.patches or []) ++ [
      ./bwrap.patch
    ];
  });
in {
  enable = true;
  package = pkgs.steam.override {
    buildFHSEnv = (args: ((pkgs.buildFHSEnv.override {
      bubblewrap = patchedBwrap;
    }) (args // {
      extraBwrapArgs = (args.extraBwrapArgs or []) ++ [ "--cap-add ALL" ];
    })));
  };
};
≡︎ /etc/nixos/bwrap.patch
diff --git a/bubblewrap.c b/bubblewrap.c
index 8322ea0..4e20262 100644
--- a/bubblewrap.c
+++ b/bubblewrap.c
@@ -868,13 +868,6 @@ acquire_privs (void)
       /* Keep only the required capabilities for setup */
       set_required_caps ();
     }
-  else if (real_uid != 0 && has_caps ())
-    {
-      /* We have some capabilities in the non-setuid case, which should not happen.
-         Probably caused by the binary being setcap instead of setuid which we
-         don't support anymore */
-      die ("Unexpected capabilities but not setuid, old file caps config?");
-    }
   else if (real_uid == 0)
     {
       /* If our uid is 0, default to inheriting all caps; the caller

as an additional change, you may also need to replace Steam's own bwrap binary with a symbolic link to this modified bwrap binary, found at ~/.local/share/Steam/ubuntu12_32/steam-runtime/usr/libexec/steam-runtime-tools-0/srt-bwrap.

Steam will periodically replace this modification with its own binary when steam-runtime updates, so you may need to re-apply this change if it breaks.

wlx-overlay-s

wlx-overlay-s 是一個輕量級的 OpenXR/OpenVR 覆蓋層,適用於 Wayland 和 X11 桌面。它原生兼容 SteamVR 以及 Monado/WiVRn。

SteamVR 自動啟動

在 SteamVR(或任何 OpenVR 合成器)中啟動 wlx-overlay-s 時,它會註冊一個自動啟動清單。目前,此清單將引用 wlx-overlay-s 的 Nix 存儲路徑,該路徑可能會在重建 NixOS/Nix 配置文件後被垃圾回收。一種解決方法是定期運行以下命令來更新清單的存儲路徑:
# 运行 wlx-overlay-s 并替换任何正在运行的实例
$ wlx-overlay-s --replace
{{{1}}}

另見