# 13.7.多用户 FreeBSD 与 WINE

## 13.7.1. 使用公共 WINE 前缀的问题

像大多数 UNIX® 类操作系统一样，FreeBSD 设计上能让多个用户同时登录并进行工作。另一方面，Windows® 是多用户的，但其多用户的意义在于，系统上可以设置多个用户账户，但期望的是在任何给定时刻，只有一个用户使用物理机器（桌面或笔记本电脑）。

最近的消费版 Windows® 已采取了一些措施以改善多用户场景下的操作系统体验，但它仍然主要围绕单用户体验构建。此外，WINE 项目为了创建兼容的环境所采取的措施意味着，与 FreeBSD 应用程序（包括 WINE 本身）不同，WINE 更像是这种单用户环境。

因此，每个用户将不得不维护自己的配置集，这可能是好的。然而，对于安装应用程序，尤其是大型应用程序，如办公套件或游戏，最好只安装一次。这样做的两个原因是：维护（软件更新只需要应用一次）和存储效率（没有重复的文件）。

有两种策略可以最小化系统中多个 WINE 用户的影响。

## 13.7.2. 将应用程序安装到公共驱动器

如本章关于 WINE 配置的部分所述，WINE 提供了将额外的驱动器附加到特定前缀的功能。通过这种方式，可以将应用程序安装到公共位置，同时每个用户仍然可以保持自己的前缀，其中可能保存特定的设置（具体取决于程序）。如果需要共享的应用程序较少，且它们是那些只需少量自定义调整就能正常运行的程序，这种设置是一个不错的选择。

按以下步骤将应用程序安装到公共位置：

1. 首先，在系统上设置一个共享位置以存储文件，例如 /mnt/windows-drive\_d/。创建新目录的步骤可以参考 [mkdir(1)](https://man.freebsd.org/cgi/man.cgi?query=mkdir\&sektion=1\&format=html) 手册页。
2. 接着，为这个新目录设置权限，只允许希望访问该目录的用户。一种方法是创建一个名为 "windows" 的新组，并将所需的用户添加到该组中（请参见 [Users and Basic Account Management](https://docs.freebsd.org/en/books/handbook/basics/#users-groups) 章节的关于组的部分），然后将目录的权限设置为 `770`（[Permissions](https://docs.freebsd.org/en/books/handbook/basics/#permissions) 章节介绍了该过程）。
3. 最后，使用 `winecfg` 将该位置添加为用户前缀中的一个驱动器，方法如本章上面的 WINE 配置部分所述。

完成这些步骤后，应用程序可以安装到该位置，并使用分配的驱动器字母（或标准 UNIX® 风格的目录路径）运行。然而，如上所述，只有一个用户可以在同一时间运行这些应用程序（这些应用程序可能正在访问其安装目录中的文件）。一些应用程序在非所有者的用户（即使该用户是具有完全“读/写/执行”权限的组成员）运行时，可能会表现出意外的行为。

## 13.7.3. 使用公共安装的 WINE

另一方面，如果需要共享许多应用程序，或者这些应用程序需要特定的调优才能正常工作，可能需要采用不同的方法。在这种方法中，专门为存储 WINE 前缀和所有已安装的应用程序创建一个完全独立的用户。然后，单独的用户将被授权使用 [sudo(8)](https://man.freebsd.org/cgi/man.cgi?query=sudo\&sektion=8\&format=html) 命令以该用户身份运行程序。结果是，这些用户可以像平常一样启动 WINE 应用程序，只不过它会像由新创建的用户启动一样，因此使用的是包含设置和程序的集中维护的前缀。为此，可以执行以下步骤：

1. 使用以下命令（作为 `root` 用户）创建一个新用户，该命令将引导你完成所需的详细信息：

```sh
# adduser
```

输入用户名（例如 *windows*）和全名（"Microsoft Windows"）。然后接受其余问题的默认值。接下来，使用二进制包安装 `sudo` 工具，方法如下：

```sh
# pkg install sudo
```

2. 安装完成后，编辑 `/etc/sudoers` 文件，按如下方式配置：

```ini
# 用户别名规格
# 定义哪些用户可以运行 Wine/Windows 程序
User_Alias WINDOWS_USERS = user1,user2

# 定义哪些用户可以进行管理员操作（成为 root）
User_Alias ADMIN = user1

# 命令别名规格
# 定义 WINDOWS_USERS 可以运行哪些命令
Cmnd_Alias WINDOWS = /usr/bin/wine,/usr/bin/winecfg

# 默认设置
Defaults:WINDOWS_USERS env_reset
Defaults:WINDOWS_USERS env_keep += DISPLAY
Defaults:WINDOWS_USERS env_keep += XAUTHORITY
Defaults    !lecture,tty_tickets,!fqdn

# 用户权限规格
root    ALL=(ALL) ALL

# admin 用户别名中的成员可以获得 root 权限
ADMIN ALL=(ALL) ALL

# WINDOWS_USERS 可以作为用户 windows 运行 WINDOWS 程序，无需密码
WINDOWS_USERS ALL = (windows) NOPASSWD: WINDOWS
```

这些更改的结果是，*User\_Alias* 部分列出的用户可以使用 *Cmnd Alias* 部分中列出的程序，并以文件最后一行中列出的用户身份运行它们，也就是说，指定为 *WINDOWS\_USERS* 的用户可以像 *windows* 用户一样运行 WINE 和 `winecfg` 应用程序。作为附加好处，此配置意味着它们无需输入 *windows* 用户的密码。

3. 接下来，为 *windows* 用户提供对显示的访问权限，因为 WINE 程序将以该用户身份运行：

```sh
% xhost +local:windows
```

此命令应当添加到登录时或默认图形环境启动时运行的命令列表中。完成上述所有步骤后，配置为 `WINDOW_USERS` 的用户可以使用以下命令运行程序，使用共享前缀：

```sh
% sudo -u windows wine program.exe
```

值得注意的是，多个用户同时访问此共享环境仍然存在风险。然而，还可以考虑到共享环境本身可以包含多个前缀。通过这种方式，管理员可以创建一个经过测试和验证的程序集，每个程序集都有自己的前缀。同时，一个用户可以玩游戏，而另一个用户可以使用办公程序，无需冗余的软件安装。
