# 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
```

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/hanbook/di-13-zhang-wine/13.7.-freebsd-duo-yong-hu-yu-wine.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
