OrangePI 3B Steam 主机

之前买 Orange 5Pro 来设计 NAS 的时候顺带买个 Orange 3B, 因为嫌弃性能不够一直没拆封过;
最近跨年整理的时候才发现这块开发板, 想着闲着也是闲着就看看能干点什么.

最后想着搭配手里的8寸便携式显示器直接改造成简单的小型 Steam Machine, 通过连接 XBOX 蓝牙手柄来游玩游戏.

Orange 5Pro

Orange 3B

OrangePI 3B 后面简称为 opi3

这套方案的具体配置如下:

  • RockChip RK3566 瑞芯微四核 64 位 ARM 处理器, 主频最高 1.8GHz

  • 8GB LPDDR4/4X 自带内存

  • 120GB SATA 廉价朗科固态硬盘(这是我额外购买扩展固态硬盘)

  • 支持 Wi-Fi5/蓝牙/HDMI 方案

  • Armbian 系统(Debian的 iot 方案)

  • 支持 OpenGL ES 1.1/2.0/3.2 | OpenCL 2.0 | Vulkan 1.1(Vulkan是重中之重)

需要注意: 这块开发板默认只启用的 NVME 协议, 直接接入 SATA 协议的固态是没办法识别的.

SATA

如果固态是 SATA 协议就需要修改 Armbian 启动引导文件 /boot/armbianEnv.txt 添加 overlays=rk3566-roc-pc-sata2:

1
2
overlay_prefix=rk35xx
overlays=rk3566-roc-pc-sata2

确保这两行配置存在, 之后重启开发板确认能够识别:

1
2
3
4
5
6
7
8
9
10
reboot # 重启

# 之后查看到硬盘信息
lsblk
# sda 8:0 0 111.8G 0 disk
# └─sda1 8:1 0 111.8G 0 part /data
# mtdblock0 31:0 0 16M 0 disk
# mmcblk1 179:0 0 58.2G 0 disk
# └─mmcblk1p1 179:1 0 57.6G 0 part /var/log.hdd
# 这里的 sda 就是识别出来的 sata 固态硬盘

初始化固态并挂载可以网上搜索 Linux挂载硬盘 即可, 但这里还有个坑点: 不要用 UUID 识别挂载硬盘

可能是本身开发板厂家固件问题, 扩展硬盘的 UUID 是和 TF 卡系统的 UUID 一致, 如果设置 /etc/fstab 用 UUID 挂载直接无法启动;
所以这里我提供直接硬件路径写入启动项:

1
2
3
4
5
cat /etc/fstab
# 最后展示内容如下, 最下面就是固态硬盘挂载, 如果你也有相同开发板可以参考下, 我是挂载在 /data 路径下
# UUID=b6315cef-86b8-442a-8ed9-6c217f3e23d8 / ext4 defaults,,commit=120,errors=remount-ro 0 1
# tmpfs /tmp tmpfs defaults,nosuid 0 0
# /dev/sda1 /data ext4 defaults 0 0

我这边的系统是基于 Debian13 iOT 的 Armbian 版本, 需要手动来安装 GPU 的 Vulkan 驱动:

1
2
3
4
5
6
7
8
9
10
# 安装 GPU 工具还有 Vulkan 和 OpenGL 驱动, 安装之后需要重启开发板
sudo apt install mesa-utils vulkan-tools mesa-vulkan-drivers mesa-vulkan-drivers:armhf -y
sudo dpkg --add-architecture armhf
sudo apt update
sudo apt install -y libgl1-mesa-dri libgl1-mesa-dri:armhf libegl1-mesa-dev \
libegl1-mesa-dev:armhf libglx0 libglx0:armhf mesa-common-dev mesa-common-dev:armhf
sudo reboot # 重启开发板

# 重启之后查看显卡驱动
vulkaninfo | grep "VkPhysicalDeviceProperties" -A 5

这里就是正式部署的前置准备, 之后的操作都需要小心操作避免弄错而无法启动服务.

系统账户

这里是很多人容易疏忽的点: 默认 Steam 都是安装在自己 HOME 目录之中, 那些目录都是保存 TF 卡(读写性能很差, 最大性能瓶颈).

所以需要指定创建自己的系统账户让这个账户的 HOME 目录指向挂载的固态硬盘目录, 最大限度利用固态硬盘的高速读写特性;
这里直接命令行来创建指定开机启动 Steam 专用账号登陆:

1
2
3
4
5
6
7
8
9
# 注意: 我这边固态挂载的地址是 /data, 所以我创建 /data/users 目录用来放置扩展的系统用户
sudo mkdir /data/users
sudo chmod 755 /data/users

# 创建创建指定的系统用户, HOME 目录处于 /data/users/steamd
sudo useradd -m -d /data/users/steamd -s /bin/bash steamd

# 需要设置默认登陆密码
sudo passwd steamd

这就是定制的 steamd 系统管理员, 用于负责启动桌面环境来调动 Steam 客户端任务, 基于 SATA 协议固态硬盘尽可能避免读写瓶颈.

虚拟内存

因为本身开发板性能并不是那么高, 默认安装之后系统分配的虚拟内存会分配在 TF 卡上面会很明显影响到运行顺序.

所以就需要让分配出来的虚拟内存地址映射到 SATA 协议的固态硬盘之中, 而非 TF 卡的空间之中, 这里需要执行命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 注意: 这里需要 sudo 或者最高管理员执行
sudo swapoff -a # 关闭目前默认的虚拟内存区
sudo sed -i '/swap/s/^/#/' /etc/fstab # 在系统分区之中的 swap 全部注释

# 初始化创建分区路径 /data/swap, count=4096 = 1M×4096 = 4GB
# 一般来说 4~16G 应该足够了, 因为本身 opi3 的 8G 内存单用户启动够用, 主要瓶颈还是CPU
sudo dd if=/dev/zero of=/data/swap bs=1M count=4096
sudo chmod 600 /data/swap # 权限必须为 600
sudo mkswap /data/swap # 格式化为 Linux 的交换空间格式
# 这里会返回 UUID, 建议不要用 UUID 标识位置

# 启用虚拟内存空间
sudo swapon /data/swap

# 写入永久启用空间
echo "/data/swap swap swap defaults 0 0" | sudo tee -a /etc/fstab

这里默认分配 4G 作为固态硬盘映射的虚拟内存提供给开发板使用, 大部分情况小型游戏应该不会用到, 而大型游戏瓶颈也不是内存问题.

桌面环境

可能是开发板固态硬件还是什么适配问题, 我按照网上说本来采用 xfce 这类节省启动资源的桌面环境,
但是配置 lightdm 桌面管理器一直启动报错, 之后切换成 gnome 方案才没问题(xfce 只有错误码 = 1, 没有其他任何错误信息):

1
2
3
4
5
6
# 在命令行之下输入以下内容, 改用 gnome 资源占用比较大但兼容性比较好, 安装完成会自动启动开发板
sudo apt install -y gnome-core gdm3 && sudo reboot

# 关闭多余的桌面特效
gsettings set org.gnome.desktop.interface enable-animations false
# 在 steamd 的系统用户也需要执行一次

启动之后能够看到开机之后默认进入桌面环境, 之后就准备折腾社区的模拟 x86 和 x64 方案, 目前社区方案如下:

这里可以手动编译或者源安装, 这方面按照自己需求选择; 我这边采用源安装, 直接命令行执行:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 安装所需依赖
sudo dpkg --add-architecture armhf
sudo apt update
sudo apt install -y libstdc++6:armhf libstdc++6 libgcc-s1:armhf libgcc-s1 binutils preload fonts-wqy-zenhei
sudo apt install -y libx11-6:armhf libx11-dev:armhf libxcb1:armhf libxcb1-dev:armhf libxau6:armhf libxau-dev:armhf

# X86 方案
sudo dpkg --add-architecture armhf && sudo apt-get update
sudo apt-get install libc6:armhf -y
sudo wget https://itai-nelken.github.io/weekly-box86-debs/debian/box86.list -O /etc/apt/sources.list.d/box86.list
wget -qO- https://itai-nelken.github.io/weekly-box86-debs/debian/KEY.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/box86-debs-archive-keyring.gpg
sudo apt update && sudo apt install box86 -y

# X64 方案
sudo wget https://ryanfortner.github.io/box64-debs/box64.list -O /etc/apt/sources.list.d/box64.list
wget -qO- https://ryanfortner.github.io/box64-debs/KEY.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/box64-debs-archive-keyring.gpg
sudo apt update && sudo apt install box64 -y


# 下载 Steam Linux 版本到用户目录并安装
# 这里参照 https://github.com/ptitSeb/box64/blob/main/install_steam.sh 这个安装脚本
# 这个脚本写的可能有问题, 所以最好不要直接执行, 而是要手动处理
mkdir -p ~/steam/tmp
cd ~/steam/tmp
wget https://repo.steampowered.com/steam/archive/precise/steam_latest.deb -O steam.deb

# 手动解压应用并且移动到外层执行
ar x steam.deb
tar xf data.tar.xz

# 移动到外部不需要临时目录
mv ./usr/* ..
cd .. && rm -rf ./tmp

# 创建运行脚本
echo '#!/bin/bash
export STEAMOS=1
export STEAM_RUNTIME=1
export PROTON_USE_WOW64=1
export DBUS_FATAL_WARNINGS=0
~/steam/bin/steam $@' > steam

# 赋予执行权限并设置全局可执行
chmod +x steam

# box64 是将执行命令放置到全局, 这里感觉没有什么必要所以没有处理
# sudo mv steam /usr/local/bin/

# 到这里最好重启开发板, 然后就可以在桌面模式的命令行输入 steam, 启动更新客户端
# 注意: 这个必须要在桌面模式下才能启动, 这样才能调用到内置的显卡驱动
/usr/local/bin/box64 /data/users/steamd/steam/steam

注意: 首次启动网络不好的时候, Steam 客户端更新会很缓慢, 不看命令行还以为卡死

重启开发板之后, 进入桌面模式输入 /usr/local/bin/box64 /data/users/steamd/steam/steam 登陆账户.

device

run

首次进入的时候会非常卡顿, 因为这时候会加载游戏库的 所有游戏封面/公告/最新消息, 也就是游戏库越多, 启动的时候越卡.

而且 opi3 羸弱的 CPU 性能在这种并发下载游戏周边资源 CPU 会疯狂飙升, 有可能温度控制不好会出现直接开发板死机卡死的情况.

这种情况下最好下进入游戏库页面当中不去管他, 让 Steam 去下载游戏相关封面和图标资源并且在本地构建成缓存数据.

game

另外还需要注意: 记得在 gnome 桌面模式当中关闭掉屏幕保护和省电模式, 避免待机的时候系统自动进入休眠状态

游戏测试

witch

这套方案是目前都是社区提供, 所以免不了会出现大量动态库链接异常或者兼容性闪退, 而目前看 Steam 官方还没有出 ARM 版本计划

现在相当于套两层系统转译层运行(proton + box64/box86), 这效率比常规 x64 + proton 还差;
受限于 Orange3B + ARM, 这已经超越小马拉大车达到玩具四驱车拉火箭的情况.

这套方案需要注意的点: 尽可能把开发板视为硬件提供者调用库文件, 而软件方面尽可能通过固态硬盘加载和运行

OrangePi 的固件有问题, 没办法单独通过接入固态硬盘来启动系统, 必须要采用 TF 卡才能引导系统启动

另外目前 box64 对于 Steam 专门大屏幕模式有兼容问题, 可能会导致进去该界面卡死无反映, 不过目前没有测试过也不知道是否修复好了.

download

这里下载完游戏启动会唤起 Vulkan 来启动 Window 环境兼容层并编译着色器, 这过程特别久且会停止响应.

老旧的 Vulkan 支持 + amd64 模拟层 + window 模拟层, 性能 debuff 叠加满

不能说完全没办法运行, 只能说涉及到稍微需要 3D 渲染的情况, 整个卡顿都非常明显, 甚至一直处于转圈加载进不去界面.

execute

这期间的 CPU 温度也是十分烫手, 虽然 CPU 已经很努力在运行了

游戏帧率都卡得不到个位数, 《魔法少女的魔女审判》 基本上没办法流畅, 只能换个性能需求低的游戏来测试.

之后切换成泰拉瑞亚(Terraria)测试, 进入游戏的速度还是一如既往的惨不忍睹, 进入游戏更是惨不忍睹卡顿运行.

生成随机世界种子构建卡了很久(快半小时), 感觉是这颗 RK35XX 的 CPU 性能特别差(别看是4核的CPU), CPU 感觉运行得快冒烟了

其实应该选择支持 Linux 原生平台的游戏, 尽可能减少模拟 window 层的代价来加速运行效率.

可能换成 Orange-Pi5-Pro 开发板就能跑得稳定些, 毕竟 RK3588S 的 2.4GHz 主频怎么都比 OrangPi-3B 强.

Orange-Pi5-Pro 也是 E+P 大小核架构, 就是看着 CPU 的8核心唬人而已(一般都是屏蔽小核)

不过我这边手头的 Orange-Pi5Pro 都拿去跑自己的 NAS 服务器, 而官方好像没有补货所以暂时买不到.

其他的就是需要留意以下情况, 从而才能达到最高的运行效率:

  • 尽可能少接入外部设备: 如果可以只需要接入 HDMI 显示, 其他设备拔出降低供电

  • 尽可能采用官方最高功率(5V5A): 保持最大供电可以让开发板运行效率更好

  • 留意散热情况: 因为目前是冬天, 所以温度问题感知不明显, 如果夏天使用最好加装小型风扇辅助散热

  • 尽可能采用固态加载运行: TF 卡读写效率太差, 最好只用来做 BOOT 引导系统, 其他都在固态硬盘运行

  • 选择占用资源较小桌面环境: 我这边是为了兼容直接用 gnome, 这个桌面环境默认就挺吃性能的

后面如果有时间的话再购置个高性能 ARM 开发板试试看运行效率怎么样.