配置 USB 重定向
USB 设备在 Citrix Workspace™ 应用程序和 Linux VDA 桌面之间共享。当 USB 设备重定向到桌面时,用户可以像本地连接一样使用该 USB 设备。
提示:
我们建议在网络延迟低于 100 毫秒时使用 USB 重定向。当网络延迟高于 200 毫秒时,请勿使用 USB 重定向。
-
USB 重定向包括三个主要功能领域:
- 开源项目实施 (VHCI)
- VHCI 服务
- USB 服务
| 开源 VHCI: |
| USB 重定向功能的这一部分开发了一个基于 IP 网络的通用 USB 设备共享系统。它由一个 Linux 内核驱动程序和一些用户模式库组成,这些库允许您与内核驱动程序通信以获取所有 USB 数据。在 Linux VDA 实施中,Citrix 重用了 VHCI 的内核驱动程序。但是,Linux VDA 和 Citrix Workspace 应用程序之间的所有 USB 数据传输都封装在 Citrix ICA® 协议包中。 |
VHCI 服务:
VHCI 服务是 Citrix 提供的一种开源服务,用于与 VHCI 内核模块通信。此服务充当 VHCI 和 Citrix USB 服务之间的网关。
USB 服务:
USB 服务表示一个 Citrix 模块,用于管理 USB 设备上的所有虚拟化和数据传输。
USB 重定向的工作原理
通常,如果 USB 设备成功重定向到 Linux VDA,则会在系统 /dev 路径中创建一个或多个设备节点。但是,有时重定向的设备无法用于活动的 Linux VDA 会话。USB 设备依赖驱动程序才能正常运行,并且某些设备需要特殊驱动程序。如果未提供驱动程序,则活动的 Linux VDA 会话将无法访问重定向的 USB 设备。为确保 USB 设备连接,请正确安装驱动程序并配置系统。
Linux VDA 支持可成功重定向到客户端和从客户端重定向的 USB 设备列表。此外,设备(尤其是 USB 磁盘)已正确装载,允许用户无需任何额外配置即可访问磁盘。
支持的 USB 设备
以下设备已验证支持此版本的 Linux VDA。其他设备可能可以自由使用,但结果可能出乎意料:
| >**注意:** | | |
| | | | |
Linux VDA 仅支持 USB 2.0 协议。
| USB 大容量存储设备 | VID:PID | 文件系统 |
|---|---|---|
| Netac Technology Co., Ltd | 0dd8:173c | FAT32 |
| Kingston Datatraveler 101 II | 0951:1625 | FAT32 |
| Kingston Datatraveler GT101 G2 | 1567:8902 | FAT32 |
| SanDisk SDCZ80 闪存驱动器 | 0781:5580 | FAT32 |
| WD HDD | 1058:10B8 | FAT32 |
| USB 3D 鼠标 | VID:PID | |
| 3DConnexion SpaceMouse Pro | 046d: c62b | |
| USB 扫描仪 | VID:PID | |
| Epson Perfection V330 photo | 04B8: 0142 |
配置 USB 重定向
Citrix 策略控制 USB 设备重定向是启用还是禁用。此外,还可以使用 Delivery Controller™ 策略指定设备类型。为 Linux VDA 配置 USB 重定向时,请配置以下策略和规则:
- 客户端 USB 设备重定向策略
- 客户端 USB 设备重定向规则
启用 USB 重定向策略
在 Citrix Studio 中,启用(或禁用)到客户端和从客户端的 USB 设备重定向(仅适用于工作站主机)。
在编辑设置对话框中:
- 选择允许。
- 单击确定。

设置 USB 重定向规则
启用 USB 重定向策略后,使用 Citrix Studio 设置重定向规则,指定 Linux VDA 上允许(或拒绝)哪些设备。
在客户端 USB 设备重定向规则对话框中:
- 单击新建以添加重定向规则,或单击编辑以查看现有规则。
- 创建(或编辑)规则后,单击确定。

构建 VHCI 内核模块
USB 重定向依赖于 VHCI 内核模块(usb-vhci-hcd.ko 和 usb-vhci-iocif.ko)。这些模块是 Linux VDA 分发版的一部分(作为 RPM 软件包的一部分)。它们是根据官方 Linux 分发版内核编译的,并在下表中注明:
| 支持的 Linux 分发版 | 内核版本 |
|---|---|
| RHEL 8.3 | 4.18.0-240.10.1 |
| RHEL 8.2 | 4.18.0-240.10.1 |
| RHEL 8.1 | 4.18.0-240.10.1 |
| RHEL 7.9 | 3.10.0-1160.11.1 |
| RHEL 7.8 | 3.10.0-1160.11.1 |
| SUSE 12.5 | 4.12.14-122.57.1 |
| Ubuntu 20.04 | 5.4.0-58 |
| Ubuntu 18.04 | 4.15.0-128 |
| Ubuntu 16.04 | 4.4.0-197 |
| Debian 10 | 4.19.0-13 |
重要:
如果您的计算机内核与为 Linux VDA 构建的驱动程序不兼容,USB 服务可能无法启动。在这种情况下,只有在您构建自己的 VHCI 内核模块后才能使用 USB 重定向功能。
验证您的内核是否与 Citrix 构建的模块一致
在命令行中,运行以下命令以验证内核是否一致:
insmod /opt/Citrix/VDA/lib64/usb-vhci-hcd.ko
<!--NeedCopy-->
如果命令成功运行,则内核模块已成功加载,并且版本与 Citrix 安装的版本一致。
如果命令运行出错,则内核与 Citrix 模块不一致,必须重新构建。
重新构建 VHCI 内核模块
如果您的内核模块与 Citrix 版本不一致,请执行以下操作:
-
从 Citrix 下载站点下载 LVDA 源代码。选择“Linux Virtual Delivery Agent (sources)”部分中包含的文件。
-
解压缩 citrix-linux-vda-sources.zip 文件。导航到 linux-vda-souces/vhci-hcd-1.15.tar.bz2,并使用 tar xvf vhci-hcd-1.15.tar.bz2 解压缩 VHCI 源文件。
-
根据头文件和 Module.symvers 文件构建内核模块。使用以下步骤安装内核头文件并根据相应的 Linux 分发版创建 Module.symvers:
RHEL/CentOS:
yum install kernel-devel <!--NeedCopy-->SUSE 12:
- zypper install kernel-devel zypper install kernel-source <!--NeedCopy-->Ubuntu:
- apt-get install linux-headers <!--NeedCopy-->提示:
如果安装成功,将有一个类似于以下内容的内核文件夹:
/usr/src/kernels/3.10.0-327.10.1.el7.x86_64
-
在
/usr/src/kernels/3.10.0-327.10.1.el7.x86_64文件夹中,验证 Module.symvers 文件是否存在。如果此文件不在该文件夹中,请构建内核(通过按顺序运行以下命令:make oldconfig;make prepare;make modules;make)以获取此文件,或者从 /usr/src/kernels/3.10.0-327.10.1.el7.x86_64-obj/x86_64/defaults/module.* 复制它。 -
运行以下命令安装开发工具。
RHEL 8, CentOS 8:
- yum groupinstall 'Development Tools' yum install elfutils-libelf-devel <!--NeedCopy-->RHEL 7, CentOS 7:
yum groupinstall 'Development Tools' <!--NeedCopy-->
Ubuntu 20.04、Ubuntu 18.04、Debian 10:
```
apt install build-essential flex bison libelf-dev
<!--NeedCopy--> ```
Ubuntu 16.04:
```
apt install build-essential flex bison
<!--NeedCopy--> ```
6. 在 vhci-hcd-1.15/Makefile 文件中,更改 VCHI 的 Makefile 并将 KDIR 设置为内核目录:
```
#KDIR = $(BUILD_PREFIX)/lib/modules/$(KVERSION)/build
KDIR = /usr/src/kernels/3.10.0-327.10.1.el7.x86_64
<!--NeedCopy--> ```
7. 在 vhci-hcd-1.15/ 文件夹中,运行 make 以构建 VHCI 内核。
> 注意:
>
> 如果构建成功,usb-vhci-hcd.ko 和 usb-vhci-iocifc.ko 将在 vhci-hcd-1.15/ 文件夹中创建。
8. 使用新构建的内核模块替换现有模块:cp -f usb-vhci-*.ko /opt/Citrix/VDA/lib64/
9. 重新启动 USB 服务:
```
service ctxusbsd restart
<!--NeedCopy--> ```
10. 注销并重新登录会话。检查 USB 重定向是否正常运行。
排除内核构建问题故障
使用特定内核构建 VHCI 模块时,可能会出现以下错误:
- 可能会出现 implicit declaration of function 'copy\_to\_user' 错误,请参见以下屏幕截图:

此错误是由于内核中的头文件更改而导致的。作为一种解决方法,请将 #include <linux/uaccess.h> 行添加到 vhci-hcd-1.15/usb-vhci-iocifc.c 文件中。

- 可能会出现 'driver\_attr\_debug_output' undeclared 错误,请参见以下屏幕截图:

当内核上缺少符号时,会发生此错误。作为一种解决方法,请在 vhci-hcd-1.15/usb-vhci-iocifc.c 和 vhci-hcd-1.15/usb-vhci-hcd.c 文件中禁用 DEBUG 的宏定义。

- 可能会出现 'make[3]: *** No rule to make target 'arch/x86/tools/relocs_32.c', needed by 'arch/x86/tools/relocs_32.o'. Stop. 错误,请参见以下屏幕截图:

作为一种解决方法,请在 vhci-hcd-1.15/ 路径下使用以下命令将 SUBDIRS=$(PWD) 替换为 M=$(shell pwd):
```
sed -i 's/SUBDIRS=$(PWD)/M=$(shell pwd)/g' Makefile
sed -i 's/SUBDIRS=$(PWD)/M=$(shell pwd)/g' test/Makefile
<!--NeedCopy--> ```
- 可能会出现 ./include/uapi/linux/stat.h:30:17: error: expected ')' before numeric constant #define S_IRUSR 00400 错误,请参见以下屏幕截图:

运行以下命令可解决此问题:
```
sed -i 's/show_debug_output/debug_output_show/g' usb-vhci-iocifc.c usb-vhci-hcd.c
sed -i 's/store_debug_output/debug_output_store/g' usb-vhci-iocifc.c usb-vhci-hcd.c
sed -i 's/static DRIVER_ATTR(debug_output, S_IRUSR | S_IWUSR, debug_output_show, debug_output_store);/static DRIVER_ATTR_RW(debug_output);/g' usb-vhci-iocifc.c usb-vhci-hcd.c
<!--NeedCopy--> ```
- 可能会出现 ./arch/x86/include/asm/uaccess.h:433:29: error: invalid initializer __typeof__(ptr) __pu_ptr = (ptr); \ 错误,请参见以下屏幕截图:

作为一种解决方法,请将 usb-vhci-iocifc.c 文件的第 219 行从 __put_user('\0', arg->bus_id); 更改为 __put_user('\0', arg->bus_id + 0);。
- 可能会出现 error: 'access_ok' undeclared (first use in this function) if(unlikely((_IOC_DIR(cmd) & _IOC_READ) && !access_ok(VERIFY_WRITE, arg, _IOC_SIZE(cmd)))) 错误,请参见以下屏幕截图:

运行以下命令可解决此问题:
```
sed -i 's/VERIFY_READ, //g' usb-vhci-iocifc.c
sed -i 's/VERIFY_WRITE, //g' usb-vhci-iocifc.c
<!--NeedCopy--> ```
排除 USB 重定向问题故障
使用本节中的信息可排除使用 Linux VDA 时可能遇到的各种问题。
无法卸载重定向的 USB 磁盘
对于从 Citrix Workspace app 重定向的所有 USB 磁盘的访问控制,Linux VDA 在管理权限下管理所有这些设备,以确保只有所有者才能访问重定向的设备。因此,用户在没有管理权限的情况下无法卸载设备。

停止重定向 USB 磁盘时文件丢失
如果将 USB 磁盘重定向到会话并尝试修改它(例如,在磁盘上创建一些文件),然后立即使用 Citrix Workspace app 的工具栏停止重定向,则修改或创建的文件可能会丢失。出现此问题的原因是,当您将数据写入文件系统时,系统会将内存缓存装载到文件系统中。数据不会写入磁盘本身。如果您使用 Citrix Workspace app 的工具栏停止重定向,则没有剩余时间将数据刷新到磁盘,从而导致数据丢失。要解决此问题,请在停止 USB 重定向之前,在终端中使用 sync 命令将数据刷新到磁盘。

Citrix Workspace app 工具栏中没有设备
有时,您可能无法在 Citrix Workspace app 的工具栏中看到列出的设备,这表示没有进行 USB 重定向。如果遇到此问题,请验证以下各项:
- 策略已配置为允许 USB 重定向 - 内核模块与您的内核兼容

注意:
“设备”选项卡在适用于 Linux 的 Citrix Workspace app 中不可用。
USB 设备可在 Citrix Workspace app 工具栏中看到,但标记为“受策略限制”时重定向失败
出现此问题时,请执行以下操作:
- 配置 Linux VDA 策略以启用重定向。 - 检查 Citrix Workspace app 的注册表中是否配置了任何其他策略限制。检查注册表路径中的 DeviceRules 以确保此设置未拒绝设备访问:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Citrix\ICA Client\GenericUSB
USB 设备已成功重定向,但我无法在会话中使用它
通常,只有受支持的 USB 设备才能重定向。其他设备也可能重定向到活动的 Linux VDA 会话。对于每个重定向的设备,系统 /dev 路径中会创建一个由用户拥有的节点。但是,驱动程序和配置决定了用户是否可以成功使用设备。如果您发现设备已拥有(已插入)但无法访问,请将该设备添加到不受限制的策略中。
注意:
对于 USB 驱动器,Linux VDA 会配置并装载磁盘。用户(并且只有安装它的所有者)无需任何额外配置即可访问磁盘。对于不在受支持设备列表中的设备,情况可能并非如此。