在Ubuntu上打造娱乐终端
即便是在不久之前,Linux系统一般都认为是服务器和开发者的专属,但随着Valve的steam deck的成功,以及微软对开源的拥抱,Linux的桌面娱乐生态也迎来了前所未有的发展.现如今,Linux桌面娱乐生态已经足够丰富,足以满足大部分人的娱乐需求了.这篇文章我们将专注于在Ubuntu上打造娱乐终端这一话题.
Linux下的游戏生态
steam大家都知道,知名的游戏平台嘛.但在linux下steam是一个神奇的存在,某种程度上可以说是steam盘活了桌面linux的游戏生态都不过分.
steam最基本的能力当然是让玩家可以方便的打游戏,阀门社为了这个目标煞费苦心,他们的努力直接给linux平台大范围扩展了生态,以至于steam即便不打游戏都是linux上的必装软件.
steam生态
在linux上steam的主流安装方式有两种:
- 原生安装–去官网下载.deb包安装
- flatpak安装–flathub安装
原生安装是最好的安装方式,但安装难度较大,主要的原因是steam本身是一个闭源软件,而且它的依赖比较复杂,尤其是一些32位依赖可能需要手动安装.但好处是原生安装的steam可以直接访问系统的硬件和驱动
而flatpak安装的steam则是一个沙盒化的版本,安装简单,但由于flatpak的沙盒机制,它对系统的访问是有一些限制的,但好处是安装简单,而且可以避免依赖问题.
无论哪种安装方式,steam只要安装好了就能用,这一点不用担心.安装steam,我建议遵从如下原则
- 先确保你的显卡驱动已经安装好,并且能正常工作,同时显卡可以让vulkan识别(可以用vulkaninfo | grep "AMD"或vulkaninfo | grep "NVIDIA"命令检查)
- 安装前先用timeshift备份下系统,以防万一
- 如果你是新手,建议用flatpak安装,安装简单
- 如果你是有经验的用户,建议先尝试用原生安装,如果遇到依赖问题无法解决,再回退安装前的系统快照,然后用flatpak安装.
需要注意无论是哪种安装方式,steam都需要联网才能正常工作,而且第一次启动时会先更新steam,这必须翻墙才能更新,如果你在国内你需要在第一次运行steam时挂着系统代理.
如果你是点击图标启动的steam你是无法查看到是否有在更新以及更新的进度的,你必须在终端中执行steam才能看到这些信息,要在终端中执行steam,不同的安装方式启动命令不同
原生安装
steam
flatpak安装
flatpak run com.valvesoftware.Steam
原生安装版本的坑
n卡的32位依赖问题
如果你是n卡用户.安装steam的deb包后,第一次运行时回提示你安装依赖,如果报错提示缺少32位的libc.so.6:
You are missing the following 32-bit libraries, and Steam may not run:
libc.so.6
要解决这个问题,我们需要先额外安装两个依赖
- 
    安装32位的 libc6sudo apt install libc6:i386
- 
    安装 nvidia-driver对应版本的32位驱动dpkg -l | grep nvidia-driver # 获取到驱动版本 比如575 sudo apt install libnvidia-gl-575:i386 #安装对应32位依赖
如果安装好后还是报错,或者libnvidia-gl-xxx:i386这里报错,那就只能回退到安装前的系统快照,然后用flatpak安装了.
flatpak版本的坑
显卡驱动问题
如果你是用flatpak安装的steam,那就要注意显卡驱动的问题了.由于flatpak的沙盒机制,它对系统的访问是有限制的,尤其是对显卡驱动的访问.如果你的显卡驱动没有正确配置,那么steam可能无法识别你的显卡,从而导致游戏无法运行.如何检查flatpak是否有安装好显卡驱动呢?可以用下面的命令检查
flatpak list | grep nvidia
如果你看到有NVIDIA相关的条目,那就说明flatpak已经可以正确识别了你的n卡驱动,如果没有,那就说明没有识别到,你需要安装对应版本的nvidia驱动支持包.安装命令如下
flatpak install flathub org.freedesktop.Platform.GL.nvidia-你的驱动版本号
额外路径的问题
如果你希望游戏都放在一个单独的盘(比如/game)下,那你需要额外设置下这个路径的权限,否则steam是无法访问这个路径的.设置命令如下
flatpak override --user --filesystem=/game com.valvesoftware.Steam
同理,如果你希望steam管理非steam游戏,那你也需要设置下这些非steam游戏所在路径的权限.比如:
flatpak override --user --filesystem=/media/MyWinGames com.valvesoftware.Steam
添加非steam应用
steam除了可以管理它自己平台上的软件,也可以自己给它添加软件由他启动


steam runtime
如果游戏也算应用的话steam在linux上可能是最大的应用分发渠道了.steam通过steam-linux-runtime支持原生linux应用.
而这个steam-linux-runtime实际上就是一个通用的轻量级沙盒,包含了一个统一的库环境并用namespace与操作系统隔离.一些游戏开发相关的开源应用比如blender,godot,原生支持linux的游戏比如dota也都可以使用这种方式运行.
由于这个环境也是用namespace做抽象的,所以性能损失也是有的,只是没那么多.
话虽如此,我个人还是不太推荐用steam管理除游戏以外的linux原生应用的,一方面这种应用太少,另一方面这类应用都往往是对计算性能要求比较高的类型,白白损失性能还是太可惜了.
转译windows应用
其实很久之前就有一个开源项目wine致力于让linux和macos可以执行windows程序.起工作原理可以理解为将windows程序调用的各种系统依赖在linux/macos上重新实现一遍,然后让windows程序调用这些被转译的依赖以执行.这一套方案原理上逻辑上没啥问题,但一直以来支持并不好,主要原因是图形接口的转译跟不上.
- 一方面是厂商不开源,让转译工作难以进行,
- 另一方面是开源的工具(opengl这类)性能拉胯.
- 最后就是项目是社区驱动的,没钱没资源,维护自然也跟不上
而就在最近几年转译应用忽然就迎来了春天,主要取决于两点
- 微软开始拥抱开源了,
- 阀门社开始做steam deck了.
总而言之,阀门社搞了个开源的转译层项目proton.这直接让linux下可以正常跑大部分windows平台的游戏,还顺便让其他windows软件也可以借助steam进行管理运行.
我们就以官网下载的原生版本的steam为基准,介绍转译应用.
使用steam安装proton
首先我们要先安装steam,由于steam本身是一个启动器,后需可能会有很多需要手动操作的部分,因此最好是原生安装方便手动调试.然后进入steam,进入库,勾选工具,找到proton,一般装个最新版本就够用了.也可以多装一个proton experimental备用,然后视游戏安装相关的反作弊运行时即可.
使用ProtonUp-Qt安装proton-ge
proton项目是开源的,除了steam官方的proton,自然也会有魔改proton.其中最知名的自然就是proton-ge,这个第三方的魔改proton据说比官方版本效率更高些,而且兼容性会更好些,虽然也一样可能有兼容性问题.
proton-ge官方给的安装方式还是比较麻烦的,我们可以使用ProtonUp-Qt来进行自动安装,只要打开后选择最新版本安装即可.ProtonUp-Qt会识别出你用的是哪种安装方式的steam,然后自动将proton-ge安装到对应的位置.

使用proton运行非steam的windows游戏
即便是安装好proton后,windows平台的软件也是不能直接下载了用的,我们需要选中已经购买好的游戏,点击右侧设置(齿轮按钮)->属性->兼容性,选一个proton版本强制指定兼容层.这样游戏就可以下载运行了.


至于能不能玩,这就得群策群力了,protondb是一个steam上游戏兼容性的数据网站,主要靠社区玩家提交报告来确定特定游戏的兼容性.我们可以先在其中查看
游戏帧数检测
我们看到很多评测视频里会有帧数(FPS)等指示用来观察游戏的流畅程度.在linux下也有,需要使用flightlessmango/MangoHud这个软件.
原生安装的steam
sudo apt install mangohud
安装完成后我们可以在steam中设置启动选项修改为mangohud %command%

默认会在游戏界面的左上角给出cpu,gpu占用和帧数数据.我们可以在~/.config/MangoHud/MangoHud.conf文件中对展示的内容进行自定义,具体有哪些参数可以看这张表.建议像我下面这样设置
cpu_temp
gpu_temp
ram
vram
position=top-left
flatpak安装的steam
如果是flatpak安装的steam,那我们就不需要直接装mangohud,而是要给flatpak安装mangohud的支持包
flatpak install flathub org.freedesktop.Platform.VulkanLayer.MangoHud
安装过程中会提示你选择对应的版本,你选择与你steam一致的版本即可(用flatpak info --show-runtime com.valvesoftware.Steam检查steam对应的版本).
然后还需要再steam的启动选项修改中添加对应的环境变量
flatpak override --user --env=MANGOHUD=1 com.valvesoftware.Steam
这样就可以在flatpak安装的steam中使用mangohud了.
注意和原生的steam中不同,我们不用修改steam中设置启动选项.因为这个环境变量是给flatpak的steam进程设置的,它会全局生效.
这种方式同样会读取~/.config/MangoHud/MangoHud.conf文件进行配置.参照上面的配置即可.
关闭mangohud
如果你只是想暂时不看帧数,最简单的方法是在游戏中通过快捷键切换.MangoHud默认的开关快捷键是Shift + F12.在游戏里按下这个组合键,MangoHud的叠加层就会隐藏.再次按下它又会重新出现.这个方法的好处是你不需要做任何系统层面的改动并且可以随时切换
如果你想永久关闭mangohud,那就需要把启动选项修改中的mangohud %command%给删掉.如果是flatpak安装的steam,那就需要把之前设置的环境变量给删掉
flatpak override --user --env=MANGOHUD= com.valvesoftware.Steam
可视化配置MangoHud.conf
如果你不想手动编辑MangoHud.conf文件,也可以使用一个可视化的配置工具Mango Juice.一样的使用flatpak安装即可.
flatpak install flathub io.github.radiolamp.mangojuice
这个工具可以让我们通过图形界面来配置MangoHud.conf文件,并且可以实时预览效果.配置完成后点击Save按钮即可保存配置,也可以保存为不同的配置文件以便切换.
linux下的音影娱乐
linux下的音影娱乐生态其实也挺丰富的,这里就不一一介绍了,只推荐几个我个人觉得不错的软件
小黄鸭(Lossless Scaling)伪双卡交火
Lossless Scaling是steam上的一个小软件,它可以让我们在低分辨率下运行游戏,然后将画面放大到全屏显示,还可以进行插帧.如果我们刚好有两块显卡,那么就可以用这个软件让一块显卡专门负责游戏的渲染,另一块显卡专门负责桌面的插帧显示,这样就相当于双卡交火了.遗憾的是官方版本是windows限定,不过有个开源插件lsfg-vk,用它就可以在linux下使用这项伪双卡交火技术了.注意这个软件用到了Vulkan,你得确保你的显卡驱动支持Vulkan.
串流
用steam串流
说到串流可能大家想到的更多的是sunshine-moonlight的串流组合.但实际情况是在用N卡的情况下sunshine强无敌,而在用a卡尤其是apu的核显的情况下sunshine并不好用,尤其在linux下根本用不了.反而是steam link效果还不错.
用法也不复杂
- 接收端的机器安装steam link,苹果直接在app store里下,安卓则去官网下即可,之后打开它
- 发送端机器打开steam,在steam->设置中找到远程畅玩,激活后配对流式应用即可.如果你已经有配对好了的就需要先取消设备配对然后再做配对
- 这时你接收端的机器会有个pin码,在发送端机器中将这个码填上就配对完成了.
 

steam串流非常吃网络,发送端一定要用有线的方式接入网络,接收端也尽量在网络覆盖范围内.网络稳定串流才能稳定
mycard
mycard很神奇的自带linux支持,这个平台主要是用来玩ygopro和东方的,
不想花钱买卡又想打游戏王的牌佬就可以在linux下很轻松的玩到ygopro2了.在linux下首页下载提供的是一个appimage,下载下来后给个+x权限人工集成下就能用了.
有如下注意事项:
- mycard下载游戏依赖aria2c,需要先安装aria2c再安装mycard
- mycard解压游戏依赖zstd,需要先安装zstd(sudo apt install zstd)再安装mycard
- 游戏王只能使用ygopro2,因为ygopro的依赖编译有问题,会缺少irrKlang,而ygopro2是unity开发,没有依赖问题
- 东方游戏都是window游戏,mycard仅能用作下载,运行需要借助steam的proton