调查X11访客或主机上的共享剪贴板问题
如果您在使用VirtualBox的共享剪贴板功能时遇到问题,并且正在使用基于X11的主机系统或基于X11的访客系统,则可以启用日志功能,这将让您了解内部发生的情况。(在此之前,请务必检查共享剪贴板是否已实际启用。并确保您理解X11有两个——或三个——不同的剪贴板,我们只代理其中一个。)这种查看将从X11剪贴板组件的角度进行,因此,例如,如果您在Linux主机上运行Windows访客系统,您将看到主机组件何时认为访客组件请求了剪贴板内容,但不会直接看到访客上的应用程序何时向访客组件请求了数据。
重要提示:请务必首先检查主机和访客端是否都没有再运行任何第三方剪贴板管理器(如parcellite)。已知其中一些会与VirtualBox的共享剪贴板功能引起冲突。
背景信息:共享剪贴板机制由一个在主机上运行的组件和一个在访客机上运行的组件组成,它们使用VirtualBox的主机到访客通信机制进行通信。主机组件代表在访客机上运行的所有应用程序,反之亦然。这意味着的一些示例如下:
- 如果访客机上的应用程序在那里取得剪贴板的所有权,主机组件会取得主机上的剪贴板所有权。如果主机上的应用程序询问它提供了哪些数据格式,主机组件会询问访客组件,访客组件再询问访客机上的所有者应用程序,然后主机组件返回此信息。
- 如果主机上的应用程序从剪贴板请求数据,主机组件会询问访客组件,访客组件再询问所有者应用程序。
- 如果主机上的应用程序随后取得主机上剪贴板的所有权,主机组件会通知访客组件,访客组件将从原先拥有剪贴板的应用程序那里接管访客剪贴板的所有权。
您将看到的信息类型将包括:
- 组件正在启动或停止。
- 一个应用程序已询问组件共享剪贴板提供了哪些数据格式。
- 一个应用程序已请求剪贴板数据。
- 另一个组件已宣布其端的一个应用程序正在控制剪贴板,因此此组件应在其端控制剪贴板以代表远程应用程序。
- 此端的一个应用程序已控制剪贴板,因此此组件已放弃控制权,并要求另一端控制那里的剪贴板以代表该应用程序。
在主机组件上启用日志记录
要在基于X11的主机上告知主机剪贴板组件将信息添加到虚拟机日志文件,请通过命令行运行VirtualBox并设置环境变量
VBOX_RELEASE_LOG=+shared_clipboard.e.l.f
设置(有关更多背景信息,请参阅日志功能的说明)。
在访客组件中启用日志记录
在基于X11的访客系统上,访客组件的主要部分是一个守护进程应用程序(它只启动一次,通常从不停止,在后台继续其工作),名为 !VBoxClient。您可以使用 ps
命令查看它是否正在运行(它应该正在运行)
$ ps -Af | grep VBoxClient [...] user 122 [...] /usr/bin/VBoxClient --display user 123 [...] /usr/bin/VBoxClient --display user 124 [...] /usr/bin/VBoxClient --clipboard user 125 [...] /usr/bin/VBoxClient --clipboard [...]
要使其生成日志,您可以停止它(在此示例中,进程ID为124和125,因此您将执行
$ kill 124 125
并(以已登录用户身份)重新启动它,将 VBOX_RELEASE_LOG_DEST
环境变量设置为指向一个文件,同时设置 VBOX_RELEASE_LOG=+all.e.l.f
并带上 -d
标志,该标志指示它不要成为守护进程并消失在后台
$ VBOX_RELEASE_LOG_DEST=file=/tmp/clipboard.log VBOX_RELEASE_LOG=+all.e.l.f VBoxClient -d --clipboard
现在日志将写入访客系统上的 /tmp/clipboard.log
文件。