Mac下安装与使用Wine4最全指导
2019年01月29日に投稿

Wine/CrossOver最近终于释出了4.0正式版,支持了Vulkan等新功能。作为折腾党,第一时间试用了下Wine4.0在Mac下的表现,愿意折腾的可以试试。

原理

Wine可以看作ELF解释器(Interceptor),并实现了WindowsAPI(自己手写一套)与DirectX(基于OpenGL)的Runtime,因此可以复用native的性能,而不用虚拟机去执行虚拟指令集。缺点也明显,上手有一定难度(类似于黑苹果的黑箱调试),需要找DLL与改各种配置,并对日志进行定位分析。

而Wine的商业版CrossOver是在Wine的基础上新增了GUI界面,定制了Wine的二进制,并维护了很多配置文件(比如到底用哪个DLL更好),相当于花了150去买自动配置好的文件,节约了时间,目前CrossOver使用的是3.14(Update Apr 24: 已经升级到4.0)版Wine。它的缺点是日志报错不能直接打印到StdOut,难以调试。

此外还有PortingKit方案。它基于wineskin,融合exe与winelib生成一个App,不过它对应的Wine版本也是3,此方案适用于运行游戏,缺点是占空间,配置更新维护没有CrossOver快,因此这些均不在介绍。

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

安装

开源版wine的安装

安装过程建议如下

1
2
3
4
5
6
7
# 请不要用brew安装,而是直接到官网安装pkg,因为brew更新较慢,而且没有“用Wine打开”这个菜单
# https://dl.winehq.org/wine-builds/macosx/download.html

# 安装wine包管理(自动帮你下载与执行注册表)
# 这里有一堆现成的APP
# https://github.com/Winetricks/winetricks/blob/master/files/verbs/all.txt
brew install winetricks

此外可以参考ArchLinux的安装过程

收费版CrossOver的安装

直接点击安装即可。

公共的配置

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

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

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
function wine_common(){
function lk_folder(){
echo "link $1 to $2"
mkdir -p $1
mkdir -p $2
ln -sfn "$1" $2
}
export WINEARCH=win64
export WINEPREFIX=$1
mkdir -p $WINEPREFIX
# 防止程序信息丢失,直接放在Mac下
v_user="${WINEPREFIX}/drive_c/users/$USER/"
lk_folder "${HOME}/Documents/Application Data/" $v_user
lk_folder "${HOME}/Documents/AppData/" $v_user
lk_folder "${HOME}/Documents/Local Settings/" $v_user
# configurate path
export PATH=$(echo $PATH|tr ':' '\n'|grep -v wine|grep -v CrossOver|tr '\n' ':')
export PATH=$PATH:$2
# configurate language
export LC_ALL="zh_CN.UTF-8";
cd $v_user
# 可以看出收费版的Wine信息输出是不一样的
wine --version
}
function switch_wine(){
WINE_BIN="/Applications/Wine Stable.app/Contents/Resources/wine/bin"
WINEPREFIX=$HOME/.wine
wine_common ${WINEPREFIX} ${WINE_BIN}
}
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
ln -sfn $v_users/crossover/ $v_users/$USER
wine_common ${WINEPREFIX} ${WINE_BIN}
}
switch_wine

这样同时安装的优点是可以随意切换env(商业的4.x与Dev的4.x),缺点是PATH操作比较丑

使用

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

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

For DirectX Game

到此为止,大部分非3D游戏应该都可以运行了。但是要强调一下,Mac下渲染默认是基于OpenGL实现的,因此性能与虚拟机也好不到哪去,不要有过高期望。

我个人不推荐安装这里的任何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下,DX10通过如下实现 Metal -> MoltenVK -> Vulkan -> DX10。但是目前支持并不完善,所有DX10与Vulkan都没有实现(dxvk)。同时由于Mac本身性能就一般,所以这里就不折腾了。

而在CrossOver下,商业版支持了部分DX10+的API,但是总体上只可以看成一个Stub,并非完全支持。

关于.NetFrameWork

net框架是向前兼容的,理论上安装最新的就可以的,但是我个人建议需要哪个就安装哪个,因为winetricks的依赖管理很复杂,不要强求最新的

一般用Wine自己实现的Net框架Mono是最方便的,注意版本号以此文件实时为准

1
2
wine uninstaller --remove '{E45D8920-A758-4088-B6C6-31DBB276992E}'
wine msiexec /i wine-mono-4.7.5.msi

除此之外,还有如下实现方式

1
2
# install Net 3.5
winetricks dotnet35

而在CrossOver下会自动帮你安装好mono

结论

与虚拟机的对比

Wine方案(包括CrossOver)总体来说,在Mac下使用范围还是有限,适合喜欢折腾的用户。因为Mac下非游戏类的软件均有替代方案,甚至比Windows下功能更强;而游戏由于OpenGL先天性能不行导致只是比虚拟机性能略高,但是散热更低(风扇不会太响),可能有渲染错位,FS性能比虚拟机弱(可能是运行时转换DLL导致,需要PreLoader)的问题。当然这些是与付费软件Parallels对比的,有失公平。

此外还有一点,Wine方案信息安全完全不够,权限与普通用户一致,没有做到FS/Network隔离,因此建议只运行可信来源的软件

因此在目前场景下,Wine比较适合中小型软件/游戏的使用,以及白名单中的应用。最佳方案还是大硬盘+安全虚拟机综合效果更好

Wine各个版本的对比

普通软件使用任何Wrapper均可运行

游戏此处有点玄学了,目前3与4并拉不开差距,我个人测试如下(均安装了官网DX9)

1
PortingKit/Wine4/Wine3(性能强,兼容弱) > CrossOver > Wine

需要等到Wine4支持Mac下的Meta绘图框架后,性能才会拉开明显的差距

其它配置

主题

配置主题(底层是WinXP实现),可选操作,强迫症专用

建议配置稳定后再安装,具体可以在Nick-zone下载

1
2
3
# 主题文件夹
mkdir -p $HOME/.wine/drive_c/windows/Resources/Themes
# 下载拷贝到themes目录

字体

解决乱码问题,网上有直接替换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

详见此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 ${WINEPREFIX}(慎重执行)即可,winetricks下载的缓存在~/.cache/winetricks中,不会重复下载
  • Q: 还是无法运行某程序
  • A: 尝试下载使用旧版,通过二分法定位

其它资源