简介 #
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 #查看是否加入桥
Resources
- 如何在Ubuntu上安装QEMU/KVM创建虚拟机
- 在QEMU(快速模拟器)上的虚拟机中运行Ubuntu
- 在 Ubuntu 上安装和使用 Qemu
- 制作自动安装Ubuntu22.04-server的iso镜像以及安装过程详解
- Linux实现KVM+QEMU+libvirt的虚拟机环境 并使用virsh对虚拟机进行管理
- 全自动化系统安装
- Introduction to autoinstall
- ubuntu20.04打包iso镜像自动安装
kubevirt
其他 #
Resources