@@ 0,0 1,100 @@
+---
+title: "P106-100 Cloud Gamming on Linux"
+categories:
+ - Linux
+tags:
+ - linux
+ - gpu
+ - xorg
+ - gaming
+---
+
+在 headless 的環境下用 P106-100 架出個人 Linux cloud gaming 平台
+
+* 想法:透過 Steam in-home streaming + VPN 在 P106 上 gaming
+ * NVIDIA 的 Linux OpenGL library 貌似沒有刻意封鎖或 debuff P106
+* 需求:P106-100 + 任何有 NVENC 的卡
+ * P106 沒有 NVENC
+ * Kepler 的 NVENC 即可
+ * Steam 目前(此文編寫時)還不支援 NVENC 以外的硬編
+ * VA-API 他們目前只有拿來解碼
+ * 沒有的話軟編很吃 CPU
+
+首先當然是裝好 NVIDIA driver, Steam, Xorg, pulseaudio, 另外還會用到 x11vnc, xrandr
+
+注意 NVIDIA driver 要有裝 32-bit 的部份(Steam 還在 32-bit)
+
+架好一個 VPN 或 tunnel, 推薦用 WireGuard
+
+如果是在 lxc 內, 記得把 P106 和 NVENC 卡的 cgroup 限制解除然後弄出 device node
+
+設定 xorg.conf 類似如下
+
+```
+Section "Device"
+ Identifier "Device0"
+ Driver "nvidia"
+ VendorName "NVIDIA Corporation"
+ BusID "PCI:66:0:0"
+EndSection
+
+Section "Monitor"
+ Identifier "Monitor0"
+ VendorName "Unknown"
+ ModelName "Unknown"
+ HorizSync 28.0 - 33.0
+ VertRefresh 43.0 - 72.0
+ Option "DPMS"
+EndSection
+
+Section "Screen"
+ Identifier "Screen0"
+ Device "Device0"
+ Monitor "Monitor0"
+ DefaultDepth 24
+ Option "AllowEmptyInitialConfiguration" "True"
+ Option "Coolbits" "31"
+ SubSection "Display"
+ Depth 24
+ EndSubSection
+EndSection
+
+Section "ServerLayout"
+ Identifier "Layout0"
+ Screen 0 "Screen0" 0 0
+EndSection
+```
+
+AllowEmptyInitialConfiguration 是用來允許沒有 output 的設定
+
+Coolbits 只是順便解鎖一些設定例如超頻
+
+BusID 是十進位的, lspci 是十六進位, 找到 P106 的 id 後記得轉換
+
+開 Xorg 和 pulseaudio
+
+用 xrandr 查看目前整個 screen 的大小, 用 --fb 改到目標大小
+
+開 x11vnc + Steam + 一個 wm
+
+開 Steam 時要加個環境變數 CUDA\_VISIBLE\_DEVICE 值是在 nvidia-smi 中 NVENC 卡的 index
+
+NVENC 某些地方要經過 libcuda, 設定 CUDA\_VISIBLE\_DEVICE 可以限制 CUDA 可用的卡, 進而強制用特定卡做 NVENC (Steam 只會試第一張)
+
+libcuda 現在在 NVIDIA driver 裡面就有, 不用額外裝整個 CUDA
+
+這些可以寫進 xinitrc 之類的之後比較方便(x11vnc 可能之後不太需要)
+
+用 vnc 進去登入設定 Steam, 幫遊戲寫個 .desktop 加進 Steam (如果不用加參數可以直接加 binary)
+
+注意如果 .desktop 有變要在 Steam 裡重新加一次才會生效
+
+可以順便用個 glxinfo 確認 OpenGL 是透過 NVIDIA 的 library 正常運作
+
+設定好後 x11vnc 可以關掉避免影響效能
+
+client 的部份記得在設定開 Display performance information 確認一下 encoder 是 NVENC
+
+client 的硬解是用 libva1 的而非 libva2, 裝 backend driver 時不要裝錯
+
+libva 是使用 DRI2, 而 XWayland 只支援 DRI3, Steam 有用 VAPutSurface 所以也不能直接改用 drm device, 所以如果要硬解基本上需要傳統 Xorg (libva 和 intel backend 有 DRI3 support pull request, 但我套用他在 Steam 會吃 BadWindow)