好吧,这确实有点愚蠢,但却是真正的问题。
vncserver
继续绑定在 5902 端口上。这是因为qemu
正在监听 5900 和 5901:
% netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:5900 0.0.0.0:* LISTEN 1090/qemu-system-x8
tcp 0 0 127.0.0.1:5901 0.0.0.0:* LISTEN 1137/qemu-system-x8
tcp 0 0 0.0.0.0:5902 0.0.0.0:* LISTEN 7163/Xtightvnc
tcp 0 0 0.0.0.0:6002 0.0.0.0:* LISTEN 7163/Xtightvnc
我怀疑这与我在 VM 配置中将显示设置为 VNC 有关。信不信由你,否则 VM 控制台中的键盘将不起作用(至少在实际操作系统启动开始之前)。在 Stack 上找到它,它是真实的。
所以问题是我可以更改虚拟机正在监听的 VNC 端口吗?否则Xtightvnc
总是会设置桌面,examplehost:2
这会妨碍我的其他脚本。
我用它来运行这些虚拟机virt-manager
。
答案1
这项技术被称为虚拟器,而你提到的virt-manager只是它的一个客户端。
这是正常的默认行为。让我们看看在文档中:
... <devices> ... <graphics type='vnc' port='5904' sharePolicy='allow-exclusive'> <listen type='address' address='1.2.3.4'/> </graphics> <graphics type='rdp' autoport='yes' multiUser='yes' /> ... </devices> ...
...
vnc
启动 VNC 服务器。该
port
属性指定 TCP 端口号(使用 -1 作为旧语法,表示应自动分配)。该autoport
属性是用于指示要使用的 TCP 端口的自动分配的新首选语法。该passwd
属性以明文形式提供 VNC 密码。如果将该passwd
属性设置为空字符串,则禁用 VNC 访问。该keymap
属性指定要使用的键映射。可以通过提供passwdValidTo='2010-04-09T15:51:00'
假定为 UTC 的时间戳来设置密码有效性的限制。该connected
属性允许在更改密码期间控制连接的客户端。VNC 仅接受保留值自 0.9.3 起。请注意,并非所有虚拟机管理程序都支持此功能。
因此,如果autoport
使用功能(默认virt-manager
),则在启动 VM 时,它会被分配第一个可用端口,从 5900 开始:第一个端口分配 5900,下一个分配 5901,等等。如果您以不同的顺序启动它们,它们会“交换”端口。如果您将它绑定到某个端口,它会尝试使用该端口,如果该端口繁忙,则 VM 将无法启动。
我不知道是否可以使用 更改端口virt-manager
,但它不是唯一可用的 libvirt 控制客户端。使用virsh
您可以直接编辑 XML 格式的 VM 定义。在服务器上:
virsh list -all
virsh edit <name>
第一个命令列出了所有虚拟机,第二个命令将打开一个默认编辑器(可能vi
;您可以设置EDITOR
环境变量以使用其他内容,例如尝试运行EDITOR=nano virsh edit <name>
)。保存并退出编辑器后,您需要停止然后开始VM 以使更改生效;重新启动是不够的,因为它不会重新启动 Qemu 进程:
virsh shutdown <name>
virsh start <name>
(或者从 virt-manager GUI)。
它应该只绑定在指定的端口上。也可以让它监听 unix 域套接字;请进一步阅读链接的 libvirt 文档页面以了解如何操作。这将具有使用文件名的好处,从而保证不会有任何内容占用 VNC 服务器的绑定空间。我自己从未尝试过(10 多年没有使用 libvirt),我不知道 virt-manager 是否能够连接到套接字。