跳转至内容

Wine

来自 ArchWiki
(重定向自 DXVK)

Wine 是一个兼容层,能够运行 Microsoft Windows 应用程序在 类 Unix 操作系统 上。

Wine 不使用 模拟二进制翻译,或 虚拟化 来运行。相反,Wine 提供了一个 Win32 API 的实现,供需要它的应用程序使用。由于 Wine 对 Win32 API 的实现自然会与 Microsoft Windows 提供的有所不同,因此应用程序在使用 Wine 时可能会遇到行为、兼容性或性能方面的问题。

警告

安装

Wine 可以通过 wine (开发版)、wine-stableAUR (稳定版) 或 wine-staging (测试版) 包进行安装。 Wine StagingWine 的一个打过补丁的版本,其中包含尚未集成到稳定版或开发版中的错误修复和功能。

提示 考虑安装 wine-geckowine-mono 以支持依赖 Internet Explorer 和 .NET 的应用程序。这些包并非必需,因为 Wine 会按需下载相关文件。但是,您应该 使用 pacman 来管理它们

如果使用 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]

前缀内的依赖

除了系统依赖之外,许多程序还需要额外的字体和 DLL 文件安装到 Wine 前缀中 [2]。为了满足这些依赖,您可以使用 Winetricks,一个简单的“包管理器”,其中每个 verb 都会安装某项内容或应用一个配置调整。使用 Winetricks 有两种方式:

  • 通过 CLI:运行 winetricks verb_name
  • 通过 GUI:安装 zenitykdialog,然后运行 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 的图形化前缀和运行器管理器。
https://usebottles.com/ || bottlesAUR
  • CrossOver — Wine 的官方付费版本,提供图形界面和更全面的最终用户支持。
https://www.codeweavers.com/crossover || crossoverAUR
  • Lutris — 适用于所有类型游戏的游戏启动器,包括 Wine 游戏(带前缀管理)、原生 Linux 游戏和模拟器。
https://lutris.net || lutris
  • PlayOnLinux — Wine 的图形化前缀管理器。包含用于辅助程序安装和配置的脚本。
https://www.playonlinux.com || playonlinuxAUR
  • PyWinery — 简单的图形化 Wine 前缀管理器。
https://github.com/ergoithz/pywinery || pywineryAUR
  • Q4Wine — Wine 的图形化前缀管理器。可以将 Qt 主题导出到 Wine 配置中以实现更好的集成。
https://sourceforge.net/projects/q4wine/ || q4wine-gitAUR
  • WINEgui — 一个用户友好的 WINE 图形界面。
https://gitlab.melroy.org/melroy/winegui || wineguiAUR,winegui-binAUR

配置

Wine 的配置通常通过以下方式完成:

请参阅 Programs 获取完整列表。

WINEPREFIX

默认情况下,Wine 将其配置文件和安装的 Windows 程序存储在 ~/.wine 中。这个目录通常被称为“Wine 前缀”或“Wine 瓶”。每当您运行 Windows 程序或 Wine 的捆绑程序(如 winecfg)时,它都会被自动创建/更新。前缀目录还包含一个树形结构,您的 Windows 程序会将其视为 C:(C 盘)。

注意 Wine 前缀不向前兼容。新版本的 Wine 会在必要时自动升级旧前缀,此时它们可能无法与旧版本的 Wine 一起使用。 [5]

您可以使用 WINEPREFIX 环境变量来覆盖 Wine 使用前缀的位置。如果您想为不同的 Windows 程序使用单独的配置,这非常有用。当使用新的 Wine 前缀运行程序时,Wine 会自动创建一个带有裸露 C 盘和注册表的目录。

例如,如果您运行一个程序,使用 env WINEPREFIX=~/.win-a wine program-a.exe,而运行另一个程序,使用 env WINEPREFIX=~/.win-b wine program-b.exe,则这两个程序将各自拥有一个独立的 C 盘和独立的注册表。

警告 Wine 前缀不是 沙箱!在 Wine 下运行的程序仍然可以访问系统的其余部分!(例如,Z: 被映射到 /,无论 Wine 前缀如何)。

要创建一个默认前缀,而不运行 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/
注意 Wine 不支持为所有用户安装 Windows 应用程序,因此它不会将 .desktop 文件放在 /usr/share/applications 中。请参阅 WineHQ 错误 11112
提示 如果在安装软件时菜单项**未**被创建或已丢失,wine winemenubuilder 可能会有所帮助。

为 Wine 工具创建菜单项

默认情况下,Wine 的安装不会为 Wine 自带的软件(例如 winecfgwinebrowser 等)创建桌面菜单/图标。这可以通过安装 wine-installerAURwine-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 选择它。

注意 上面链接的主题只能安装在 Windows XP 版本为前缀的 32 位前缀上。要在 64 位前缀上安装它,您可能需要创建一个临时的 32 位前缀,安装主题,然后将该前缀中 drive_c/Windows/Resources/ThemesZune 文件夹和 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

用法

警告 不要以 root 用户身份运行或安装 Wine 应用程序!详情请参阅 Wine FAQ

请参阅 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 命令可以一次性停止所有正在运行的 winewineconsole 进程。例如:

$ 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
注意 安装正确的库后,您可能需要重新启动 Xorg
声音

安装您想使用的音频驱动程序的正确包:

如果 winecfg 仍然无法检测到音频驱动程序(Selected driver: (none)),请 通过注册表进行配置。例如,要提供对声音硬件(声音播放和麦克风)的完全访问权限:打开 regedit,查找键 HKEY_CURRENT_USER > Software > Wine > Drivers,添加一个名为 Audio 的字符串,并将其值设置为 alsa。此外,重新创建前缀可能也有帮助。

WINEARCH
注意 设置 WINEARCH 不再适用于 winewine-staging 包,仅适用于 wine-stableAURwine32AUR

如果支持,您可以使用 WINEARCHWINEPREFIX 来创建独立的 win32win64(旧的 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-mingwAURdxvk-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-ProtonVKD3D 的一个分支,旨在通过 Vulkan 实现完整的 Direct3D 12 API。该项目为 Proton 中的 Direct3D 12 支持提供了开发支持,从而提高了 DirectX 12 游戏的性能和兼容性。

提示 尽管名称中带有 Proton,但 DLL 与 Wine 的常规版本完美兼容,并且可以与 #DXVK 一起使用。

要安装最新版本,请使用 #Winetricks

$ WINEPREFIX=your-prefix winetricks vkd3d

或者,安装 vkd3d-proton-mingwAURvkd3d-proton-binAUR。然后运行以下命令在您的 Wine 前缀(默认为 ~/.wine)中激活它:

$ WINEPREFIX=your-prefix setup_vkd3d_proton install --symlink
提示 仅限 AMDGPU 用户:当与 Gamescope 配对时,DXVK v2.1+ 支持 HDR10 显示器。有关详细信息,请参阅 HDR 显示器支持

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 相当或更流畅。
注意 Wine 开发者不计划添加 ESync 或 FSync,因为自 Wine 10.16 起,完整的 NTSync 已添加并默认启用。NTSync 比 Esync 或 FSync 更准确,且没有性能损失,如果您使用最新的 Wine 和 Linux 内核版本,没有理由使用 ESync 或 FSync。

要启用 ESync,请在运行 Wine 之前 导出以下 环境变量

WINEESYNC=1

或者用于已打补丁的 Wine 的 FSync:

WINEFSYNC=1

NTSync 不需要设置环境变量,而是会在 ntsync 内核模块加载时自动使用。 winewine-staging 附带一个文件用于 在启动时加载模块,否则您可以手动创建。

/etc/modules-load.d/ntsync.conf
ntsync
注意 现在 Arch Linux 的 winewine-staging 包自 10.16 版本起,在安装时默认自动创建 /usr/lib/modules-load.d/10-ntsync.conf 配置文件,以在每次系统重启时启用 ntsync 内核模块的自动加载。因此,您无需手动创建此文件。您只需在安装这些包后重启系统,或者手动加载一次 ntsync 内核模块即可。但是,如果您使用的是 AUR 中的自定义、非官方版本的 Proton 或 Wine,则仍然需要执行此操作。

MangoHud 可以在游戏中显示 ESync、FSync 或 NTSync 的存在或不存在,如果您在其配置文件中启用了 winesync 指示。

取消注册现有的 Wine 文件关联

默认情况下,Wine 会接管许多格式的默认应用程序。某些格式(例如 vbschm)是 Windows 特有的,用 Wine 打开它们可能很方便。然而,其他格式(例如 gifjpegtxtjs)在 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 创建文件类型关联

注意 这必须为每个不应更新文件关联的 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 以立即使用它。

注意 确保 Windows 二进制文件是 可执行的,否则二进制文件将无法运行。

双显示器,不同分辨率

安装 libxinerama 可能会修复 Wine 的双显示器问题(例如,在最右侧或最底部的显示器上的应用程序按钮和菜单无法点击,该区域的应用程序界面无法重绘,鼠标光标离开应用程序区域后状态卡住)。

刻录光盘

要刻录 CD 或 DVD,您需要加载 sg 内核模块

正确挂载光盘镜像

某些应用程序会检查光盘是否在驱动器中。它们可能仅检查数据,在这种情况下,在 winecfg 中将相应路径配置为 CD-ROM 驱动器可能就足够了。但是,其他应用程序会查找名称和/或序列号,在这种情况下,必须使用这些特殊属性挂载镜像。

一些虚拟驱动器工具无法处理这些元数据,例如基于 fuse 的虚拟驱动器(例如 Acetoneiso)。CDemu 将正确处理它。

在游戏中显示 FPS 覆盖

Wine 包含一个内置的 FPS 监视器,如果设置了环境变量 WINEDEBUG=fps,它适用于所有图形应用程序。这会将帧率输出到 stdout。您可以借助 osd_cat(来自 xosd 包)将 FPS 显示在窗口顶部。请参阅 winefps.sh 以获取辅助脚本。

在单独的用户帐户下运行 Wine

警告 这不是一个真正的沙盒解决方案,它只会使用文件系统权限来保护您的主目录。如果您想要沙盒,应该使用 firejailbubblewrap 之类的工具,它们不会出现需要 root 权限的 Xorg 或音频问题等缺点。

为了减少对 Windows 应用程序访问您主目录的担忧,可能希望在专门创建的用户帐户下运行 Wine。

首先,创建一个用于 Wine 的 用户帐户

# useradd -m -s /bin/bash wineuser

现在切换到另一个 TTY 并像往常一样启动您的 X WM 或 DE,或者继续阅读...

注意 以下方法仅在启用 Xorg 的 root 权限时有效。有关如何在您的主用户下执行 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]

参见