首页
学习
活动
专区
圈层
工具
发布

QEMU网桥
EN

Unix & Linux用户
提问于 2018-07-15 16:42:28
回答 2查看 4K关注 0票数 5

我正在使用QEMU (和KVM)在Debian 9上设置一个VM。我目前正在尝试通过一个桥接网络来工作,我使用ip linkip tuntap等设置了桥接网络;下面是brctl show的输出:

代码语言:javascript
复制
bridge name     bridge id               STP enabled     interfaces
br0             8000.107b444f55d6       no              enp4s0
                                                        tap0
docker0         8000.0242d4c18983       no

下面是ip a的输出:

代码语言:javascript
复制
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:d4:c1:89:83 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
4: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether f6:54:bb:db:d7:c6 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::f454:bbff:fedb:d7c6/64 scope link
       valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.26/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::127b:44ff:fe4f:55d6/64 scope link
       valid_lft forever preferred_lft forever

docker0接口是不相关的。

据我所知,这应该行得通。然而,我的Windows8.1客户在QEMU内没有互联网接入,并且无法通过DHCP获得一个IP (我只是获得自动生成的169.xx.xx.xx IP)。

我不知道这是为什么。我的QEMU论点是:

代码语言:javascript
复制
-net nic -net tap,ifname=tap0

我也试过:

代码语言:javascript
复制
-device e1000,netdev=net0,mac=52:55:00:d1:55:01 -netdev tap,id=net0

这两者产生相同的结果,没有网络访问。我搞不懂这个。

我在做什么蠢事吗?

EN

回答 2

Unix & Linux用户

发布于 2018-07-26 09:05:11

我刚刚在QEMU来宾上遇到了一个非常类似的问题,结果发现iptables阻塞了流量。如果我为客人设置了一个静态IP地址,那么主机和客人可以互相切换,但仅此而已。从客服机上无法联系到互联网和我的其他网络。

我强烈建议您使用像Wireshark或tcpdump这样的工具来调查这个问题。

我已经使用Wireshark从主机上捕获了桥接器接口,似乎是来自虚拟机的请求,但没有收到响应。

TL;DR:这条线索引导我找到了神奇的iptable命令(对我来说,这很神奇,因为我对iptables:)的经验还不够),在下面的答案中:

https://serverfault.com/a/165786

它起了作用,即使我在这一刻不完全理解它,我也认为我会把我的两分钱留在这里。

祝好运!

票数 1
EN

Unix & Linux用户

发布于 2020-01-22 23:18:13

我目前也在努力解决这个问题。我比你更接近解决方案。

我在Debian 10上,我决定只使用a包iproute2 (ip linkip addrbridge link.)它是内核的一部分,可以在任何Linux上使用。并打包qemu-kvm。这是你需要的一切。

步骤1

打开第一终端,把它写下来,这样你就能看到你的进度:

代码语言:javascript
复制
while true; do ip addr; sleep 1; clear; done

步骤2

打开第二个终端,在查看第一个终端的进度时执行这些逗号:

代码语言:javascript
复制
sudo ip link add virtual_bridge type bridge
sudo ip link set virtual_bridge up

你有一座桥,就是up

只是你继续

之前的一个实验

您的virtual_bridge现在是up,但是您的以太网卡可能是updown。现在,阅读这两种场景,我通过尝试和错误找出。这很重要(!)这样你就能了解你的以太网卡是如何反应的。您可以尝试或不尝试,但我建议您在观看第一个终端进行更改时,完全按照下面所述的方式进行。

场景A:

如果您的以太网卡是down,请使用下面的命令为它分配一个主卡。它将发挥作用:

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 master virtual_bridge

现在打开它:

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 up

你会惊讶于卡不会连接到你的互联网。即使您重新启动它,它也不会成功:

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up

即使你重新启动桥,这是卡的主人,谁应该控制它:

代码语言:javascript
复制
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up

我设法让它连接到互联网的唯一方法是重新启动卡,移除主卡,刷新它以删除所有IP (也许这不是必需的),手动分配一个已知的和工作的IP,然后分配主:

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up
sudo ip addr flush enx24f5a2f17b27
sudo ip addr add 192.168.64.100/24 dev enx24f5a2f17b27
sudo ip link set enx24f5a2f17b27 master virtual_bridge

在这一点上,互联网应该开始工作了。

场景B:

如果您的以太网卡是up,它可能有一个IP和您的互联网必须工作。所以现在尝试给它分配一个母版,下面有一个命令。看起来不错!

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 master virtual_bridge

现在,重新设置桥接多次,并注意卡上发生了什么:

代码语言:javascript
复制
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up

您将看到,每当您启用网桥以太网卡也将启用,它将获得IP和连接到互联网。但一旦你关掉卡片

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 down

它将无法恢复到互联网,无论你复位多少次桥。

这就是为什么最重要的是你首先打开以太网卡,然后给它一个主人,而不是相反的方式!换句话说,当您指定主程序时,应该启用卡片。

步骤3

正如我们从上面的例子中学到的,我们首先(!)打开将获得IP的以太网卡:

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 up

然后我们给它分配一个主人:

代码语言:javascript
复制
sudo ip link set enx24f5a2f17b27 master virtual_bridge

我们创建了一个抽头设备,它就像虚拟机的虚拟以太网卡。这很重要(!)将usergroup分配给它,因为它可能没有适当的特权,否则:

代码语言:javascript
复制
sudo ip tuntap add virtual_tap mode tap user ziga group ziga

现在您已经创建了它,您可以尝试启用它,但是您不会成功,因为只有虚拟机可以这样做:

代码语言:javascript
复制
sudo ip link set virtual_tap up

因此,它将保持在down状态。只需将主从也应用于此:

代码语言:javascript
复制
sudo ip link set virtual_tap master virtual_bridge

你已经完成了网络的建立。请注意,此时您的抽头设备不会有IP。当您启动虚拟机并等待虚拟机自行设置时,它将被分配给它。

步骤4

现在是正确启动虚拟机的时候了。我使用的是最新的-nic命令,它更短,更有能力(!)而不是旧命令(朗读)。不管怎样..。我使用以下命令:

代码语言:javascript
复制
qemu-system-x86_64 -enable-kvm -cpu host -smp cores=3,threads=1 -m 4096 -nic tap,ifname=virtual_tap,script=no,downscript=no -boot order=c -cdrom ~/Dropbox/workspace/racunalnistvo/programi/kvm/iso/centos-8.1.1911-x86_64-dvd1.iso -drive file=~/Dropbox/workspace/racunalnistvo/programi/kvm/vm/windows.qcow2,format=qcow2

如果您省略了选项script=nodownscript=no,上面的comand将返回一个无害的警告: RTNETLINK :操作不允许使用W: /etc/ Qemu :没有为来宾接口找到的桥,这是因为在模拟Qemu尝试自动设置它自己的桥之前&使用脚本/etc/qemu-ifup点击。它还将尝试删除桥&在脚本/etc/qemu-ifdown完成后点击。如果您查看这些脚本,您会发现它们使用的是命令brctl,这是我没有安装的包bridge-utils的一部分,而且脚本会失败!无论如何,我们手动创建了桥和抽头设备,因此我们不需要这些脚本,并且阻止Qemu用script=nodownscript=no调用它们。重写这些脚本以使用iproute2而不是bridge-utils会很有趣,但是您需要root特权来运行它们,专家建议我们不要使用root来运行虚拟机。

虚拟机将启动,连接到互联网,但它将无法平主机!此外,主机将能够连接到互联网,并将能够平平同一网关。但是它将不能平一个虚拟机!

另外,请注意第一个终端,在那里您将看到TAP设备现在已启用,并且它有一个IP,但是这个IP在这里不同于您在虚拟机中看到的那个!有人能解释一下吗?

TODO

这就是我所能理解的,我希望它能帮助到别人。我仍然不知道为什么主机和虚拟机不能同时使用,因为TAP设备应该启用TCP、UDP和ICMP.我怀疑这是因为我必须以某种方式将IP分配给桥(朗读朗读),但我不知道如何选择正确的IP。有人能帮上忙吗?

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/456449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档