按照关于如何启动带QEMU的OpenWrt虚拟机的说明,我下载了MIPS核并使用以下命令启动了它:
qemu-system-mips -kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf -nographic -m 256但是,VM中没有internet连接:
root@(none):/# ping google.com
ping: bad address 'google.com'如何在QEMU中使用主机互联网连接?
正如注释中所建议的那样,ping将无法工作,因为它使用ICMP。但是,当使用wget时,会发生以下错误:
root@OpenWrt:~# wget http://google.com/
Downloading 'http://google.com/'
Failed to send request: Operation not permitted网络配置如下所示:
root@OpenWrt:~# ifconfig
br-lan Link encap:Ethernet HWaddr 52:54:00:12:34:56
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link
inet6 addr: fd02:a553:49cb::1/60 Scope:Global
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1248 (1.2 KiB) TX bytes:2822 (2.7 KiB)
eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3 errors:0 dropped:0 overruns:0 frame:0
TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1290 (1.2 KiB) TX bytes:2822 (2.7 KiB)
Interrupt:10 Base address:0x1060
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:528 errors:0 dropped:0 overruns:0 frame:0
TX packets:528 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:40288 (39.3 KiB) TX bytes:40288 (39.3 KiB)发布于 2023-05-08 15:59:07
由于OP没有提供任何网络设置:
qemu-system-mips -kernel -kernel -nographic -m 256
这将选择最小用户模式,如QEMU网络基础中所述:
QEMU内有两部分用于联网:
每个部分都有一系列的选项。默认情况下,QEMU将为来宾创建一个SLiRP用户网络后端和一个合适的虚拟网络设备(例如,针对大多数x86 PC客户的E1000 PCI卡),就好像您在命令行上键入了-net nic -net user一样。
从VM的角度来看,用户模式网络是这样的:
客(10.0.2.15) <->防火墙/DHCP服务器<-> SMB服务器(10.0.2.4)
QEMU可以处理TCP、UDP和一些(但不太像DHCP和DNS服务器)。特别是,这不能处理ICMP:
注意-如果您使用的是(默认的) SLiRP用户网络,那么
ping(ICMP)将无法工作,尽管TCP和UDP会。不要尝试使用ping测试您的QEMU网络配置!
它通过跟踪数据包并使用主机上的套接字来模拟VM的行为:当VM发送数据包时,QEMU打开一个套接字来发送相同的套接字(当然,它更复杂,尤其是使用TCP)。实际上,VM的源IP地址大多被忽略。
由于VM的操作系统打算运行路由器,它不知道这一点,并遵循其默认设置,这显然是:
eth0设置为到br-vlan的桥端口br-vlan:192.168.1.1/24由于没有默认路由,VM不会尝试通信:它知道没有路由。
如果它使用DHCP,它将在eth0 10.0.2.15/24上接收该地址,默认路由使用10.0.2.2作为网关:这些是用户模式网络堆栈仿真使用的默认值。
因此,在当前设置中使用适当的网关运行这样的默认路由所需的最小等效命令是:
ip route add default via 10.0.2.2 dev br-lan onlink(onlink跳过将路由添加到10.0.2.2的步骤)。同样的事情也可以用eth0做,首先放弃br-lan:
ip link del br-lan然后:
root@OpenWrt:/# udhcpc -i eth0
udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
udhcpc: ip addr add 10.0.2.15/255.255.255.0 broadcast + dev eth0
udhcpc: setting default routers: 10.0.2.2这不会配置DNS (udhcpc看起来对此太有限了)。因此,此外:
echo nameserver 10.0.2.3 > /etc/resolv.conf例如,现在允许这样做:
root@OpenWrt:/# wget http://google.com/
Downloading 'http://google.com/'
Connecting to 142.250.76.110:80
Redirected to / on www.google.com
Writing to 'index.html'不会有什么进展的。这将不允许测试路由器的功能。
更多的是,我们必须充分配置所有的网络部件,可能会为VM提供多个NIC以供适当使用。进一步阅读QEMU文档。它当然应该使用TAP网络后端。这需要理解如何进行配置:
有关使用TAP网络接口的命令行示例,请参见调用。
这要求运行VM的虚拟机管理程序系统已经配置了适当的网络本身,因此它可以向VM提供(具有足够的网络选项)一些资源。
例如,以root身份运行此命令将在VM中提供2个NIC:
qemu-system-mips \
-kernel openwrt-22.03.3-malta-be-vmlinux-initramfs.elf \
-netdev tap,id=n1,ifname=tapn1 -device pcnet,netdev=n1 \
-netdev tap,id=n2,ifname=tapn2 -device pcnet,netdev=n2 \
-nographic -m 256然后,可以将第二个网卡附加到主机上的现有桥上,例如,如果还在使用LXC,则可以将第二个网卡附加到lxcbr0:
ip link set tapn2 master lxcbr0其他一些QEMU选项可能可以通过单个命令调用来实现这一点。同样,使用一些特权QEMU帮助程序可以允许再次以非根用户的身份运行该命令。
由于LXC已经在lxcbr0上提供了DHCP (和DNS),这就允许在VM中使用DHCP:
udhcpc -i eth1然后,即使是像ping 8.8.8.8这样的东西也能工作,只要主机提供连接。DNS仍然必须手动配置,就像前面的示例一样。
当然,我们应该使用OpenWRT自己的配置方法。
https://unix.stackexchange.com/questions/744552
复制相似问题