Mac下安装与使用Wine最全指导
2019-01-29 / modified at 2024-09-13 / 2.1k words / 8 mins

Wine可以看作ELF解释器(Interceptor),并实现了WindowsAPI(自己手写一套)与Direct的Runtime,因此可以复用native的性能,而不用虚拟机去执行虚拟指令集.

对比

Wine缺点也明显,上手有一定难度(类似于黑苹果的黑箱调试),需要找DLL与改各种配置,并对日志进行定位分析。

产品分支费用版本特性备注
WineHQ最新Free跨平台开源,主干分支最新版不支持osx
gcenx-wine-stable最新Free最新,能跑起来大部分应用还是跑不起来
CrossOver商用CommercialCodeweavers modified wine version.稳定,支持部分DX11
CrossOver bettertester商用15-days-freeCodeweavers modified wine version.免费nightly测试小白鼠
gcenx’s wine-crossover商用Free基于CrossOver开源部分编译类似CentOS与RedHat的关系
Game Porting ToolkitSDKFree苹果移植套件只支持ARM,非DXVK

此外还有PlayOnMac/wineskin等wrapper方案。它们配置更新维护没有CrossOver快,因此这些均不再介绍。

上述最佳方案莫过于商业版CrossOver,而且也不贵,不用折腾。

上述均不能保证程序全部正常运行,运行不来的还是要靠虚拟机。

安装

开源版CrossOver安装

假如你已经在macOS11以上,推荐安装GcenxWine的版本,安装后会自动创建Wine Crossover.app

1
2
3
brew tap gcenx/wine
brew install --cask --no-quarantine wine-crossover
brew install winetricks

这种安装很类似RedHat与CentOS的关系,虽然白嫖开源代码流程合法,但是追求稳定与Support的话还是使用收费版更好

收费版CrossOver的安装

购买后直接点击安装即可。

合法地免费申请测试使用最新版:https://www.codeweavers.com/bettertester

开源版gcenx-wine-stable

此版本经过测试,比较尴尬,无法运行32位程序,而且大部分64位程序会stack溢出。

随时切换配置(可选)

此部分主要是做对照实验时使用,并防止重装后丢失数据。

首先CrossOver安装完成后,新建一个/win7-64的容器

接着将如下代码复制到~/.bashrc中(或者zshrc,取决于你的Shell)

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
function wine_common(){
function lk_folder(){
echo link "$1" to "$2"
mkdir -p $1
rm -rf "$2/`basename $1`"
ln -sfn "$1" "$2"
}
export WINEPREFIX=$1
mkdir -p $WINEPREFIX
# 防止程序信息丢失,直接放在Mac下
v_user="${WINEPREFIX}/drive_c/users/$3"
lk_folder "${HOME}/Documents/wine/Application Data/" "$v_user"
lk_folder "${HOME}/Documents/wine/AppData/" "$v_user"
lk_folder "${HOME}/Documents/wine/Local Settings/" "$v_user"

lk_folder "${HOME}/Documents/wine/My Documents/" $v_user
lk_folder "${HOME}/Documents/wine/My Music/" $v_user
lk_folder "${HOME}/Documents/wine/My Pictures/" $v_user
lk_folder "${HOME}/Documents/wine/My Videos/" $v_user

# configurate path
export PATH=$(echo $PATH|tr ':' '\n'|grep -v wine|grep -v CrossOver|tr '\n' ':')
export PATH=$2:$PATH
# configurate language
export LC_ALL="en_US.UTF-8";
echo $v_user
readlink wine
# 可以看出收费版的Wine信息输出是不一样的
where wine
wine --version
}
function switch_wine(){
WINE_BIN="/Applications/Wine CrossOver.app/Contents/Resources/start/bin:/Applications/Wine Crossover.app/Contents/Resources/wine/"
WINEPREFIX=$HOME/.wine
export WINEARCH=win64
wine_common ${WINEPREFIX} ${WINE_BIN} $USER
}
function switch_co(){
BOTTLE_NAME=win7-64
WINE_BIN='/Applications/CrossOver.app/Contents/SharedSupport/CrossOver/CrossOver-Hosted Application'
WINEPREFIX="$HOME/Library/Application Support/CrossOver/Bottles/$BOTTLE_NAME"
Bottles=$(dirname ${WINEPREFIX})
ln -sfn "$Bottles/$BOTTLE_NAME" "$Bottles/default"
v_users=${WINEPREFIX}/drive_c/users
export WINEARCH=win64
export DXVK_HUD=1
wine_common ${WINEPREFIX} ${WINE_BIN} crossover
}

这样同时安装免费版与商业版的优点是可以随意切换env(商业版与免费版),而且数据可以共享(大部分配置全部都可以软链接到Document下)

使用

大部分简单的APP可以通过如下使用

1
2
3
# 切换到社区版 switch_wine
# 切换到商业版 switch_co
wine xxx.exe

For DirectX Game

到此为止,大部分非3D游戏应该都可以运行了。但是要强调一下,Mac性能差强人意,因此性能与虚拟机也好不到哪去,不要有过高期望。

我个人不推荐安装这里的任何dll,如果有问题,只能试试看而已。

DirectX9

虽然Wine已经完整实现并Build in了DirectX9,但是如果有兼容问题,可以考虑如下方案

1
2
3
4
# DX9, 10+不相互兼容,需要各自下载各自的,以9为例
# 这里有安装完全包(directx9)与DLL的方案,官方更推荐DLL(d3dx9_36)方案
# 我个人更喜欢安装这个
winetricks directx9

如果还是不能运行,那么就只能换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
2
3
# 开源版手动卸载 wine-mono 框架
wine uninstaller
winetricks dotnet35

而在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
2
# 安装一堆CJK字体,能用就行
winetricks cjkfonts

接着配置

1
2
3
4
5
6
7
8
cd $HOME/.wine
cat > font_settings.reg << EOF
REGEDIT4
[HKEY_CURRENT_USER\Software\Wine\X11 Driver]
"ClientSideWithRender"="N"
EOF
# 导入此文件
wine regedit font_settings.reg

如果有乱码问题,可以配置宿主语言或者传递如下变量,不需要LocaleEmulator等工具

1
2
3
# https://wiki.winehq.org/Testing_Languages
# ja_JP, en_US
export LC_ALL="zh_CN.UTF-8";

结论

与虚拟机的对比

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: 尝试下载使用旧版,通过二分法定位

其它资源