12.5 Wine
Wine,即 Wine Is Not an Emulator(Wine 不是模拟器),严格来说是一个软件翻译层。通过它可以在 FreeBSD(以及其他系统)上安装和运行为 Windows 编写的软件。
Wine 的工作机制是拦截系统调用,也就是软件对操作系统的请求,并将这些调用从 Windows 的形式转换为 FreeBSD 能理解的形式。如有需要,它还会将系统响应翻译为 Windows 软件所预期的格式。因此,在某些方面,它模拟了一个 Windows 环境,因为它提供了 Windows 应用程序所期望的许多资源。
然而,Wine 并不是传统意义上的模拟器。许多这类解决方案是通过软件进程模拟整个独立的计算机,以代替实际的硬件。虚拟化(比如通过 port emulators/qemu 提供的方式)正是这种方式。此方法的优势之一是可以在虚拟机中安装完整的目标操作系统,对应用程序来说,该环境与物理主机没有区别,因此大多数软件能正常运行。但这种方式的缺点在于,用软件模拟硬件本质上比真实硬件要慢。用软件构建的计算机(称为 guest 客体系统)需要占用真实主机(称为 host 宿主系统)的资源,并在运行期间持续占用这些资源。
当 Wine 运行一款 Windows 可执行文件时,涉及以下两个过程:
- 其一,Wine 实现了一个模拟多种版本 Windows 的环境。例如,若某个应用程序请求访问内存等资源,Wine 会提供一个内存接口,该接口(就应用程序而言)与 Windows 一致。
- 其二,当该应用程序利用此接口时,Wine 会将请求的内存空间转换为与宿主系统兼容的形式。当应用程序检索该数据时,Wine 会从宿主系统中获取并将其返回给 Windows 应用程序。
相比之下,Wine 对系统资源的消耗要轻得多。它可以在运行时即时翻译系统调用,虽然难以达到原生 Windows 环境的速度,但可以非常接近。另一方面,Wine 需要不断追赶变化中的目标,即不断演变的系统调用和功能支持。因此,有些应用程序在 Wine 上可能运行异常、无法运行甚至无法安装。
总体而言,Wine 是另一种可选方案,可用于在 FreeBSD 上运行特定的 Windows 程序。若运行成功,Wine 可作为首选方案,既提供良好体验,又不会额外消耗宿主 FreeBSD 系统的资源。
以下内容仅在物理机上测试通过。Wine 依赖 DRM 驱动提供图形硬件加速,虚拟机环境下可能无法正常运行,通常会提示不支持 3D 加速。此外,虚拟机可能无法完整支持某些 CPU 指令集,同样会导致程序启动失败。
12.5.1 安装 Wine
使用 pkg 包管理器安装 Wine 及相关组件:
# pkg install wine wine-gecko wine-mono注意
无论使用 pkg 还是 Ports 安装 Wine,都只会安装 64 位版本。要支持 32 位 Windows 程序,还需要额外运行
pkg32.sh脚本安装 32 位组件(见下文)。推荐使用 pkg 安装以节省编译时间。
注意
建议安装 wine-gecko,否则首次运行
winecfg时将弹出提示要求安装 Gecko 引擎。wine-gecko 为依赖 Internet Explorer 或 HTML 渲染的 Windows 程序提供支持。
切换到普通用户后,使用 pkg32 脚本安装 32 位 Wine 及 Mesa DRI 图形驱动支持:
$ /usr/local/share/wine/pkg32.sh install wine mesa-dri12.5.1.1 软件包说明
| 程序 | 说明 |
|---|---|
| wine | Wine 主程序 |
| wine-gecko | Wine 项目基于 Firefox 的 Gecko 浏览器内核实现的 Internet Explorer 组件 |
| wine-mono | Mono 提供了对 .NET Framework 4.8 及更低版本的支持 |
注意
若不执行此步骤,将无法支持 32 位 Windows 程序。其中,mesa-dri 提供了显卡硬件加速支持。
12.5.2 配置显卡硬件加速
请参考显卡相关章节配置硬件加速。
12.5.3 配置 Wine
以下操作均在普通用户权限下进行。
使用指定的 WINEPREFIX 目录启动 winecfg 配置工具:
$ WINEPREFIX=$HOME/test wine winecfg技巧
WINEPREFIX是一个目录集合,用于存放 Wine 的相关配置文件及模拟的 Windows 系统文件。设置不同的WINEPREFIX即可共存多个配置环境。

如果出现错误提示,或者命令执行后没有任何响应,可执行以下操作来删除默认的 Wine 配置目录,重置 Wine 环境:
$ rm -rf ~/.wine然后执行以下命令启动 Wine 配置工具,使用默认的 WINEPREFIX:
$ wine winecfg或者执行以下命令:
$ rm -rf $HOME/test # 删除指定的 WINEPREFIX 目录,用于重置环境
$ WINEPREFIX=$HOME/test wine winecfg # 使用新的 WINEPREFIX 目录启动 winecfg 配置工具目录结构:
~/
├── .wine/ # 默认 Wine 配置目录
└── test/ # 自定义 Wine 配置目录(WINEPREFIX)12.5.4 测试运行 WinSCP(32 位 Windows 程序)
技巧
不需要为 32 位程序单独创建 WINEPREFIX。目前,32 位和 64 位程序可以共存在同一个 WINEPREFIX 中。
由于大多数用户需要运行 32 位 Windows 程序,下面通过示例程序检查这一需求是否得到满足:
$ file winscp.exe # 查看 winscp.exe 的文件类型
winscp.exe: PE32 executable for MS Windows 6.01 (GUI), Intel i386, 11 sections使用 Wine 安装运行可执行文件 winscp.exe:
$ wine /home/ykla/winscp.exe


技巧
安装成功后,系统将生成对应的图标。测试表明,双击该图标可正常运行。
12.5.5 Winetricks
Winetricks 是一款脚本(约两万行代码),封装了许多与 Wine 相关的实用功能,例如安装和卸载软件、安装字体等,可规避许多常见的 Wine 问题。
12.5.5.1 安装 Winetricks
使用 pkg 安装:
# pkg install winetricks使用 Ports 安装:
# cd /usr/ports/emulators/winetricks/
# make install clean12.5.5.2 使用 Winetricks 安装中文字体
注意
下载字体时可能需要连接 GitHub,请确保网络连接正常。
启动 Winetricks 工具,用于安装和配置 Wine 依赖组件:
$ winetricks技巧
可忽略终端中输出的有关 64 位和 32 位 Wine 的警告信息:
warning: You are using a 64-bit WINEPREFIX. Note that many verbs only install 32-bit versions of packages. If you encounter problems, please retest in a clean 32-bit WINEPREFIX before reporting a bug.



此处可尝试安装列表中的最后两个中文字体。安装完成后,大多数程序可正常显示中文。
12.5.6 故障排除与未竟事宜
12.5.6.1 为 Wine 界面设置中文
该问题尚待进一步验证和解决。