Skip to main content

QEMU

·651 words·4 mins
WFUing
Author
WFUing
A graduate who loves coding.
Table of Contents

简介
#

VirtualBox 与 QEMU

VirtualBox 提供用户友好的 GUI,适合想要以简单方式在桌面上运行虚拟机的用户。相比之下,QEMU 提供更多的控制和灵活性,但通常需要命令行交互。两者之间的选择取决于您的具体用例和偏好。

两者之间存在一些关键差异:

  • Emulation:QEMU 可以仿真各种硬件,包括 CPU、内存控制器和设备。另一方面,VirtualBox 主要设计用于虚拟化 x86 和 AMD64 系统。
  • Performance:QEMU 通常比 VirtualBox 更快,尤其是在运行模拟系统时。
  • Compatibility:QEMU 比 ​​VirtualBox 更兼容更广泛的客户操作系统。

QEMU 的优势

  • Versatility: QEMU 可以模拟各种硬件并运行各种客户操作系统。
  • Performance: QEMU 通常比其他虚拟化软件更快,尤其是在运行模拟系统时。
  • Compatibility: 与其他虚拟化软件相比,QEMU 与更广泛的客户操作系统兼容。
  • Open source: QEMU 是免费的开源软件,这意味着它会不断得到改进和更新。

QEMU 的缺点

  • Complex Configuration: QEMU 的命令行界面和配置文件对于初学者来说可能会令人望而生畏。
  • Performance Overhead: 与 KVM 等虚拟化解决方案相比,仿真往往会产生更多的性能开销。
  • Limited GUI: QEMU 的默认界面是基于命令行的,这可能不像 VirtualBox 的 GUI 那样用户友好。

QEMU vs. KVM

  • KVM (Kernel-based Virtual Machine) 是一种内置于 Linux 内核中的虚拟化技术。它使用硬件虚拟化功能在单个主机系统上运行多个虚拟机。
  • QEMU 和 KVM 可以一起使用,提供更高效、更强大的虚拟化解决方案。QEMU可以用来模拟KVM不支持的硬件,并且KVM可以用来为虚拟机提供更好的性能。

Use QEMU
#

1. 更新系统

sudo apt update && sudo apt upgrade -y 

2. 检查CPU和虚拟化是否开启:

LC_ALL=C lscpu | grep Virtualization

如果是 intel 处理器,它应该带来以下输出:

如果是 AMD 处理器,它应该会为您提供以下输出:

Virtualization:                  AMD-V
egrep -c '(vmx|svm)' /proc/cpuinfo

如果输出大于 0,则 CPU 虚拟化已启用。否则,您需要在系统 BIOS 中启用它。

3. 安装QEMU

使用 sudo apt install qemu 即可在 Ubuntu 中安装 QEMU,安装完成后会有很多以 qemu- 开头的命令,如:

  • qemu-system-i386:用于模拟 32 位的 80386 硬件环境
  • qemu-system-x86_64:用于模拟 64 位的 x86 硬件环境
  • qemu-system-arm:用于模拟 ARM 硬件环境

这些命令又可以分为以 qemu-system- 开头和以 qemu- 开头,

  • qemu-system- 开头的用于在模拟的硬件环境上运行整个系统;
  • qemu- 开头的用于在模拟的硬件环境上运行某个程序,而非整个系统。
qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon

4. 启用并启动libvirtd服务

sudo systemctl enable --now libvirtd

5. 安装 Virt-Manager

sudo apt install virt-manager -y

Virt-Manager 是一个用于管理虚拟机的 GUI 工具。

6. 使用 QEMU

安装 QEMU 后,您就可以开始使用它来创建和运行虚拟机。

要创建新的虚拟机,可以使用以下命令:

qemu-kvm -name <vm_name> -m <memory_size> -cdrom <iso_file>

这将创建一个具有指定名称、内存大小和 ISO 文件的新虚拟机。

使用 QEMU 模拟一个硬件环境并运行整个系统的命令格式为

qemu [options] [disk_image]

其中 disk_image 即硬盘镜像文件。其常用的参数如下:

  • -hda file:使用 file 作为硬盘 0 的镜像文件。
  • -m megs:设定虚拟内存为 megs M 字节,默认为 128 M 字节。
  • -smp n:设置为有 n 个 CPU 的 SMP 系统。

值得注意的是,QEMU 的启动需要有图形界面,若未安装图形界面,则会报错:

Could not initialize SDL(No available video device) - exiting

若要无图形界面启动需要加参数 -nographic

要启动虚拟机,可以使用以下命令:

qm launch <vm_name>

要停止虚拟机,可以使用以下命令:

qm stop <vm_name>

Resources

在QEMU上的虚拟机中运行Ubuntu
#

首先,我们需要获取将在虚拟机中运行的 Linux 发行版的iso映像。在此示例中,我们将使用 Ubuntu 24.04 LTS,您可以在此链接中找到它(https://ubuntu.com/download/desktop)

iso文件下载完成后,使用QEMU创建一个虚拟硬盘映像,例如创建一个大小为20GB的qcow2格式硬盘映像:

qemu-img create -f qcow2 ubuntu-vm.qcow2 20G

启动虚拟机

qemu-system-x86_64 \
  -m 2048 \
  -cpu max \
  -smp 2 \
  -boot d \
  -drive file=ubuntu-vm.qcow2,format=qcow2 \
  -cdrom ubuntu-22.04.4-live-server-amd64.iso \
  -vnc :1 \
  -net nic \
  -net user,hostfwd=tcp::2222-:22 \
  -nographic
  • -m 2048:分配2048 MB内存给虚拟机。
  • -cpu host:使用与宿主机相同的CPU型号。
  • -smp 2:分配2个CPU核心。
  • -boot d:从光驱启动,即ISO文件。
  • -drive:指定硬盘文件和格式。
  • -cdrom:指定ISO文件路径。
  • -vnc :1:开启VNC服务,在5901端口监听(因为VNC端口是5900+N,这里N=1)。
  • -net nic:创建一个网络接口。
  • -net user:使用用户模式网络,包括端口转发设置,这里把宿主机的2222端口转发到虚拟机的22端口,以便SSH访问。
  • -nographic:不启用图形输出。

qemu的标准选项

# qemu的标准选项主要涉及指定主机类型、CPU模式、NUMA、软驱设备、光驱设备及硬件设备等。
-name name		# 虚拟机名称
-M machine		# 指定要模拟的主机类型,如standard PC,ISA-only PC或Intel-Mac等,可以使用“qemu-kvm -M ?”获取所支持的所有类型
-m megs			# 设定虚拟机的RAM大小
-cpu model		# 设定CPU模型,如coreduo、qemu64等,可以使用"qemu-kvm -cpu ?"获取所支持的所有模型
-smp n			# 设定模拟的SMP架构中CPU的个数
    [,cores=cores]		# 每个CPU的核心数
    [,threads=threads]  # 线程数
    [,sockets=sockets]  # CPU的socket数目
    [,maxcpus=maxcpus]  # 用于指定热插入的CPU个数上限
-numa   非一致内存访问
-numa opts:指定模拟多节点的numa设备
 
-fda file:
-fdb file:使用指定文件(file)作为软盘镜像,file为/dev/fd0表示使用物理软驱
-hda file:
-hdb file:
-hdc file:
-hdd file:使用指定file作为硬盘镜像
-cdrom file:使用指定file作为CD-ROM镜像,需要注意的是-cdrom和-hdc不能同时使用:将file指定为/dev/cdrom可以直接使用物理光驱
 
-drive						# 定义一个硬盘设备:可用子选项有很多
    file=/path/to/somefile	# 硬盘映像文件
    if=interface			# 硬盘设备接口类型 ide、scsi、sd、virtio(半虚拟化)
    index=index				# 设定同一种控制器类型中不同设备的索引号,即标识号
    media=media				# 定义介质类型为硬盘还是光盘disk、cdrom
    snapshot=snapshot		# 指定当前硬盘设备是否支持快照功能:on或off
    cache=cache				# 定义如何使用物理机缓存来访问块数据,其可用值有none、writeback、unsafe和writethrough四个
    format=format			# 指定映像文件的格式,具体格式可参见qemu-img命令
 
-boot [order=drives][,once=drives][,menu=on|off]	# 定义启动设备的引导次序,每种设备使用一个字符表示:不同的架构所支持的设备及其表示字符不尽相同,在x86 PC架构上,a、b表示软驱,c表示第一个光驱设备,n-p表示网络适配器,默认为硬盘设备。例如:-boot order=dc,once=d

qemu显示选项

显示选项用于定义虚拟机启动后的显示接口相关类型及属性等。

SDL 
 -sdl			# 启用SDL
 
VNC
 -vnc display [option,option]	# 默认情况下,qemu使用SDL显示VGA输出;使用-vnc选项,可以让qemu监听在vnc上,并将VGA输出重定向至vnc会话,使用此选项时,必须使用-k选项指定键盘布局类型;其中有许多子选项,具体请参考qemu的手册
    display
        1、host:N				# N为控制台号
            192.168.1.1:1		# 5900为起始端口
        2、unix:/path/to/socket_file					# 监听在套接字
        3、none					# 不显示
    option
        password				# 连接时需要验证密码,设定密码通过monitor接口使用change
        reverse					# “反向”连接至某处于监听状态的vncview上
 
-vga type		# 指定要仿真的VGA接口类型,常见的类型有:
	cirrus: Cirrus Logic GD5446显示卡
	std:带有Bochs VBI扩展的标准VGA显示卡
	vmware:VMware SVGA-II兼容的显示适配器
	qxl:QXL半虚拟化显示卡:与VGA兼容,在Guest中安装qxl驱动后能以很好的方式工作,在使用spice协议时推荐使用此类型
	none:禁用VGA卡
 
-monitor stdio	# 在标准输入输出上显示monitor界面
-nographic		# 默认情况下,qemu使用SDL来显示VGA输出,而此选项用于禁止图形接口,此时,qemu类似一个简单的命令行程序,其仿真串口设备将被重定向到控制台
-curses			# 禁止图形接口,并使用curses/ncurses作为交互接口
-alt-grab		# 使用Ctrl+Alt+Shift组合键释放鼠标
-ctrl-grab		# 使用右Ctrl键释放鼠标
-spice option[,option[,...]]	# 启用spice远程桌面协议:其中有许多子选项,具体请参照qemu-kvm手册。

网络属性相关选项

nic     #定义网络接口
-net nic [,vlan=n,macaddr=n,model=type,name=name,addr=addr,vectors=v]		# 创建一个新的网卡设备并连接至vlan n中:PC架构上默认的NIC为e1000,macaddr用于为其制定mac地址,name用于指定一个在监控时显示的网上设备名称;qemu可以模拟多个类型的网卡设备,如virtio、i82557b、i82559er、ne2k_isa、pcnet、rtl8139、e1000、smc91c111、lance及mcf_fec等;不过,不同平台架构上,其支持的类型可能只包含前述列表中的一部分,可以使用qemu-system-x86_64 -net nic,model=?来获取当前平台支持的类型。
    vlan		# vlan号
    macaddr		# mac地址(mac 默认不变)
    model		# e1000 virtio
    name		# 设备名
    addr		# ip地址
 
tap     #nic管理虚拟机中的接口,tap就是管理宿主机上的对应接口
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][,downscript=dfile]		# 通过物理机的TAP网络接口连接至vlan n中,使用script=file指定的脚本(默认为/etc/qemu-ifup)来配置当前网络接口,并使用downscript=file指定的脚本(默认为/etc/qemu-ifdown)来撤销接口配置;使用script=no和downscript=no可分别用来禁止执行脚本。
 
user
-net user[,option][,option][,...]:在用户模式配置网络栈,其不依赖于管理权限;有效选项有:
	vlan=n			# 连接至vlan n,默认n=0
	name=name		# 指定接口的显示名称,常用于监控模式中
	net=addr[/mask]	# 设定GuestOS中可见的IP网络,掩码可选,默认为10.0.2.0/8
	host=addr		# 指定GuestOS中看到的物理机的IP地址,默认为指定网络中的第二个,即x.x.x.2
	dhcpstart=addr	# 指定DHCP服务地址池中16个地址的起始IP,默认为第16个至第31个,即x.x.x.16-x.x.x.31
	dns=addr		# 指定GuestOS可见的dns服务器地址,默认为GuestOS网络中的第3个地址,即x.x.x.3
	tftp=dir		# 激活内置的tftp服务器,并使用指定的dir作为tftp服务器的默认根目录
	bootfile=file	# BOOTP文件名称,用于实现网络引导GuestOS,如:qemu -hda linux.img -boot n -net user,tftp=/tftpserver/pub,bootfile=/pexlinux.0

kvm的网络模型

1、隔离模型
    使用bridge连接各个虚拟机但不关联物理网卡
2、nat模型
    在路由模型上添加nat规则 iptables
3、路由模型
    在隔离模型的基础之上添加一个虚拟网卡,开启路由转发功能。
    需要虚拟机指定虚拟网卡的ip为网关
    需要在要通信的主机或路由添加回复报文的路由条目
4、桥接模型
    在隔离模型的bridge上添加物理网卡
    将物理网卡变为bridge,将原来的IP放到一张虚拟网卡并添加到桥上
dhcp        服务器
namespace   名称空间

手动创建bridge

yum install bridge-utils    #安装工具包
rpm -ql bridge-utils    #查看utils释放的文件
brctl -h                #查看帮助
brctl addbr br0         #添加网桥
ifconfig -a             #查看全部接口
brctl stp br0 off       #关闭生成树
ip link set br0 up      #启动br0设备
ip addr del 192.168.1.50/24 dev ens33   #拆除物理网卡ip
ip addr add 192.168.1.50/24 dev br0     #添加ip
ip a                    #ip是否添加成功
ping 192.168.1.50       #检查ip可用
ip link set dev ens33 master br0        #物理网卡加入桥接设备
brctl show      #查看是否加入桥

常用的 virsh 命令选项

Resources

kubevirt

其他
#

Resources