用TAP方式让QEMU虚拟机与host联网

转载自  cgjvcd 最终编辑  cgjvcd

QEMU虚拟机网络的缺省模式是NAT方式,即虚拟机可以通过host访问外网,但host和外网无法访问虚拟机。如果要想让host访问虚拟机,则可以使用TAP方式。 

1、确认host的内核支持TAP/TUN设备 
使用TAP方式的前提是host的内核支持TAP/TUN。现在的linux发行版一般都通过内核模块的方式支持TAP/TUN。如果host存在 /dev/net/tun 设备文件,则说明它支持TAP/TUP。如果不存在这个设备文件,则可以试试执行 
modprobe tun 
命令。 
如果不存在tun内核模块,可以自己编译。TUN模块的内核配置项位于: 
Device Driver --> Networking support --> Universal TUN/TAP device driver support 
编译好的模块位于linux源码目录下的 
drivers/net/tun.ko,需要把它拷贝到 
/lib/modules/<kernel-release>/kernel/drivers/net/ 
目录,并执行 
depmod 
命令重建模块依赖关系。 

2、编写QEMU的TAP初始化脚本 
QEMU的TAP初始化脚本缺省是 /etc/qemu-ifup,它的内容很简单: 
#!/bin/sh 
/sbin/ifconfig $1 192.168.0.11 
/etc/qemu-ifup文件需要增加可执行的权限。 

3、虚拟机的网络设置 
虚拟机的启动命令行增加网络参数 
-net nic -net tap 
即可启动TAP网络模式。注意:因为创建TAP网卡需要root权限,所以必须用root用户启动QEMU。 
虚拟机启动后,用ifconfig命令设置网络,要求它的IP与host的tap网口的IP(即在上个步骤里qemu-ifup文件中设置的IP)处于同一网段。例如: 
ifconfig eth0 192.168.0.110 netmask 255.255.255.0 

再验证与host的联网: 
在虚拟机上执行 
ping 192.168.0.11 
在host机上执行 
ping 192.168.0.110 
都应能正确ping通,说明虚拟机与host已正常联网,host机通过192.168.0.110与虚拟机通信。 

4、使普通用户能执行 
上面的方法美中不足的是必须用root用户启动QEMU虚拟机。要使普通用户能执行,需要写一个执行QEMU的脚本 qemu-tap: 
#!/bin/sh 
USERID=`whoami` 
iface=`sudo tunctl -b -u $USERID` 
ranmac=$(echo -n DE:AD:BE:EF ; for i in `seq 1 2`; \ 
do echo -n `echo ":$RANDOM$RANDOM" | cut -n -c -3` ;done) 
qemu $@ -net nic,vlan=0,macaddr=$ranmac -net tap,vlan=0,ifname=$iface 
sudo tunctl -d $iface $> /dev/null 
脚本中的tunctl命令是user mode linux ,在debian系统要安装uml-utilities软件包。另外,还需要用visudo命令配置普通用户执行tunctl命令的权限。 

这个脚本源自http://calamari.reverse-dns.net:980/cgi-bin/moin.cgi/FrequentlyAskedQuestions#head-2511814cb92c14dbe1480089c04f83c281117a86,详细说明请参考原文。 

5、虚拟机通过host连接internet 
现在实现了虚拟机和host的联网,如果需要虚拟机连接internet,则要在host设置NAT: 
echo 1 > /proc/sys/net/ipv4/ip_forward 
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE 

有关NAT联网的其他信息,也可参考我的另一篇文章:http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-205940.html 

6、Windows主机的配置
如果host是windows系统,则配置方法如下:
(1)安装windows系统的TAP驱动程序
可下载openvpn安装程序(http://openvpn.net/index.php/downloads.html),只安装其中的TAP驱动。
(2)在windows的控制面板的网络连接设置程序中设置TAP网卡的IP和netmask等参数,并把网卡名称改为tap
(3)虚拟机启动命令行中增加网络参数
-net nic -net tap,ifname=tap

http://linuxman.jiang.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-1472386.html


### 安装和配置 QEMU 的过程 #### 1. 安装必备的环境软件包 为了在虚拟机环境中成功安装并运行 QEMU,首先需要确保已安装必要的依赖项。可以通过以下命令完成这些工具的安装: ```bash sudo apt update && sudo apt upgrade -y sudo apt install qemu-kvm qemu-system qemu-utils python3 python3-pip libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon virt-manager -y ``` 上述命令会安装一系列用于支持 KVM 和 QEMU 运行的基础组件[^1]。 --- #### 2. 配置 ARM 环境模拟 如果目标是模拟 ARM 架构,则可以考虑两种方式创建根文件系统:通过 `dd` 命令制作镜像或者使用 NFS 挂载共享目录。后者更推荐,因为它允许主机虚拟化环境之间的数据实时同步。 以下是基于 NFS 的具体实现步骤: - **设置 NFS 导出路径** 在宿主机上编辑 `/etc/exports` 文件,添加如下内容以导出指定目录作为根文件系统的挂载点: ```plaintext /path/to/rootfs *(rw,sync,no_subtree_check) ``` 接着重启 NFS 服务使更改生效: ```bash sudo systemctl restart nfs-server ``` - **启动 QEMU 并挂载远程 NFS** 使用 `-kernel`, `-append`, 及其他参数加载内核以及传递引导选项的同时,还需指定网络接口并通过 NFS 提供根文件系统访问权限。例如: ```bash qemu-system-arm \ -M versatilepb \ -m 256M \ -nographic \ -net nic,model=rtl8139 \ -net user,hostfwd=tcp::2222-:22 \ -kernel vmlinuz \ -initrd initrd.img \ -append "root=/dev/nfs rw nfsroot=<your_host_ip>:/path/to/rootfs ip=dhcp" ``` 此脚本定义了一个基础 ARM 虚拟平台模型 (`versatilepb`) ,分配内存大小为 256MB,并启用了图形控制台禁用模式 (-nographic)[^2]。 --- #### 3. 网络连接调整 对于网络部分,QEMU 支持多种不同的联网机制,包括用户态网络 (User Mode Networking),TAP 设备桥接等。其中最简单的方式便是利用内置的 SLIRP 协议栈(即 User Mode Networking),它无需额外配置即可提供基本 Internet 访问功能;而 TAP 则更适合复杂场景下的完全路由需求。 下面展示如何借助 Bridge 实现完整的外部通信能力: - 创建网桥设备 ```bash brctl addbr br0 ifconfig eth0 0.0.0.0 up brctl addif br0 eth0 dhclient br0 ``` - 修改 QEMU 启动指令加入新建立好的网卡映射关系: ```bash qemu-system-x86_64 ...other options... \ -net tap,ifname=tap0,script=no,downscript=no \ -net bridge,br=br0 ``` 更多细节可查阅相关文档进一步理解其工作原理[^3]。 --- ### 总结 综上所述,从初步准备到深入定制,整个流程涵盖了必要软件集合部署、ARM仿真架构搭建以及高级网络设定等多个方面。每一步都至关重要,缺一不可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值