Wine可以看作ELF解释器(Interceptor),并实现了WindowsAPI(自己手写一套)与Direct的Runtime,因此可以复用native的性能,而不用虚拟机去执行虚拟指令集.
对比
Wine缺点也明显,上手有一定难度(类似于黑苹果的黑箱调试),需要找DLL与改各种配置,并对日志进行定位分析。
产品 | 分支 | 费用 | 版本特性 | 备注 |
---|---|---|---|---|
WineHQ | 最新 | Free | 跨平台开源,主干分支 | 最新版不支持osx |
gcenx-wine-stable | 最新 | Free | 最新,能跑起来 | 大部分应用还是跑不起来 |
CrossOver | 商用 | Commercial | Codeweavers modified wine version. | 稳定,支持部分DX11 |
CrossOver bettertester | 商用 | 15-days-free | Codeweavers modified wine version. | 免费nightly测试小白鼠 |
gcenx’s wine-crossover | 商用 | Free | 基于CrossOver开源部分编译 | 类似CentOS与RedHat的关系 |
Game Porting Toolkit | SDK | Free | 苹果移植套件 | 只支持ARM,非DXVK |
此外还有PlayOnMac/wineskin等wrapper方案。它们配置更新维护没有CrossOver快,因此这些均不再介绍。
上述最佳方案莫过于商业版CrossOver,而且也不贵,不用折腾。
上述均不能保证程序全部正常运行,运行不来的还是要靠虚拟机。
安装
开源版CrossOver安装
假如你已经在macOS11以上,推荐安装GcenxWine的版本,安装后会自动创建Wine Crossover.app
1 | brew tap gcenx/wine |
这种安装很类似RedHat与CentOS的关系,虽然白嫖开源代码流程合法,但是追求稳定与Support的话还是使用收费版更好
收费版CrossOver的安装
购买后直接点击安装即可。
合法地免费申请测试使用最新版:https://www.codeweavers.com/bettertester
开源版gcenx-wine-stable
此版本经过测试,比较尴尬,无法运行32位程序,而且大部分64位程序会stack溢出。
随时切换配置(可选)
此部分主要是做对照实验时使用,并防止重装后丢失数据。
首先CrossOver安装完成后,新建一个/win7-64
的容器
接着将如下代码复制到~/.bashrc
中(或者zshrc,取决于你的Shell)
1 | function wine_common(){ |
这样同时安装免费版与商业版的优点是可以随意切换env(商业版与免费版),而且数据可以共享(大部分配置全部都可以软链接到Document下)
使用
大部分简单的APP可以通过如下使用
1 | # 切换到社区版 switch_wine |
For DirectX Game
到此为止,大部分非3D游戏应该都可以运行了。但是要强调一下,Mac性能差强人意,因此性能与虚拟机也好不到哪去,不要有过高期望。
我个人不推荐安装这里的任何dll,如果有问题,只能试试看而已。
DirectX9
虽然Wine已经完整实现并Build in了DirectX9,但是如果有兼容问题,可以考虑如下方案
1 | # DX9, 10+不相互兼容,需要各自下载各自的,以9为例 |
如果还是不能运行,那么就只能换DX的版本或者换Wine的版本了
另外注册表参数CSMT
虽然在网上说有用(CrossOver中叫做Performance Enhanced Graphics),但是实际没有较大的提升
DirectX10+
在Wine中Mac下暂时没有找到实现,只有部分Hack的博文。原因是在Mac下,DX通过如下实现
- DX10+: DXVK(Vulkan,推荐)
- DX9: wined3d(OpenGL)
同时由于Mac本身性能就一般,所以这里就不折腾了。
而在CrossOver下,商业版支持了部分DX10+的API,但是总体上只可以看成一个Stub,并非完全支持。
关于.NetFrameWork
net框架是向前兼容的,理论上安装最新的就可以的,然而实际上当然是一堆坑,不一定要强求最新的版本
一般用Wine自己编译的Net框架Mono是最方便的,它底层源码是微软开源的,此外Unity也进行过定制。此外,CrossOver下会自动帮你安装好wine-mono。
如果你非要用MS的Net框架,首先需要卸载wine-mono框架
1 | # 开源版手动卸载 wine-mono 框架 |
而在CrossOver下用鼠标搜索“Net Framework 4.7.2”即可处理全部2.0到4.7的多版本安装。
Windows 10 下默认安装的版本为:4.6.x 和 3.5SP1,当前兼容性最强的为4.7.2与4.8.1。详见矩阵图
CJK字体乱码问题
网上有直接替换user.reg或者system.reg的方案,我个人不推荐,因为这两个可以看作序列化缓存,不应该手动修改,缺点是没有复用Mac下的字体
1 | # 安装一堆CJK字体,能用就行 |
接着配置
1 | cd $HOME/.wine |
如果有乱码问题,可以配置宿主语言或者传递如下变量,不需要LocaleEmulator等工具
1 | # https://wiki.winehq.org/Testing_Languages |
结论
与虚拟机的对比
Wine方案(包括CrossOver)总体来说,在Mac下使用范围还是有限,适合喜欢折腾的用户。因为Mac下非游戏类的软件均有替代方案,甚至比Windows下功能更强;而游戏由于先天性能不行导致只是比虚拟机性能略高,但是散热更低(风扇不会太响),可能有渲染错位,FS性能比虚拟机弱(可能是运行时转换DLL导致,需要PreLoader)的问题。当然这些是与付费软件Parallels对比的,有失公平。
此外还有一点,为了提高易用性,Wine方案安全隔离完全不够,权限与普通用户一致,没有做到UI等Namespace隔离,因此建议只运行可信来源的软件。
因此在目前场景下,Wine比较适合中小型软件/游戏的使用,以及白名单中的应用。最佳方案还是大硬盘+安全虚拟机综合效果更好
如果真的想玩游戏,参考
- 用Switch模拟器玩原生ARM游戏
- 用PlayCover玩iOS游戏
与移动硬盘OS的对比
如果使用移动硬盘安装软件,那么除了需要重启外体验基本上很好,当前SSD硬盘也白菜价了,可以考虑。
其它配置
卸载Wine
详见此Wiki
如果需要删除缓存
1 | rm -rf ~/.cache/winetricks |
常见报错处理
- Q: Unhandled exception: page fault on read access
- A: 这种一般是找不到库导致的,有的程序自嵌所有的库,有的必须找Windows
- Q: fixme xxx
- A: 根据调试经验,除了CG渲染,Fixme相关报错一般与主报错关系不大。建议使用二分法定位。
- Q: PresentationFramework, Version=3.0.0.0, Culture
- A: 安装相应的net库
- Q: 如何彻底重装容器?
- A: 直接
rm -rf ~/.wine*
(慎重执行)即可,winetricks下载的缓存在~/.cache/winetricks
中,不会重复下载
- Q: 还是无法运行某程序
- A: 尝试下载使用旧版,通过二分法定位