我们如何将端口转发到端口上已经有服务器的 QEMU 运行?

How can we forward a port to QEMU which has a server on the port already running?

我有一个 python 服务器 运行ning 在端口 28009:

python3 -m http.server 28009

现在,在我 运行 服务器每当我调用 QEMU 转发端口 28009 之后:-

qemu-system-aarch64 -nographic -machine virt,gic-version=max -m 512M -cpu max -smp 4 \
-netdev user,id=vnet,hostfwd=tcp::28009-:28009 -device virtio-net-pci,netdev=vnet \
-drive file=ubuntu-image.img,if=none,id=drive0,cache=writeback -device virtio-blk,drive=drive0,bootindex=0 \
-drive file=flash0.img,format=raw,if=pflash -drive file=flash1.img,format=raw,if=pflash 

它抛出一个错误说:-

qemu-system-aarch64: Could not set up host forwarding rule 'tcp::28009-:28009'

同样,如果我先 运行 上面提到的 QEMU 脚本 - 它可以正常启动。但是,python 服务器现在抛出一个错误:

Traceback (most recent call last):
  File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "/usr/lib/python3.6/http/server.py", line 1211, in <module>
    test(HandlerClass=handler_class, port=args.port, bind=args.bind)
  File "/usr/lib/python3.6/http/server.py", line 1185, in test
    with ServerClass(server_address, HandlerClass) as httpd:
  File "/usr/lib/python3.6/socketserver.py", line 456, in __init__
    self.server_bind()
  File "/usr/lib/python3.6/http/server.py", line 136, in server_bind
    socketserver.TCPServer.server_bind(self)
  File "/usr/lib/python3.6/socketserver.py", line 470, in server_bind
    self.socket.bind(self.server_address)
OSError: [Errno 98] Address already in use

我怎样才能拥有服务器运行ning,然后QEMU 就可以访问这个服务器了?我不能使用 TUN 连接,因为我需要主机的本地主机与 QEMU 通信,反之亦然

hostfwd 选项用于将连接从外部世界转发到运行在guest 上的服务器。 “hostfwd=tcp::HOSTPORT-:GUESTPORT”说“QEMU 应该在端口 HOSTPORT 上监听主机;每当连接到达那里时,它应该将它转发到访客的端口 GUESTPORT(希望有一个服务器在那里监听)”。

您似乎运行在 主机 上安装服务器。在一台机器上的特定端口上监听的东西不能超过一件事,因此 python3 服务器程序可以监听端口 28009 并响应那里的连接,或者 QEMU 可以监听端口 28009 以响应连接那里(将它们转发给客人),但不是同时。无论哪个第二启动都会抱怨某些东西已经在使用该端口。

如果您想 运行 主机上的服务器并从来宾连接到它,您根本不需要任何 QEMU 选项。 QEMU 的 'usermode' 网络将允许访客程序向外连接到任何 IP 地址(包括更广泛的互联网,但也可以直接连接到主机),因此如果您尝试 运行 访客上的客户端和主机上的服务器应该可以正常工作。您可以告诉来宾客户端连接到主机的真实 IP 地址,或者您可以使用特殊的 'gateway' IP 地址 10.0.2.2,这就是主机在来宾看到的假网络上的显示方式。