• 我们在哪一颗星上见过 ,以至如此相互思念 ;我们在哪一颗星上相互思念过,以至如此相互深爱
  • 我们在哪一颗星上分别 ,以至如此相互辉映 ;我们在哪一颗星上入睡 ,以至如此唤醒黎明
  • 认识世界 克服困难 洞悉所有 贴近生活 寻找珍爱 感受彼此

ubuntu20搭建QEMU

软件操作 云涯 4年前 (2021-02-08) 4092次浏览

1 概述

QEMU(quick emulator)是一款由法布里斯·贝拉(Fabrice Bellard)等人编写的免费的可执行硬件虚拟化的(hardware virtualization)开源托管虚拟机(VMM)。其与Bochs,PearPC类似,但拥有高速(配合KVM),跨平台的特性。

QEMU是一个托管的虚拟机镜像,它通过动态的二进制转换,模拟CPU,并且提供一组设备模型,使它能够运行多种未修改的客户机OS,可以通过与KVM(kernel-based virtual machine开源加速器)一起使用进而接近本地速度运行虚拟机(接近真实电脑的速度)。

QEMU还可以为user-level的进程执行CPU仿真,进而允许了为一种架构编译的程序在另外一种架构上面运行(借由VMM的形式)。

1.1 QEMU和KVM的关系

QEMU是个计算机模拟器,而KVM为计算机的模拟提供加速功能。

KVM(Kernel Virtual Machine)是Linux的一个内核驱动模块,它能够让Linux主机成为一个Hypervisor(虚拟机监控器)。在支持VMX(Virtual Machine Extension)功能的x86处理器中,Linux在原有的用户模式和内核模式中新增加了客户模式,并且客户模式也拥有自己的内核模式和用户模式,虚拟机就是运行在客户模式中。KVM模块的职责就是打开并初始化VMX功能,提供相应的接口以支持虚拟机的运行。

QEMU(quick emulator)本身并不包含或依赖KVM模块,而是一套由Fabrice Bellard编写的模拟计算机的自由软件。QEMU虚拟机是一个纯软件的实现,可以在没有KVM模块的情况下独立运行,但是性能比较低。QEMU有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化以及I/O设备的虚拟化。QEMU是一个用户空间的进程,需要通过特定的接口才能调用到KVM模块提供的功能。从QEMU角度来看,虚拟机运行期间,QEMU通过KVM模块提供的系统调用接口进行内核设置,由KVM模块负责将虚拟机置于处理器的特殊模式运行。QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化加速以提高虚拟机的性能。

KVM只模拟CPU和内存,因此一个客户机操作系统可以在宿主机上跑起来,但是你看不到它,无法和它沟通。于是,有人修改了QEMU代码,把他模拟CPU、内存的代码换成KVM,而网卡、显示器等留着,因此QEMU+KVM就成了一个完整的虚拟化平台。

KVM只是内核模块,用户并没法直接跟内核模块交互,需要借助用户空间的管理工具,而这个工具就是QEMU。KVM和QEMU相辅相成,QEMU通过KVM达到了硬件虚拟化的速度,而KVM则通过QEMU来模拟设备。对于KVM来说,其匹配的用户空间工具并不仅仅只有QEMU,还有其他的,比如RedHat开发的libvirt、virsh、virt-manager等,QEMU并不是KVM的唯一选择。

1.2 QEMU网络策略

QEMU 本质上也是一款虚拟化软件,功能定位是利用现有的硬件资源去模拟各种架构的系统。

QEMU提供四种网络通信方式:

  1. User mode stack(用户协议栈方式):在 QEMU 进程中实现一个协议栈,这个协议栈可以被视为一个主机与虚拟机之间的 NAT 服务器,它负责将 QEMU 所模拟的系统网络请求转发到外部网卡上面,从而实现网络通信。但是不能将外面的请求转发到虚拟机内部,并且虚拟机 VLAN 中的每个接口必须放在 10.0.2.0 子网中。
  2. ocket: 为 VLAN 创建套接字,并把多个 VLAN 连接起来。
  3. TAP/bridge:网桥模式,将QEMU与宿主机通过网桥进行连接
  4. VDE:用于VLAN连接

1.3 TAP/TUN

TAP/TUN 是 Linux 内核 2.4.x 版本之后实现的虚拟网络设备,不同于物理网卡靠硬件网路板卡实现,TAP/TUN 虚拟网卡完全由软件来实现,功能和硬件实现完全没有差别,它们都属于网络设备,都可以配置 IP,都归 Linux 网络设备管理模块统一管理。

作为网络设备,TAP/TUN 也需要配套相应的驱动程序才能工作。TAP/TUN 驱动程序包括两个部分,一个是字符设备驱动,一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动负责数据包在 TCP/IP 网络协议栈上的传输和处理。

TUN 工作在网络层,而 TAP 工作在数据链路层,TUN 负责与应用程序交换 IP 数据包,而 TAP 与应用程序交换以太网帧。所以 TUN 经常涉及路由,而 TAP 常用于网络桥接。

2 UBUNTU20安装QEMU

2.1 Ubuntu20网络配置

ubuntu使用NAT模式或者网桥模式都可以。

在虚拟网络编辑器中开启NAT模式,让ubuntu可以分配到IP地址。

2.2 基础安装

sudo apt install qemu    安装qemu

sudo apt install qemu-kvm    安装kvm

sudo apt install qemu-system-mips 要安装mips系统

2.3 网络配置

使用网桥(在两张网卡之间搭建一座桥 网卡B通过网桥流量到网卡A再到internet)进行连接。

Ubuntu使用网卡ens33(或eth0)进行通信。先不要给ens33(或eth0)分配IP地址,先搭建网桥。

sudo apt install bridge-utils 安装虚拟网桥工具

sudo apt install uml-utilities 安装(UML user-mode linux) 工具

sudo brctl addbr br0 添加名为br0的网桥

sudo brctl addif br0 ens33(或其他) 在br0网桥中添加一个接口

sudo ifconfig br0 0.0.0.0 promisc up 启用br0接口

sudo ifconfig ens33 0.0.0.0 promisc up 启用ens33接口

sudo dhclient br0 从dhcp服务器给br0分配IP地址

此时br0已经获取到IP,并且能够连接网络的网卡ens33也加入到了网桥。

桥的另一端已经连接了ens33,只需要把虚线框处连接到QEMU虚拟机上即可。

创建TAP设备,作为QEMU接口。

sudo tunctl -t tap0 -u root(用户名) 创建一个tap0接口

sudo brctl addif br0 tap0 在网桥br0增加tap0接口

sudo ifconfig tap0 0.0.0.0 promisc up 启用tap0接口

sudo brctl showstp br0 显示br0各个接口

这样就把网桥联通。

sudo brctl addbr br0&&sudo brctl addif br0 ens33&&sudo ifconfig br0 0.0.0.0 promisc up&&sudo ifconfig ens33 0.0.0.0 promisc up&&sudo dhclient br0&&sudo tunctl -t tap0 -u root&&sudo brctl addif br0 tap0&&sudo ifconfig tap0 0.0.0.0 promisc up&&sudo brctl showstp br0

 

接下来使用TAP网络连接模式启动镜像即可。

这里以mips系统启动为例。

从https://people.debian.org/~aurel32/qemu/mips/下载debian mips 的qemu镜像。

2.4 启动镜像

sudo qemu-system-mips -m 512 -smp 2 -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append “root=/dev/sda1 console=tty0” -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no

-M malta 支持的机器类型

-kernel 加载内核文件

-hda 硬盘

-nographic 不用图形化界面

-net nic 表示希望 QEMU 在虚拟机中创建一张虚拟网卡

-net tap 表示连接类型为 TAP,并且指定了网卡接口名称(就是刚才创建的 tap0,相当于把虚拟机接入网桥

script 和 downscript 两个选项的作用是告诉 QEMU 在启动系统的时候是否调用脚本自动配置网络环境,如果这两个选项为空,那么 QEMU 启动和退出时会自动选择第一个不存在的 tap 接口(通常是 tap0)为参数,调用脚本 /etc/qemu-ifup 和 /etc/qemu-ifdown。由于我们已经配置完毕,所以这两个参数设置为 no 即可。

到了mips里查看虚拟机IP地址或者ping baidu.com。

但是网络配置之后,重启就会丢失。

ubuntu20 是netplan设置网络,可以配置。

之后使用ssh连接mips,传递文件。然后利用gbdserver调试

gdbserver: https://github.com/pr0xy-t/static-gdbserver、https://github.com/lucyoa/embedded-tools、http://ftp.debian.org/debian/pool/main/g/gdb/

gdb:https://ftp.gnu.org/gnu/gdb/


云涯历险记 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:ubuntu20搭建QEMU
喜欢 (4)