Запуск VR на NixOS требует понимания взаимодействия между OpenXR-рантаймами, композиторами и песочницей Steam. Для связки Meta Quest 3S + Steam (Proton) оптимальным и наиболее стабильным решением является использование WiVRn в качестве стримера и OpenXR-рантайма, с опциональным использованием OpenComposite для обратной совместимости со старыми OpenVR-играми.

💡 Критически важно: VR-пакеты в NixOS развиваются очень быстро. Настоятельно рекомендуется использовать пакеты из ветки nixos-unstable или оверлея nixpkgs-xr.


📦 Базовая конфигурация NixOS

Создайте или обновите ваш модуль (например, modules/vr.nix). Данная конфигурация решает две главные проблемы NixOS VR: асинхронную репроекцию (требующую CAP_SYS_N8) и изоляцию Steam (Pressure Vessel).

{ config, lib, pkgs, ... }:
{
  # 1. Загрузка модуля ядра для виртуального ввода (критично для WayVR)
  boot.kernelModules = [ "uinput" ];

  # 2. Добавление пользователя в необходимые группы
  users.users.ponfertato.extraGroups = [ "input" "plugdev" "adbusers" ];

  services.wivrn = {
    enable = true;
    autoStart = true;
    openFirewall = true;

    # Решает проблему фризов (асинхронная репроекция требует CAP_SYS_NICE)
    highPriority = true;

    # Автоматически пробрасывает PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES=1
    # Это позволяет играм в песочнице Steam видеть OpenXR-рантайм WiVRn
    steam = {
      enable = true;
      importOXRRuntimes = true;
    };

    # Переменные окружения для корректного захвата экрана в KDE Wayland
    monadoEnvironment = {
      XDG_CURRENT_DESKTOP = "KDE";
      XDG_SESSION_TYPE = "wayland";
      QT_QPA_PLATFORM = "wayland";
    };

    # Опционально: автоматический запуск WayVR из меню гарнитуры
    config = {
      enable = true;
      json = {
        application = [ pkgs.unstable.wayvr ];
      };
    };
  };

  environment.systemPackages = with pkgs.unstable; [
    wayvr         # Оверлей рабочего стола в VR
    opencomposite # Слой совместимости OpenVR -> OpenXR
    android-tools # Для ADB и проводного сопряжения при необходимости
  ];
}

⚠️ Решение типичных проблем

1. WayVR показывает только сквозную камеру (Pass-through)

Если WayVR запускается, но не отрисовывает интерфейс, а в логах есть ошибки uinput или OpenXR-Loader, выполните следующие проверки:

  • Группа input: Убедитесь, что пользователь добавлен в группу input (как указано в конфиге выше) и вы перезагрузили систему или перезашли в сессию после этого. Без этого WayVR не может инициализировать виртуальные устройства ввода и блокирует рендеринг UI.

  • Порядок запуска: Запускайте WayVR строго после того, как гарнитура подключена к WiVRn.

    # 1. Убедитесь, что сервис запущен
    systemctl --user status wivrn
    
    # 2. Если автоматический запуск не сработал, запустите через обертку Steam
    # (это решает проблемы с доступом к сокетам NixOS FHS)
    steam-run wayvr --replace
    
  • Ограничения iGPU: На старых интегрированных графических процессорах (например, Intel HD 530) композитинг Vulkan в WayVR может работать нестабильно. Если интерфейс не появляется, используйте встроенный SteamVR Desktop (запустите SteamVR из меню WiVRn и выберите “Рабочий стол”).

2. Игры Steam не видят OpenXR-рантайм

Даже при включенном importOXRRuntimes = true, некоторые игры могут требовать явного указания. Если игра вылетает или запускается в плоском режиме, добавьте в её параметры запуска в Steam:

PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES=1 %command%

Для старых игр, жестко требующих OpenVR, используйте OpenComposite:

env XR_RUNTIME_JSON=/run/current-system/sw/share/openxr/1/opencomposite_runtime.json %command%

3. Ошибка failed to determine active runtime file path

OpenXR-загрузчик не может найти манифест. WiVRn управляет этим автоматически, но если вы используете кастомные настройки, убедитесь, что файл существует:

ls -l /run/current-system/sw/share/openxr/1/openxr_wivrn.json

Если вы используете Home Manager, можно явно создать ссылку:

xdg.configFile."openxr/1/active_runtime.json".source = "${pkgs.unstable.wivrn}/share/openxr/1/openxr_wivrn.json";

🔄 Процесс подключения (Quest 3S)

  1. Включите Режим разработчика в приложении Meta Horizon.
  2. Подключите гарнитуру по USB-C. Разрешите отладку в окне гарнитуры.
  3. Установите APK WiVRn (скачайте последний релиз с GitHub):
    adb install WiVRn-vX.Y.Z.apk
    
  4. Отключите USB. Убедитесь, что ПК и гарнитура находятся в одной сети Wi-Fi (желательно 5 ГГц).
  5. Запустите приложение WiVRn на гарнитуре. Оно автоматически найдет ПК через Avahi (mDNS).
  6. В меню гарнитуры выберите запуск WayVR (или SteamVR, если WayVR не отображается).