Mai*_*oID 12 linux networking qemu
我试图从访客 ping 到我的主机网络但没有成功。
qemu-system-x86_64 -hda debian_squeeze_amd64_standard.qcow2 -netdev user,id=user.0 -device e1000,netdev=user.0
Run Code Online (Sandbox Code Playgroud)
我尝试 ping 一个随机机器:
$ ping 10.0.2.21
Destination Host Unreachable
Run Code Online (Sandbox Code Playgroud)
在来宾中,我只能 ping 主机 10.0.2.2(DHCP 服务器)。
小智 12
QEMU 在 SLIRP 后端支持 ICMP。有必要允许内核中的用户使用所谓的 ping 套接字(PF_INET、SOCK_DGRAM、PROT_ICMP)。
很简单
sysctl -w net.ipv4.ping_group_range='0 2147483647'
Run Code Online (Sandbox Code Playgroud)
另见http://lwn.net/Articles/422330/
从 QEMU wiki,QEMU 不支持 SLIRP 后端的 ICMP。
用户网络 (SLIRP)
这是默认的网络后端,通常是最容易使用的。它不需要根/管理员权限。它有以下限制:
- 有很多开销所以性能很差
- ICMP 流量不起作用(因此您不能在来宾中使用 ping)
- 不能从主机或外部网络直接访问来宾
对于 ICMP 工作,您需要使用 TAP、VDE 或 Socket。
更多信息: QEMU Wiki - 网络以及维基教科书 QEMU 网络部分
还推荐:处理 VLAN 的高级指南
我为自己找到的最简单、更有效的方法就是这个。
总结一下,在主机上:
tunctl -u <username>
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/conf/wlan0/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/tap0/proxy_arp
ip link set tap0 up
route add -host 192.168.0.20 dev tap0 <-- to be changed by you.
Run Code Online (Sandbox Code Playgroud)
对于客人来说,只需运行它:
kvm -hda ~/fedora.qcow2 -net nic -net tap,ifname=tap0,script=no -usb
Run Code Online (Sandbox Code Playgroud)
或者
qemu -hda ~/fedora.qcow2 -net nic -net tap,ifname=tap0,script=no -usb
Run Code Online (Sandbox Code Playgroud)
您只需配置一个tap
由您的用户拥有的设备,在您的主机和访客之间启用arp proxying
和配置route
。
wlan0
作者(和我自己)用它来处理桥接到Linux 内核不支持的设备的问题。但它在有线连接下也能正常工作。在arp
配置中,只需更改wlan0
为eth0
.
访客IP地址必须由您设置,因为DHCP
不起作用。
您已经可以 ping 通您的主机了。