YHNdnzj's Blog

Mike Yuan 的個人小站

在 systemd-nspawn 上運行 Steam

Mike Yuan's Avatar 2020-03-16

  1. 1. 創建 Container
  2. 2. 配置 Container
    1. 2.1. 允許訪問 getty
    2. 2.2. 掛載需要的 Device file 和 Socket
    3. 2.3. 允許連接 X Server
  3. 3. 配置 Steam

Steam 依賴許多 32-bit lib,鑑於此我沒有在 host 使用 pacman 安裝它。flatpak 等第三方包管理器由於潔癖,同樣沒有考慮。此時,systemd-nspawn 便成爲了很好的選擇。

創建 Container

1
2
3
4
# pacman -Syu arch-install-scripts
# cd /var/lib/machines
# mkdir arch-nspawn
# pacstrap -c arch-nspawn base

配置 Container

允許訪問 getty

編輯 /var/lib/machines/arch-nspawn/etc/securetty,加入 pts/0pts/9.

掛載需要的 Device file 和 Socket

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# cat /etc/systemd/nspawn/arch-nspawn.nspawn
[Exec]
Boot=true
PrivateUsers=no

[Files]
# Xorg
BindReadOnly=/tmp/.X11-unix

# GPU
Bind=/dev/dri

# NVIDIA
Bind=/dev/nvidia0
Bind=/dev/nvidiactl
Bind=/dev/nvidia-modeset
Bind=/dev/shm

# Controller
Bind=/dev/input

# PulseAudio
BindReadOnly=/run/user/$UID/pulse

# AppIndicator
BindReadOnly=/run/user/$UID/bus

[Network]
VirtualEthernet=no

# systemctl edit [email protected]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Service]
# GPU
DeviceAllow=/dev/dri rw
DeviceAllow=char-drm rwm

# NVIDIA
DeviceAllow=/dev/nvidia0 rw
DeviceAllow=/dev/nvidiactl rw
DeviceAllow=/dev/nvidia-modeset rw
DeviceAllow=/dev/shm rw

# Controller
DeviceAllow=char-usb_device rwm
DeviceAllow=char-input rwm

允許連接 X Server

$ xhost +local:

配置 Steam

1
2
# machinectl start arch-nspawn
# machinectl login arch-nspawn

以 root 登入,安裝 Steam, OpenGLVulkan 驅動

由於某些程式直接使用 ALSA,需要安裝 pulseaudio-alsa. 但其依賴 pulseaudio,於是使用 pacman 的 --assume-installed 選項跳過。

# pacman -S --assume-installed pulseaudio pulseaudio-alsa

建立一個新的使用者,注意要與 Host 運行 D-Bus, PulseAudio 的 UID 相同。

此時應該可以啓動 Steam 了:

DISPLAY=:0 PULSE_SERVER=unix:/run/user/$UID/pulse/native steam

本文作者 : Mike Yuan
本文协议 : 知识共享 (Creative Commons) 署名—相同方式共享 4.0公共许可协议国际版
本文链接 : https://yhndnzj.com/2020/03/16/steam-on-systemd-nspawn/

本文最后更新于 天前,文中所描述的信息可能已发生改变