Wine 和 Proton 是什么关系

Wine 的手册页开头写的是 wine - run Windows programs on Unix:它能加载并运行 DOS、Windows 3.x、Win32 的可执行文件,在 64 位系统上也能运行 Win64 的可执行文件。

Proton 是 Valve 做的、给 Steam 客户端用的兼容工具,让只有 Windows 版的游戏在 Linux 上运行。Valve 的项目说明写明它使用 Wine 来做到这一点。可以这样理解:Wine 是底层,Proton 是 Steam 游戏专用的整合。

在 Ubuntu 26.04 上安装

Ubuntu 26.04.1 的软件源自带 Wine,版本是 10.0~repack-12ubuntu1。和 winetricks 一起装:

sudo apt install wine winetricks

我在一个最小的 amd64 容器里试过:apt install -s wine 模拟显示要装入 331 个软件包,装完之后:

wine --version

输出 wine-10.0 (Ubuntu 10.0~repack-12ubuntu1)。

两个细节:软件源里没有 wine32 包,wine 依赖的是 wine64 | wine32,实际装上的是 wine64;安装前后 dpkg --print-foreign-architectures 的输出都是空的,说明这个版本在 amd64 上不要求启用 i386 架构。winehq-stable 不在系统自带的软件源里。

WineHQ 自己的软件源对 Ubuntu 26.04(resolute)和 24.04(noble)都存在。想用比发行版更新的 Wine,去 WineHQ 官网查当前的安装说明,本文不替它写步骤。

WINEPREFIX:用好 Wine 的关键

Wine 把注册表、配置文件和虚拟的 C 盘放在一个目录里,这个目录由环境变量 WINEPREFIX 指定,默认是 $HOME/.wine。

手册页有一句话值得读两遍:同一个用户的所有 wine 进程共用同一个 wineserver,共享注册表、共享内存和配置文件。也就是说,默认情况下你装的所有 Windows 程序都挤在同一个前缀里,一个程序装的运行库或改的注册表项,会影响其它程序。

解决办法是给每个程序一个独立的前缀。给不同的 wine 进程设置不同的 WINEPREFIX,它们就是真正相互独立的,这是手册页明确支持的用法:

WINEPREFIX=~/.wine-myapp wine setup.exe

初始化一个新前缀用 wineboot -u:

WINEPREFIX=/tmp/p WINEDEBUG=-all wineboot -u

在没有桌面的容器里,这条命令的退出码是 0,/tmp/p 下出现了 dosdevices、drive_c 和 wineserver。这个新建的前缀占了约 680 MB,所以每多一个前缀,就要多留几百 MB 的磁盘空间。

运行程序

基本形式是 wine 程序 [参数]。程序名可以写成 DOS 格式(C:\\WINDOWS\\SOL.EXE),也可以写成 Unix 格式(/msdos/windows/sol.exe)。参数写在命令行末尾:

wine notepad C:\\TEMP\\README.TXT

在 shell 里,路径里的空格和特殊字符要用反斜杠转义:

wine C:\\Program\ Files\\MyPrg\\test.exe

Wine 自带的一些程序不用写完整路径,比如 wine notepad、wine explorer。

Windows 的控制台程序要用 wineconsole 运行。手册页说,不用 wineconsole 的话,控制台支持非常有限,程序可能不能正常工作。

程序跑不起来,用 WINEDEBUG 打开日志,语法是 [class][+|-]channel[,...],class 有 err、warn、fixme、trace,字符串里不能有空格。手册推荐的起点是:

WINEDEBUG=warn+all wine 程序.exe

组合的例子:

WINEDEBUG=fixme-all,warn+cursor,+relay wine 程序.exe

这会关掉所有 FIXME 信息,打开光标相关的警告和所有 API 调用的跟踪。

没有桌面的环境里怎么验证

在服务器或容器里,可以先确认 Wine 本身能工作。初始化前缀之后,用 cmd 执行一条命令:

WINEPREFIX=/tmp/p wine cmd /c echo hello-from-wine

我在容器里得到的输出是 hello-from-wine。这只能说明 Wine 能初始化前缀、能跑 Windows 的控制台命令;我没有测试带图形界面的程序、声音和显卡驱动,桌面上的实际体验要你自己试。

Proton:Steam 里的 Wine

Valve 的建议是:大多数用户用 Steam 客户端自带的 Proton,不需要自己编译。自己编译的 Proton 在 Steam 设置窗口的 Steam Play 部分选择;某个游戏的选项在它的属性里,“设置启动选项”那一栏。

渲染方面,Proton 默认用 DXVK 处理 Direct3D 9、10、11,DXVK 是基于 Vulkan 的渲染器。把环境变量 PROTON_USE_WINED3D=1 设上,就会改用基于 OpenGL 的 wined3d。项目里还有一个 VKD3D-Proton 子模块,官方的说明没有展开它的作用,这里只提它存在。

要给 Steam 里的某个游戏加这个变量,写在那个游戏的启动选项里,形式是:

PROTON_USE_WINED3D=1 %command%

游戏能不能玩,Valve 的 Proton 说明没有给出任何保证,也没有提供兼容性列表,只指向 wiki 上的更新日志。社区里有记录各游戏体验的报告站点,ProtonDB 是常被提到的一个,它不是 Valve 的官方资源,报告也不能代替你自己测试。

兼容性要自己确认

Wine 和 Proton 都不保证某个 Windows 程序一定能运行。一个稳妥的做法:普通程序先放进一个独立的 WINEPREFIX 里安装,试主要功能,出问题再用 WINEDEBUG=warn+all 看日志;游戏先用 Steam 自带的 Proton,不行再试 PROTON_USE_WINED3D=1。

清理时,删除一个前缀目录只会影响这个前缀,别的前缀不受影响。但程序存在前缀里的数据(存档、设置)会一起被删掉,先备份需要留下的,再确认路径没有写错。