第五期 基于QEMU进行实验环境搭建 《虚拟机就是开发板》

        这一期我们来集中解决一个问题:虚拟开发板与主机之间文件共享的方法。在上一期中我们将目标板运行了自己制作的最小Linux系统,然而这个最小系统里面并没有编译环境,也就是说如果我们想编译程序在目标开发板上运行需要先在本地主机上进行交叉编译,然后将生成的二进制目标文件上传到目标开发板上运行,那么问题来了,我们需要一种快捷的文件共享方法。
        使用物理开发板时最常用的方法是NFS,所以我们也通过NFS来共享文件,我们在主机上面建立NFS服务,然后在目标开发板上进行挂载。想实现这个功能需要分成两步来进行:1.主机与目标开发板之间网络连通;2.主机建立NFS服务,目标开发板挂载。
        QEMU提供的4种通信方式与外界联网:
        1. User mode stack:这种方式在qemu进程中实现一个协议栈,负责在虚拟机VLAN和外部网络之间转发数据。可以将该协议栈视为虚拟机与外部网络之间的一个NAT服务器,外部网络不能主动与虚拟机通信。虚拟机VLAN中的各个网络接口只能置于10.0.2.0子网中,所以这种方式只能与外部网络进行有限的通信。此外,可以用-redir选项为宿主机和虚拟机的两个TCP或UDP端口建立映射,实现宿主机和虚拟机在特殊要求下的通信(例如X-server或ssh)。User mode stack通信方式由-net user选项启用,如果不显式指定通信方式,则这种方式是qemu默认的通信方式。
        2. socket:这种方式又分为TCP和UDP两种类型。
                (1). TCP:为一个VLAN创建一个套接字,让该套接字在指定的TCP端口上监听,而其他VLAN连接到该套接字上,从而将多个VLAN连接起来。缺点在于如果监听套接字所在qemu进程崩溃,整个连接就无法工作。监听套接字所在VLAN通过-net socket,listen选项启用,其他VLAN通过-net socket,connect选项启用。
                (2). UDP:所有VLAN连接到一个多播套接字上,从而使多个VLAN通过一个总线通信。所有VLAN都通过-net socket,mcast选项启用。
        3. TAP:这种方式首先需要在宿主机中创建并配置一个TAP设备,qemu进程将该TAP设备连接到虚拟机VLAN中。其次,为了实现虚拟机与外部网络的通信,在宿主机中通常还要创建并配置一个网桥,并将宿主机的网络接口(通常是eth0)作为该网桥的一个接口。最后,只要将TAP设备作为网桥的另一个接口,虚拟机VLAN通过TAP设备就可以与外部网络完全通信了。这是因为,宿主机的eth0接口作为网桥的接口,与外部网络连接;TAP设备作为网桥的另一个接口,与虚拟机VLAN连接,这样两个网络就连通了。此时,网桥在这两个网络之间转发数据帧。
        4. VDE:这种方式首先要启动一个VDE进程,该进程打开一个TAP设备,然后各个虚拟机VLAN与VDE进程连接,这样各个VLAN就可以通过TAP设备连接起来。VDE进程通过执行vde_switch命令启动,各个VLAN所在qemu进程通过执行veqe命令启动,这些VLAN就可以与VDE进程连接了。

        根据我们需要通过NFS通信的方式,选择TAP的方式使主机和虚拟机进行通信。但是虚拟机只需要与主机互联,不需要与外界互联,所以并不需要创建网桥,只要创建一个TAP就可以。
        这里说一下Linux中tun/tap。tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装。利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路中。
        这是官方的解释:
        TUN and TAP are virtual network kernel devices. Being network devices supported entirely in software, they differ from ordinary network devices which are backed up by hardware network adapters.
        TUN (namely network TUNnel) simulates a network layer device and it operates with layer 3 packets like IP packets. TAP (namely network tap) simulates a link layer device and it operates with layer 2 packets like Ethernet frames. TUN is used with routing, while TAP is used for creating a network bridge.
        Packets sent by an operating system via a TUN/TAP device are delivered to a user-space program which attaches itself to the device. A user-space program may also pass packets into a TUN/TAP device. In this case the TUN/TAP device delivers (or "injects") these packets to the operating-system network stack thus emulating their reception from an external source.

        下面开始操作:
        sudo apt-get install uml-utilities    (User-Mode Linux,使用它创建TAP)
        sudo apt-get install bridge-utils    (如果需要创建bridge可以选择安装)
        安装完成后,执行  sudo tunctl -u root -t tap30  就可以在主机上创建一个网络设备,这是使用 ifconfig -a 命令可以看到名字为tap30的网络设备。
        执行 ifconfig tap30 192.168.111.1 promisc up 配置网卡IP地址,并且以混杂模式启用。
        主机的网络配置已经完成,接下来开始配置虚拟机,QEMU通过 -net 参数指定网络配置 
        有三种选项 
                -net nic 必须有的基本配置,macaddr 设置mac地址,model是网卡的类型,可以model=?查看有哪些类型 
                -net tap 使用桥接模式的,需要指定启动脚本 script=和关闭脚本 downscript,fd是指向已经有的tap设备,name是在monitor模式使用info network看到的名字,ifname是tap设备在主机中的名字 
                -net user 用户模式,qemu使用Slirp实现了一整套tcp/ip协议栈 
                一般nic必须有,tap和user选一个使用 
        在上一期启动qemu的脚本中添加两行参数:
                -net nic,vlan=0 \
                -net tap,vlan=0,ifname=tap30,script=no,downscript=no
        然后运行脚本启动虚拟器,可能需要root权限才能启动。启动后在目标开发板中执行  ifconfig -a 就能看到 eth0 的网络接口,默认都是没启用,需要手动开启,在模拟开发板中执行:
        ifconfig eth0 192.168.111.2 promisc up
        成功启动网卡后便可以使用 ping 192.168.111.1 来测试与主机的通信是否正常,下面是运行截图:
        
        目标开发板与主机的通信问题解决后,开始配置并启用NFS服务。在主机中输入:
        sudo apt-get install nfs-kernel-server
        安装NFS服务,NFS服务的配置文件为 /etc/exports ,一个NFS服务可以共享多个NFS目录,在/etc/exports文件中,每个目录的设置独占一行,我要把 /share 目录共享给目标开发板,就在配置文件中加入一行:
        /share    192.168.111.2(rw,sync,no_root_squash,no_subtree_check)
        保存配置文件并退出,执行 sudo service nfs-kernel-server start 启动NFS 服务;可以在主机上运行 showmount -e 来查看NFS服务和配置是否启动正常。
         主机上的NFS服务启动成功后,进入模拟开发板中,通过mount 命令挂载NFS目录,在目标开发板中执行:
        mkdir -p /mnt/nfs
        mount -t nfs -o nolock 192.168.111.1:/share /mnt/nfs
        这里需要注意一下:-o nolock 参数不能省略,nfs mount 默认选项包括文件锁,依赖于portmap提供的动态端口分配功能,而我们的最小Linux系统并没有启用portmap功能,所以不启用文件锁功能,否则会提示如下错误:
        svc: failed to register lockdv1 RPC service (errno 111). 
        lockd_up: makesock failed, error=-111 
        mount: mounting 192.168.1111.1:/share on /mnt/nfs failed: Connection refused

        挂载成功后进入目标开发板的 /mnt/nfs 目录便可以将主机的 /share 文件夹作为本地文件夹来操作,这样会很大的提高应用程序的调试运行效率。
------------------------------分割线------------------------------
        到这里我么这一期的问题就已经解决了,再多说一点,Linux中的NFS服务配置比Samba服务简单多了,所以在Linux与Windows的简单文件共享中也可以通过NFS的方式来操作,在 Window 7 中可以通过以下方法启用NFS挂载功能:
        
        成功添加Windows中的NFS客户端后,在Windows的CMD中输入showmount -e xxx.xxx.xxx.xxx(服务器IP地址)  来查看可用的挂载目录。
        然后用 mount IP:/挂载目录 盘符:  命令即可挂载完成NFS共享目录的挂载,下面是运行截图: 
        
        
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值