Wine
Wine 是一个兼容层,能够运行 Microsoft Windows 应用程序在 类 Unix 操作系统 上。
Wine 不使用 模拟,二进制翻译,或 虚拟化 来运行。相反,Wine 提供了一个 Win32 API 的实现,供需要它的应用程序使用。由于 Wine 对 Win32 API 的实现自然会与 Microsoft Windows 提供的有所不同,因此应用程序在使用 Wine 时可能会遇到行为、兼容性或性能方面的问题。
- Wine **不与**你的系统隔离:如果你用你的用户账户可以访问文件或资源,那么在 Wine 中运行的程序**也可以**——请参阅 #在单独的用户账户下运行 Wine 和 Security#Sandboxing applications 以了解可能的预防措施。
- Wine 也可以运行 恶意软件——请参阅 Wine FAQ on Malware compatibility。
安装
Wine 可以通过 wine (开发版)、wine-stableAUR (稳定版) 或 wine-staging (测试版) 包进行安装。 Wine Staging 是 Wine 的一个打过补丁的版本,其中包含尚未集成到稳定版或开发版中的错误修复和功能。
如果使用 wine-stableAUR,请参阅 #使用 32 位 Wine 构建 以了解其他要求。
可选依赖
Wine 有许多可选依赖,虽然基础应用程序可能不需要它们,但为了提供声音、3D 图形、视频播放等功能,应该安装它们。
声音
默认情况下,运行 Wine 应用程序时可能会出现声音问题。确保在 winecfg 中只选择了一个声音设备。
MIDI 支持
MIDI 在 90 年代的视频游戏音乐中曾是一个非常流行的系统。如果您在尝试旧游戏,音乐无法立即播放的情况并不少见。Wine 拥有出色的 MIDI 支持。但是,您首先需要在您的主机系统上使其正常工作,如 MIDI 中所述。最后但同样重要的是,您需要确保 Wine 使用正确的 MIDI 输出,尽管默认情况下可能不需要额外的配置。
要在游戏中播放 MIDI 曲目,请安装 Microsoft 的 General MIDI DLS Collection、DirectSound 和 DirectMusic,方法是运行 winetricks gmdls dsound directmusic,或者如果您使用的是 Bottles,则可以在其依赖管理器中搜索它们。
其他依赖
某些应用程序可能需要额外的软件包 [1]。
- 要获得加密支持,请安装 gnutls
- 要获得操纵杆和游戏手柄支持,请安装 sdl2-compat
- 要播放媒体,请安装 gst-plugins-base, gst-plugins-good, gst-plugins-bad, gst-plugins-ugly 和 ffmpeg
- 要获得 NTLM 身份验证,请安装 samba
前缀内的依赖
除了系统依赖之外,许多程序还需要额外的字体和 DLL 文件安装到 Wine 前缀中 [2]。为了满足这些依赖,您可以使用 Winetricks,一个简单的“包管理器”,其中每个 verb 都会安装某项内容或应用一个配置调整。使用 Winetricks 有两种方式:
由于依赖之间的冲突,您可能无法创建“完美”的 Windows 安装来运行所有内容 [3] [4]。相反,您应该将前缀视为可丢弃的(除非它们包含重要的配置或数据),并为具有不同依赖关系的程序使用独立的前缀。您可以使用 #WINEPREFIX 环境变量来控制 verb 操作在哪个前缀上执行。
确定程序所需 verb 可能需要大量的试错。查看 Bottles 依赖页面 以了解一些更常见的依赖项,以及以下特定于程序的资源:
- Wine Application Database。官方资源,但已过时,可能维护不如其他资源。
- Lutris 网站。如果您正在尝试运行一个在此网站上出现的游戏,您可以点击下拉菜单,然后选择 View install script 查看 Lutris 使用了哪些 Winetricks verb。
- Bottles 程序存储库。规模较小,但不仅限于游戏。
- ProtonDB。虽然 Proton 的兼容性与 Wine 不同(并且您可能应该只使用 Proton,如果您正在访问此网站),但用户评论的 verb 可能有用。
- 您还可以查阅与 proton-ge-custom 一起提供的、快速发展的 protonfixes 工具的源代码,但请注意,它假定存在额外的 Proton 和 GE 补丁来修复游戏。
如果您发现自己花费大量时间来管理游戏的前缀,那么使用一个为您处理这些问题的第三方应用程序可能会更简单。
第三方应用程序
这些应用程序有自己的社区和网站,**不**由主要的 Wine 社区支持。请参阅 Wine Wiki 以获取更多详细信息。
- Bottles — 基于 GTK 的图形化前缀和运行器管理器。
- CrossOver — Wine 的官方付费版本,提供图形界面和更全面的最终用户支持。
- Lutris — 适用于所有类型游戏的游戏启动器,包括 Wine 游戏(带前缀管理)、原生 Linux 游戏和模拟器。
- PlayOnLinux — Wine 的图形化前缀管理器。包含用于辅助程序安装和配置的脚本。
- PyWinery — 简单的图形化 Wine 前缀管理器。
- Q4Wine — Wine 的图形化前缀管理器。可以将 Qt 主题导出到 Wine 配置中以实现更好的集成。
- WINEgui — 一个用户友好的 WINE 图形界面。
配置
Wine 的配置通常通过以下方式完成:
- control — Wine 对 Windows 控制面板 的实现,可以通过运行
wine control来启动; - regedit — Wine 的 注册表 编辑工具,可以通过运行
regedit来启动——另请参阅 Useful Registry Keys; - winecfg — Wine 的一个 GUI 配置工具,可以通过运行
winecfg来启动。
请参阅 Programs 获取完整列表。
WINEPREFIX
默认情况下,Wine 将其配置文件和安装的 Windows 程序存储在 ~/.wine 中。这个目录通常被称为“Wine 前缀”或“Wine 瓶”。每当您运行 Windows 程序或 Wine 的捆绑程序(如 winecfg)时,它都会被自动创建/更新。前缀目录还包含一个树形结构,您的 Windows 程序会将其视为 C:(C 盘)。
您可以使用 WINEPREFIX 环境变量来覆盖 Wine 使用前缀的位置。如果您想为不同的 Windows 程序使用单独的配置,这非常有用。当使用新的 Wine 前缀运行程序时,Wine 会自动创建一个带有裸露 C 盘和注册表的目录。
例如,如果您运行一个程序,使用 env WINEPREFIX=~/.win-a wine program-a.exe,而运行另一个程序,使用 env WINEPREFIX=~/.win-b wine program-b.exe,则这两个程序将各自拥有一个独立的 C 盘和独立的注册表。
要创建一个默认前缀,而不运行 Windows 程序或其他 GUI 工具,您可以使用:
$ env WINEPREFIX=~/.customprefix wineboot -u
字体
如果 Wine 应用程序的字体无法读取或缺失,则可能是您没有安装任何字体。为了轻松地链接所有系统字体,使其可从 wine 访问
$ cd ${WINEPREFIX:-~/.wine}/drive_c/windows/Fonts && for i in /usr/share/fonts/**/*.{ttf,otf}; do ln -s "$i"; done
Wine 使用 FreeType 渲染字体,并且 FreeType 的默认设置在几个版本前已更改。尝试在使用 Wine 运行程序时使用以下 环境变量:
FREETYPE_PROPERTIES="truetype:interpreter-version=35"
另一种选择是将 Microsoft 的 TrueType 字体安装到您的 wine 前缀中。如果这没有帮助,请先尝试运行 winetricks corefonts,然后作为最后的手段运行 winetricks allfonts。
运行这些程序后,停止所有 Wine 服务器并运行 winecfg。现在字体应该可以正常显示了。
如果字体看起来有些模糊,请运行以下命令更改 Wine 注册表中的一个设置:
$ wine reg add 'HKEY_CURRENT_USER\Software\Wine\X11 Driver' /v ClientSideWithRender /t REG_SZ /d N
对于高分辨率显示器,您可以在 winecfg 中调整 DPI 值。
另请参阅 Font configuration#Applications without Fontconfig support。
启用字体平滑
一种改善 wine 字体渲染的好方法是启用 cleartype 字体平滑。要启用“子像素平滑 (ClearType) RGB”:
/tmp/fontsmoothing.reg
REGEDIT4 [HKEY_CURRENT_USER\Control Panel\Desktop] "FontSmoothing"="2" "FontSmoothingOrientation"=dword:00000001 "FontSmoothingType"=dword:00000002 "FontSmoothingGamma"=dword:00000578 EOF
$ WINE=${WINE:-wine} WINEPREFIX=${WINEPREFIX:-$HOME/.wine} $WINE regedit /tmp/fontsmoothing.reg 2> /dev/null
如果您已安装 winetricks,有一种更简单的方法可以做到这一点:
winetricks fontsmooth=rgb
有关更多信息,请查看 原始答案。
桌面启动器菜单
当 Windows 应用程序安装程序创建快捷方式时,Wine 会创建一个 .desktop 文件。在 Arch Linux 中,这些文件的默认位置是:
- 桌面快捷方式放在
~/Desktop - 开始菜单快捷方式放在
~/.local/share/applications/wine/Programs/
/usr/share/applications 中。请参阅 WineHQ 错误 11112。wine winemenubuilder 可能会有所帮助。为 Wine 工具创建菜单项
默认情况下,Wine 的安装不会为 Wine 自带的软件(例如 winecfg、winebrowser 等)创建桌面菜单/图标。这可以通过安装 wine-installerAUR 或 wine-installer-gitAUR 元软件包(后者没有额外的依赖项)来实现,否则这些说明将为这些应用程序添加条目。
首先,使用 Wine 安装一个 Windows 程序来创建基础菜单。创建基础菜单后,您可以在 ~/.local/share/applications/wine/ 中创建以下文件:
wine-browsedrive.desktop
[Desktop Entry] Name=Browse C: Drive Comment=Browse your virtual C: drive Exec=wine winebrowser c: Terminal=false Type=Application Icon=folder-wine Categories=Wine;
wine-uninstaller.desktop
[Desktop Entry] Name=Uninstall Wine Software Comment=Uninstall Windows applications for Wine Exec=wine uninstaller Terminal=false Type=Application Icon=wine-uninstaller Categories=Wine;
wine-winecfg.desktop
[Desktop Entry] Name=Configure Wine Comment=Change application-specific and general Wine options Exec=winecfg Terminal=false Icon=wine-winecfg Type=Application Categories=Wine;
并在 ~/.config/menus/applications-merged/ 中创建以下文件:
wine.menu
<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"
"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">
<Menu>
<Name>Applications</Name>
<Menu>
<Name>wine-wine</Name>
<Directory>wine-wine.directory</Directory>
<Include>
<Category>Wine</Category>
</Include>
</Menu>
</Menu>
如果这些设置导致图标丑陋/不存在,这意味着您启用的图标集中没有这些启动器的图标。您应该用图标的显式位置替换图标设置。点击启动器属性菜单中的图标会产生相同效果。一个支持这些快捷方式的出色图标集是 gnome-colors-icon-themeAUR。
删除菜单项
Wine 创建的菜单项位于 ~/.local/share/applications/wine/Programs/。删除程序的 .desktop 条目即可从菜单中移除该应用程序。
除了删除 Wine 绑定的不必要扩展,请执行以下命令: [6]
$ rm ~/.local/share/mime/packages/x-wine* $ rm ~/.local/share/applications/wine-extension* $ rm ~/.local/share/icons/hicolor/*/*/application-x-wine-extension* $ rm ~/.local/share/mime/application/x-wine-extension*
有时,您还应该从 /.config/menus/ 中删除 wine-*.menu 文件,以完全从 KDE 的 Wine 子菜单中移除项目。
外观
可以下载一个类似 XP 外观的主题。要安装它,请参阅 此上游 wiki 文章。最后,使用 winecfg 选择它。
drive_c/Windows/Resources/Themes 的 Zune 文件夹和 Zune.theme 文件复制到您常规前缀的相同位置。Wine staging 用户可能更愿意尝试在 winecfg 的 Staging 部分启用“Enable GTK3 Theming”选项,以获得与当前 GTK 主题匹配的主题。
打印
为了在 wine 应用程序(例如 MS Word)中使用已安装的打印机(本地和网络),请安装 libcups 包,重启 wine (wineboot) 并重新启动您的 wine 应用程序。
网络
安装后,可能需要 安装 gnutls 包,以使执行 TLS 或 HTTPS 连接的应用程序正常工作。
对于 ICMP (ping),Wine 可能需要如 WineHQ FAQ 中所述的网络访问权限。
# setcap cap_net_raw+epi /usr/bin/wine-preloader
如果在此之后出现问题(例如未处理的异常或特权指令),请通过以下方式移除:
# setcap -r /usr/bin/wine-preloader
用法
请参阅 Wine User's Guide 以获取关于 Wine 用法的通用信息。
请参阅 Wine Application Database (AppDB) 以获取关于 Wine 中特定 Windows 应用程序的附加信息。
Wayland
Wayland 图形驱动程序默认启用,但如果两者都可用,X11 驱动程序仍然优先 [7]。
要强制在这种情况下使用 Wayland 驱动程序,请确保 DISPLAY 环境变量未设置:
$ env -u DISPLAY wine example.exe
停止运行 Wine
停止启动的进程,例如使用 Ctrl+Z 停止 wine 或使用 Ctrl+C 停止 wineconsole,可能会导致进程在后台继续运行。例如,请参阅:
$ ps -xo pid,cmd
PID CMD
297 -bash
933 /usr/bin/wineserver
939 C:\windows\system32\services.exe
942 C:\windows\system32\winedevice.exe
950 C:\windows\system32\explorer.exe /desktop
954 C:\windows\system32\winedevice.exe
965 C:\windows\system32\plugplay.exe
977 C:\windows\system32\svchost.exe -k LocalServiceNetworkRestricted
984 C:\windows\system32\rpcss.exe
997 mbserver.exe
1017 start.exe /exec
1019 C:\windows\system32\conhost.exe --unix --width 169 --height 40 --server 0x10
1021 Z:\home\wineuser\mbserver.exe
1030 ps -xo pid,cmd
使用 wineserver -k 命令可以一次性停止所有正在运行的 wine 和 wineconsole 进程。例如:
$ wineserver -k 15
此命令依赖于 WINEPREFIX,因此当使用自定义 Wine 前缀时,请运行:
$ WINEPREFIX=~/wine/my-prefix wineserver -k
优雅地结束上面示例中两个进程的等效命令是:
$ kill 997 1021
32 位 Windows 应用程序
上游 Wine 支持三种在 64 位系统上运行 32 位 Windows 应用程序的方法:
WINEARCH=win32,它将 Wine 作为 32 位 Linux 应用程序在一个 32 位前缀中运行。- “旧 WoW64”,它将 Wine 作为 32 位 Linux 应用程序在一个 64 位前缀中运行。这允许 32 位和 64 位应用程序共存于同一个前缀中。
- “新 WoW64”。它将 Wine 作为 64 位 Linux 应用程序在一个 64 位前缀中运行。32 位 Windows 应用程序通过转译到 64 位 Wine 代码来支持。这最类似于 Windows 上的 WoW64。
自 Wine 10.8-2 起,Arch Linux 启用了新的 WoW64 模式。大多数 32 位 Windows 应用程序无需额外步骤即可安装和运行。
使用 32 位 Wine 构建
虽然新的 WoW64 模式对大多数应用程序都有效,但它有一些限制:
- 任何现有的 32 位
WINEPREFIX将不再工作,应重新创建为 64 位。然后可以在其中安装 32 位应用程序。 - 新 WoW64 模式的一个已知限制是,对于直接使用 OpenGL 的 32 位应用程序,性能会有所下降。(Bug 报告)。
- 一些 32 位 Windows 应用程序在 WoW64 模式下(无论是 Wine 还是 Windows)都无法正常工作。
作为一种变通方法,wine32AUR 是一个可选的 wine 包,它提供 Wine 的 32 位构建。 wine-stableAUR 包目前也提供 32 位构建。这些包要求主机系统安装 32 位版本的库,以便 Wine 能够运行 32 位应用程序。下面列出了一些常见的 32 位库。在安装此页面上列出的其他库(例如 #其他依赖 中列出的库)时,如果您运行的是 32 位应用程序,还应安装相应的 lib32- 包。
图形驱动
您需要安装 32 位版本的 OpenGL 图形驱动程序。
当 Wine 在您的终端窗口中报告以下内容时,这可能是您的驱动程序不足或配置不当的一个好迹象:
Direct rendering is disabled, most likely your OpenGL drivers have not been installed correctly
声音
安装您想使用的音频驱动程序的正确包:
- 对于 ALSA,请安装 lib32-alsa-lib 和 lib32-alsa-plugins
- 对于 PulseAudio,安装 lib32-libpulse
- 对于 PipeWire,安装 lib32-pipewire 以及以下任一:
- pipewire-pulse 和 lib32-libpulse,以使用 PulseAudio 作为前端。
- pipewire-alsa, lib32-alsa-lib, 和 lib32-alsa-plugins,以使用 ALSA 作为前端。
- 对于 OSS,安装 lib32-alsa-oss
如果 winecfg 仍然无法检测到音频驱动程序(Selected driver: (none)),请 通过注册表进行配置。例如,要提供对声音硬件(声音播放和麦克风)的完全访问权限:打开 regedit,查找键 HKEY_CURRENT_USER > Software > Wine > Drivers,添加一个名为 Audio 的字符串,并将其值设置为 alsa。此外,重新创建前缀可能也有帮助。
WINEARCH
如果支持,您可以使用 WINEARCH 和 WINEPREFIX 来创建独立的 win32 和 win64(旧的 WoW64)环境。
$ WINEARCH=win32 WINEPREFIX=~/win32 winecfg $ WINEPREFIX=~/win64 winecfg
您还可以将 WINEARCH 与其他 Wine 程序结合使用,例如 winetricks(以 Steam 为例)。
WINEARCH=win32 WINEPREFIX=~/.local/share/wineprefixes/steam winetricks steam
要查看现有前缀的架构,可以检查其注册表文件。下面的命令读取 ~/.wine 前缀的系统注册表,并根据架构类型返回 #arch=win32 或 #arch=win64。
$ grep '#arch' ~/.wine/system.reg
技巧与提示
Wineconsole
通常您可能需要运行 .exe 文件来修补游戏文件,例如旧游戏的宽屏模组,而通过 Wine 正常运行 .exe 文件可能没有任何效果。在这种情况下,您可以打开终端并运行以下命令:
$ wineconsole cmd
然后导航到目录并在那里运行 .exe 文件。
Winetricks
Winetricks 是一个脚本,允许用户安装运行 Windows 程序所需的底层要求。可安装的组件包括 DirectX 9.x、MSXML(Microsoft Office 2007 和 Internet Explorer 所需)、Visual Runtime 库等。
安装 winetricks 包(或备用 winetricks-gitAUR)。然后运行它:
$ winetricks
要使用 GUI,您可以 安装 zenity (GTK) 或 kdialog (Qt)。
性能
CSMT
CSMT 是 Wine 使用的一项技术,它为 OpenGL 调用使用单独的线程,从而显著提高性能。自 Wine 3.2 起,CSMT 默认启用。
请注意,CSMT 实际上可能会降低某些应用程序的性能——如果发生这种情况,可以通过运行 wine regedit 并将 HKEY_CURRENT_USER -> Software > Wine > Direct3D > csmt 的 DWORD 值设置为 0x00(禁用)来禁用它。
更多信息
- Phoronix 论坛讨论,涉及 CSMT 开发者 Stefan Dösinger。
强制游戏使用 OpenGL 模式
某些游戏可能有一个 OpenGL 模式,该模式可能比其默认的 DirectX 模式性能更好。虽然启用 OpenGL 渲染的步骤是特定于应用程序的,但许多游戏接受 -opengl 参数。
$ wine /path/to/3d_game.exe -opengl
当然,您应该参考您的应用程序文档和 Wine 的 AppDB 以获取此类特定于应用程序的信息。
DXVK
DXVK 是 DirectX 8、9、10 和 11 在 Vulkan 上的实现。在大多数游戏中,它在性能和兼容性方面都优于 WineD3D 驱动程序。它不支持 DirectX 12,请改用 #VKD3D-Proton。DXVK 和 VKD3D-Proton 可以并且应该一起安装,以便支持所有 DirectX 版本。
要安装最新版本,请使用 #Winetricks。
$ WINEPREFIX=your-prefix winetricks dxvk
您还可以指定要安装的版本。例如,要安装具有 宽松要求的 DXVK 版本,请使用:
$ WINEPREFIX=your-prefix winetricks dxvk1103
或者,安装 dxvk-mingwAUR 或 dxvk-binAUR。然后运行以下命令在您的 Wine 前缀(默认为 ~/.wine)中激活它:
$ WINEPREFIX=your-prefix setup_dxvk install --symlink
在使用 DXVK 的双显卡设置中,Wine 会优先选择独立显卡。在笔记本电脑上为了省电,这可以被覆盖。
$ VK_DRIVER_FILES=/usr/share/vulkan/icd.d/your_driver.json wine executable
VKD3D-Proton
VKD3D-Proton 是 VKD3D 的一个分支,旨在通过 Vulkan 实现完整的 Direct3D 12 API。该项目为 Proton 中的 Direct3D 12 支持提供了开发支持,从而提高了 DirectX 12 游戏的性能和兼容性。
要安装最新版本,请使用 #Winetricks。
$ WINEPREFIX=your-prefix winetricks vkd3d
或者,安装 vkd3d-proton-mingwAUR 或 vkd3d-proton-binAUR。然后运行以下命令在您的 Wine 前缀(默认为 ~/.wine)中激活它:
$ WINEPREFIX=your-prefix setup_vkd3d_proton install --symlink
xSync
一些游戏大量使用 Windows 同步对象来运行多线程工作负载,Wine 能够通过 wineserver 提供用户空间实现,但大多数情况下,默认实现会对 CPU 密集型场景产生重大性能影响。
目前有 3 种可用的选项可以提高性能,您应该一次只使用其中一种。
- ESync - 基于 eventfd 的用户空间同步。
- 不包含在 wine 中。包含在 wine-staging 中,版本高达 10.15[8],但默认不启用。
- 在 Proton 中默认启用,除非 FSync 可用。
- FSync - 基于 Futex2 的内核实现同步,应比 ESync 具有更好的性能。
- 如果使用 5.16 及更高版本的内核,则可用。
- 不包含在 wine 中:您需要一个已打补丁的版本。
- 在 Proton 中默认启用。
- NTSync - 内核实现同步。与 ESync 和 FSync 相比,NTSync 更能模拟 MS Windows NT 内核实现的行为,性能与 FSync 相当或更流畅。
- 如果使用 6.14 及更高版本的内核,则可用。
- NTSync 已在 Wine 10.16 中实现,但未包含在 Proton 中,因为 Proton 的最新版本基于 Wine 10.0 稳定版,该版本尚未包含 NTSync。
- Proton-TKG 可用于需要包含 NTSync 的 Proton 版本。
要启用 ESync,请在运行 Wine 之前 导出以下 环境变量:
WINEESYNC=1
或者用于已打补丁的 Wine 的 FSync:
WINEFSYNC=1
NTSync 不需要设置环境变量,而是会在 ntsync 内核模块加载时自动使用。 wine 和 wine-staging 附带一个文件用于 在启动时加载模块,否则您可以手动创建。
/etc/modules-load.d/ntsync.conf
ntsync
MangoHud 可以在游戏中显示 ESync、FSync 或 NTSync 的存在或不存在,如果您在其配置文件中启用了 winesync 指示。
取消注册现有的 Wine 文件关联
默认情况下,Wine 会接管许多格式的默认应用程序。某些格式(例如 vbs 或 chm)是 Windows 特有的,用 Wine 打开它们可能很方便。然而,其他格式(例如 gif、jpeg、txt、js)在 Wine 模拟的简陋版 Internet Explorer 和记事本中打开可能会令人烦恼。
Wine 的文件关联存储在 ~/.local/share/applications/ 中,形式为 wine-extension-extension.desktop 文件。删除与您要取消注册的扩展名对应的文件。或者,要删除所有 wine 扩展名:
$ rm -f ~/.local/share/applications/wine-extension*.desktop $ rm -f ~/.local/share/icons/hicolor/*/*/application-x-wine-extension*
接下来,删除旧缓存:
$ rm -f ~/.local/share/applications/mimeinfo.cache $ rm -f ~/.local/share/mime/packages/x-wine* $ rm -f ~/.local/share/mime/application/x-wine-extension*
然后,更新缓存:
$ update-desktop-database ~/.local/share/applications $ update-mime-database ~/.local/share/mime/
请注意,Wine 仍然会创建新的文件关联,甚至会在应用程序再次设置文件关联时重新创建它们。
阻止 Wine 创建文件类型关联
/usr/share/wine/wine.inf。此方法可阻止创建文件类型关联,但保留 XDG .desktop 文件的创建(您可能会在菜单等地方看到它们)。
如果您想阻止 wine 通过 winecfg 创建文件类型关联,您需要取消勾选“桌面集成”选项卡下的“管理文件关联”复选框。请参阅 Wine FAQ。
要通过注册表进行相同的更改,请在以下位置添加名为 Enable、值为 N 的字符串:
HKEY_CURRENT_USER\Software\Wine\FileOpenAssociations
您可能需要先创建 FileOpenAssociations 键!
要通过命令行进行此更改,请运行以下命令:
$ wine reg add "HKEY_CURRENT_USER\Software\Wine\FileOpenAssociations" /v Enable /d N
如果您想为新 Wine 前缀默认应用此设置,请编辑 /usr/share/wine/wine.inf,并在 [Services] 部分下添加此行,例如:
HKCU,"Software\Wine\FileOpenAssociations","Enable",2,"N"
为防止包升级覆盖已修改的文件,请创建一个 pacman hook 以自动进行更改:
/etc/pacman.d/hooks/stop-wine-associations.hook
[Trigger] Operation = Install Operation = Upgrade Type = Path Target = usr/share/wine/wine.inf [Action] Description = Stopping Wine from hijacking file associations... When = PostTransaction Exec = /bin/sh -c '/usr/bin/grep -q "HKCU,\"Software\\\Wine\\\FileOpenAssociations\",\"Enable\",2,\"N\"" /usr/share/wine/wine.inf || /usr/bin/sed -i "s/\[Services\]/\[Services\]\nHKCU,\"Software\\\Wine\\\FileOpenAssociations\",\"Enable\",2,\"N\"/g" /usr/share/wine/wine.inf'
有关更多信息,请参阅 Pacman#Hooks。
隐式地使用 Wine 执行 Windows 二进制文件
wine 包安装了一个 binfmt 文件,该文件允许您直接运行 Windows 程序,例如 ./myprogram.exe 将会像您输入 wine ./myprogram.exe 一样启动。服务默认在启动时启动;如果您在安装 Wine 后尚未重启,可以 启动 systemd-binfmt.service 以立即使用它。
双显示器,不同分辨率
安装 libxinerama 可能会修复 Wine 的双显示器问题(例如,在最右侧或最底部的显示器上的应用程序按钮和菜单无法点击,该区域的应用程序界面无法重绘,鼠标光标离开应用程序区域后状态卡住)。
刻录光盘
要刻录 CD 或 DVD,您需要加载 sg 内核模块。
正确挂载光盘镜像
某些应用程序会检查光盘是否在驱动器中。它们可能仅检查数据,在这种情况下,在 winecfg 中将相应路径配置为 CD-ROM 驱动器可能就足够了。但是,其他应用程序会查找名称和/或序列号,在这种情况下,必须使用这些特殊属性挂载镜像。
一些虚拟驱动器工具无法处理这些元数据,例如基于 fuse 的虚拟驱动器(例如 Acetoneiso)。CDemu 将正确处理它。
在游戏中显示 FPS 覆盖
Wine 包含一个内置的 FPS 监视器,如果设置了环境变量 WINEDEBUG=fps,它适用于所有图形应用程序。这会将帧率输出到 stdout。您可以借助 osd_cat(来自 xosd 包)将 FPS 显示在窗口顶部。请参阅 winefps.sh 以获取辅助脚本。
在单独的用户帐户下运行 Wine
为了减少对 Windows 应用程序访问您主目录的担忧,可能希望在专门创建的用户帐户下运行 Wine。
首先,创建一个用于 Wine 的 用户帐户:
# useradd -m -s /bin/bash wineuser
现在切换到另一个 TTY 并像往常一样启动您的 X WM 或 DE,或者继续阅读...
xhost 命令的信息,请参阅 Xorg#Rootless Xorg。之后,为了使用这个新用户帐户打开 Wine 应用程序,您需要将新用户添加到 X 服务器权限列表中:
$ xhost +SI:localuser:wineuser
最后,您可以通过以下命令运行 Wine,该命令使用 env 以 Wine 预期的环境变量启动 Wine:
$ sudo -u wineuser env HOME=/home/wineuser USER=wineuser USERNAME=wineuser LOGNAME=wineuser wine arguments
可以通过以下 shell 脚本来自动化通过此方法使用 Wine 运行 Windows 应用程序的过程:
/usr/local/bin/runaswine
#!/bin/sh xhost +SI:localuser:wineuser sudo -u wineuser env HOME=/home/wineuser USER=wineuser USERNAME=wineuser LOGNAME=wineuser wine "$@"
然后可以通过以下方式启动 Wine 应用程序:
$ runaswine "C:\path\to\application.exe"
为了避免每次以其他用户身份运行 Wine 时都要求输入密码,可以在 sudoers 文件中添加以下条目:mainuser ALL=(wineuser) NOPASSWD: ALL。有关更多信息,请参阅 Sudo#Configuration。
建议以 Wine 用户身份运行 winecfg,并在配置窗口的“桌面集成”部分删除指向 Wine 用户主目录以外的目录的所有绑定,这样使用 Wine 运行的程序就无法读取该特殊用户主目录以外的任何文件。
请记住,如果使用 PulseAudio,以这种方式运行的 Wine 程序可能会导致音频无法正常工作。有关允许 Wine 用户访问主用户 PulseAudio 守护进程的信息,请参阅 PulseAudio/Examples#允许多个用户共享 PulseAudio 守护进程。
tmpfs 上的临时目录
为了防止 Wine 将其临时文件写入物理磁盘,可以定义一个备用位置,例如 tmpfs。删除 Wine 的默认临时文件目录并创建一个符号链接:
$ rm -r ~/.wine/drive_c/users/$USER/Temp ~/.wine/drive_c/windows/temp $ ln -s /tmp/ ~/.wine/drive_c/users/$USER/Temp $ ln -s /tmp/ ~/.wine/drive_c/windows/temp
阻止安装 Mono/Gecko
如果系统或 Wine 前缀中既没有 Gecko 也没有 Mono,Wine 会提示从互联网下载它们。如果您不需要 Gecko 和/或 Mono,则可能希望通过将 WINEDLLOVERRIDES 环境变量设置为 mscoree=d;mshtml=d 来禁用此对话框。
移除 Wine 文件绑定
出于安全原因,移除预安装的 Wine 绑定可能很有用,这样 Windows 应用程序就无法直接从文件管理器或浏览器启动(Firefox 会提供直接用 Wine 打开 EXE 文件!)。如果要这样做,可以在 /etc/pacman.conf 中添加以下 NoExtract 行:
NoExtract = usr/lib/binfmt.d/wine.conf NoExtract = usr/share/applications/wine.desktop
Wine 设置自己的应用程序作为默认值
每次 Wine 创建(或更新)一个前缀时,它都会相应地将其自带的记事本和 Wine 浏览器等应用程序设置为默认的文本编辑器和 Web 浏览器。
解决此不良行为的一种方法是使用此 环境变量:
$ WINEDLLOVERRIDES=winemenubuilder.exe=d ...
WineASIO
如果您需要在 Wine 下支持专业音频,可以使用 wineasioAUR,它为 Wine 提供了一个 ASIO 接口,您可以使用该接口与 JACK 一起使用。
要使用 wineasio,您必须将自己添加到 realtime 用户组。
接下来,您需要在所需的 Wine 前缀中注册 wineasio。根据需要注册 32 位和/或 64 位版本:
$ regsvr32 /usr/lib32/wine/i386-windows/wineasio32.dll $ wine64 regsvr32 /usr/lib/wine/x86_64-windows/wineasio64.dll
禁用 explorer.exe 启动
如果您在未安装 X 的情况下运行文本模式(命令用户界面)可执行文件,在启动可执行文件时可能会出现这些错误:
0060:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded. 0060:err:winediag:nodrv_CreateWindow L"The explorer process failed to start." 0060:err:systray:initialize_systray Could not create tray window
这是因为 wine 默认会启动 explorer.exe。即使是 wineconsole,根据 ps 输出,也会启动 explorer.exe /desktop。
可以通过此环境变量设置禁用包含 systray 的 explorer 启动:
$ WINEDLLOVERRIDES="explorer.exe=d" wine program.exe
根据您的 CUI 程序,您可能可以通过禁用 services.exe 来以最低内存占用运行它。
$ WINEDLLOVERRIDES="explorer.exe,services.exe=d" wine program.exe
故障排除
有关一般性提示,请参阅 Wine 用户指南和 Wine FAQ(尤其是其 故障排除部分)。
另请参阅 Wine AppDB 以获取有关特定应用程序的建议。
一般安装问题
每个 Wine 前缀都有大量持久状态,包括已安装的程序和注册表。排查程序安装问题的第一步是创建一个隔离的前缀,或通过 rm -rf ~/.wine 清除默认前缀。后者将删除您添加到默认前缀的所有程序和设置。
加载 libc.so.6 错误
运行 wine 时可能会出现以下错误:
$ wine cmd
/usr/bin/wine: error while loading shared libraries: libc.so.6: cannot create shared object descriptor: Operation not permitted
这是由 mmap2 调用的失败引起的。
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 EPERM (Operation not permitted)
这是一个已知的 内核 bug。
将 vm.mmap_min_addr sysctl 值从默认的 65536 更改似乎可以解决此问题。
# sysctl -w vm.mmap_min_addr=32768
Xwayland 问题
如果您在 Xwayland 下使用 Wine,可以在 winecfg 的“图形”选项卡中启用“模拟虚拟桌面”选项,以避免以下问题:
- 闪烁;
- 窗口位置错误;
- 鼠标光标位置和点击错误;
- 键盘检测。
如果禁用虚拟桌面后,您无法再通过鼠标和键盘与 winecfg 窗口进行交互,您可以显式地在虚拟桌面上启动 winecfg,并使用以下命令重新启用它:
$ wine explorer /desktop=name,800x600 winecfg
在 Wayland 下启动 GUI 窗口(例如 winecfg)时,并且控制台中没有显示这些错误:
$ wine winecfg
Authorization required, but no authorization protocol specified 008c:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded. 008c:err:winediag:nodrv_CreateWindow L"The explorer process failed to start." 008c:err:systray:initialize_systray Could not create tray window
您可以尝试将 DISPLAY 变量设置为 :1。
$ DISPLAY=:1 wine winecfg
键盘输入不起作用
这可能是由于窗口管理器未切换焦点所致。在 winecfg 的“图形”选项卡中,禁用“允许窗口管理器...”选项,或将窗口模式设置为“模拟虚拟桌面”。
- 有人建议切换所有 窗口设置,点击 应用,然后改回来。如果这不起作用,请尝试上面的方法。
如果失去应用程序焦点后键盘不起作用,请尝试编辑注册表:
- 在
HKEY_CURRENT_USER\Software\Wine\X11 Driver下,添加一个名为UseTakeFocus的字符串值,并将其设置为N。 - 或者,您可以使用 winetricks 设置该值:
$ winetricks usetakefocus=n
或使用 wine reg:$ wine reg add 'HKEY_CURRENT_USER\Software\Wine\X11 Driver' /t REG_SZ /v UseTakeFocus /d N /f
应用程序启动失败
一些旧游戏和应用程序假定当前 工作目录与可执行文件所在的目录相同。从其他位置启动这些可执行文件将阻止它们正常启动。在调用 Wine 之前,请使用 cd path_containing_exe 来排除此可能性。
EA App 启动游戏失败
如果 环境变量块的总大小超过约 32768 个字符,当尝试从 EA App 启动任何游戏时,会弹出一个错误窗口(消息会随着版本变化:通常是通用的“Failed to launch game”,但有时也会是“The game hasn't released yet”)。
这是应用程序本身的问题,不是 Wine 的问题。解决此问题的唯一方法是取消设置系统中的大型环境变量,使总大小不超过阈值。请注意,Wine 会故意不导入某些环境变量,这可以缓解此问题。[9] 也可以通过设置一个具有相同键且前缀为 WINE_HOST_ 的环境变量来阻止特定环境变量被导入。[10]
参见
- Wine 主页
- Wine Wiki
- Wine Application Database (AppDB) - 关于运行特定 Windows 应用程序的信息(已知问题、评分、针对特定应用程序的指南等)。
- Wine Forums - 在您查阅了 FAQ 和 AppDB 之后,这是一个提问的好地方。
- Gentoo:Wine
- Darling - 一个针对 MacOS 软件的类似项目。
- WineASIO - WineASIO 项目的 GitHub 页面,提供更多信息。