virtualbox+qemu-kvm部署嵌套虚拟化环境

背景:

家里有一台闲置的台式机,安装的win11想给配置起来供平时做一些Linux kvm虚拟化测试使用,所以考虑通过virtualbox 部署启动一个linux 虚拟机,然后再在这个Linux虚拟机中安装libvirtd, qemu-kvm这些,方便自己快速通过xml 生产虚拟机使用

1.安装virtualbox软件

安装一个centos虚拟机,保证宿主机能访问虚拟机,同时虚拟机内要能访问外网

注意这里虚拟机网络要配置两个网卡, 网络地址转换NAT可以保证通过默认的10.0.2.2网关访问外网 默认网卡为enp0s3 仅主机host网络保证从宿主机可以访问到对应的虚拟机,默认网卡为enp0s8

2. 在centos虚拟机中安装嵌套虚拟化需要的组件

确认cpu虚拟化扩展是否支持,一般Intel都支持了VT cat /proc/cpuinfo |egrep 'vmx|svm'

yum install -y qemu-kvm libvirtd bridge-utils 安装完毕后重启虚拟机,确认kvm 内核模块是否加载

启动libvirtd服务 systemctl status libvirtd systemctl start libvirtd systemctl enable libvirtd

brctl addbr br0 创建网桥

virsh list --all (可以用这个命令查看kvm 虚拟机列表) 注意,如果后续启动报权限问题,可以chmod 666 -R /XXXPATH先解决权限问题

ini 复制代码
# vm1.xml 

<domain type='kvm'>  //如果是Xen,则type='xen'
  #虚拟机整体信息
  <name>vm1</name> //虚拟机名称,同一物理机唯一
  <uuid>fd3535db-2558-43e9-b067-314f48211343</uuid>  //同一物理机唯一,可用uuidgen生成
  <memory>524288</memory>  //单位为KB
  <currentMemory>524288</currentMemory>  //memory这两个值最好设成一样
  <vcpu>1</vcpu> //vcpu个数

  #系统信息
  <os>
    <type arch='x86_64'>hvm</type> //arch指出系统架构类型,machine 则是机器类型,查看机器类型:qemu-system-x86_64 -M ?
    <boot dev='cdrom'/>  //启动介质,第一次需要装系统可以选择cdrom光盘启动;之后可以修改为'hd'
    <bootmenu enable='yes'/>  //表示启动按F12进入启动菜单
  </os>

  #硬件资源特性
  <features>
    <acpi/>  //Advanced Configuration and Power Interface,高级配置与电源接口
    <apic/>  //Advanced Programmable Interrupt Controller,高级可编程中断控制器
    <pae/>   //Physical Address Extension,物理地址扩展
  </features>
  <clock offset='localtime'/>  //虚拟机时钟设置,这里表示本地本机时间

  #突发事件处理
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>

  #设备配置
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator> //如果是Xen则是/usr/lib/xen/binqemu-dm
    <serial type='pty'>
        <target port='0'/>
    </serial>
    <console type='pty'>
       <target type='serial' port='0'/>
    </console>

   #硬盘配置
   <disk type='file' device='cdrom'>
     <driver name='qemu' type='raw'/>
     <source file='/root/eric.feng/test/CentOS-7-x86_64-Minimal-2009.iso'/>
     <target dev='hdb' bus='ide'/>
     <readonly/>
     <address type='drive' controller='0' bus='1' unit='0'/>
   </disk>

   <disk type='file' device='disk'>
     <driver name='qemu' type='qcow2'/>
     <source file='/root/eric.feng/test/vm1.qcow2'/>
     <target dev='vda' bus='virtio'/>
   </disk>

   #添加网络配置,基于网桥
   <interface type='bridge'>
     <source bridge='br0'/>
     <target dev='vnet0'/>
     <alias name='net0'/>
     <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
   </interface>

   #配置vnc
   <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0' keymap='en-us'>
     <listen type='address' address='0.0.0.0'/>
   </graphics>
  </devices>
</domain>

3.在virtualbox centos虚拟机中从iso镜像重新创建一个qemu-kvm虚拟机

3.1.准备好iso文件

3.2.创建空的qcow2 系统盘文件:

qemu-img create -f qcow2 vm1.qcow2 10G

3.3.创建xml文件:

(这个文件会使用cdrom启动,并将部署结果写入qcow2文件中,这里没有加串口配置,无法virsh console连接虚拟机) virsh define vm1.xml (基于配置生产虚拟机实例) virsh list --all (查看全部虚拟机) virsh start vm1 (启动虚拟机)

3.4 vnc访问嵌套虚拟机

这里虚拟机启动后,需要通过vnc访问界面,在引导界面完成安装: 安装vnc工具: yum provides vncviewer (查找可选版本,选择一个安装,例如下面) yum install -y tigervnc-1.8.0-21.el7.x86_64

查看vnc端口: virsh vncdisplay vm1 netstat -antp|grep qemu-kvm 这里可以看到默认vnc端口是5900,可自行下载vnc客户端工具连接进入操作系统引导界面完成系统安装 www.realvnc.com/en/connect/...

使用引导完成安装后的vm1.qcow2文件,复制一份,就可以用于快速生成其他嵌套虚拟机

4.复制qcow2文件,创建新虚拟机

可以将使用cdrom安装完毕后的qcow2文件拷贝出来,并用于创建新的虚拟机,指定从系统盘启动:(vm2.xml)

xml 复制代码
#vm2.xml 

<domain type='kvm'>  //如果是Xen,则type='xen'
 #虚拟机整体信息
 <name>vm2</name> //虚拟机名称,同一物理机唯一
 <uuid>fd3535db-2558-43e9-b067-314f48211341</uuid>  //同一物理机唯一,可用uuidgen生成
 <memory>524288</memory>  //单位为KB
 <currentMemory>524288</currentMemory>  //memory这两个值最好设成一样
 <vcpu>1</vcpu> //vcpu个数

 #系统信息
 <os>
   <type arch='x86_64'>hvm</type> //arch指出系统架构类型,machine 则是机器类型,查看机器类型:qemu-system-x86_64 -M ?
   <boot dev='hd'/>  //启动介质,第一次需要装系统可以选择cdrom光盘启动;之后可以修改为'hd'
   <bootmenu enable='yes'/>  //表示启动按F12进入启动菜单
 </os>

 #硬件资源特性
 <features>
   <acpi/>  //Advanced Configuration and Power Interface,高级配置与电源接口
   <apic/>  //Advanced Programmable Interrupt Controller,高级可编程中断控制器
   <pae/>   //Physical Address Extension,物理地址扩展
 </features>
 <clock offset='localtime'/>  //虚拟机时钟设置,这里表示本地本机时间

 #突发事件处理
 <on_poweroff>destroy</on_poweroff>
 <on_reboot>restart</on_reboot>
 <on_crash>restart</on_crash>

 #设备配置
 <devices>
   <emulator>/usr/libexec/qemu-kvm</emulator> //如果是Xen则是/usr/lib/xen/binqemu-dm

  #硬盘配置

  <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2'/>
    <source file='/root/eric.feng/test/vm2.qcow2'/>
    <target dev='vda' bus='virtio'/>
  </disk>

  #添加网络配置,基于网桥
  <interface type='bridge'>
    <source bridge='br0'/>
    <target dev='vnet1'/>
    <alias name='net1'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  </interface>

  #配置vnc
  <graphics type='vnc' port='5901' autoport='yes' listen='0.0.0.0' keymap='en-us'>
    <listen type='address' address='0.0.0.0'/>
  </graphics>
 </devices>
</domain>

5. 为新虚拟机添加串口,用于支持virsh console访问

参考: wiki.libvirt.org/Unable_to_c... www.cnblogs.com/code8088/p/...

docs.redhat.com/zh-cn/docum... (5.4. 打开虚拟机串口控制台)

systemctl start serial-getty@ttyS0.service systemctl status serial-getty@ttyS0.service

bash 复制代码
虚拟机中开启 
grubby --update-kernel=ALL --args="console=ttyS0"
grub2-editenv  - unset kernelopts 
reboot 

cat /proc/cmdline |grep console 


虚拟机xml增加串口的部分:
    <serial type='pty'>
        <target port='0'/>
    </serial>
    <console type='pty'>
       <target type='serial' port='0'/>
    </console>




宿主机:
chmod 666 /dev/ttyS0 
systemctl start serial-getty@ttyS0.service
systemctl status serial-getty@ttyS0.service
 
 (需要主机上开启串口服务, 虚拟机内更新grub,指定console=serial 
 https://docs.redhat.com/zh-cn/documentation/red_hat_enterprise_linux/9/html/configuring_and_managing_virtualization/proc_opening-a-virtual-machine-serial-console_assembly_connecting-to-virtual-machines#proc_opening-a-virtual-machine-serial-console_assembly_connecting-to-virtual-machines

vm3.xml

xml 复制代码
#vm3.xml 

<domain type='kvm'>  //如果是Xen,则type='xen'
 #虚拟机整体信息
 <name>vm3</name> //虚拟机名称,同一物理机唯一
 <uuid>fd3535db-2558-43e9-b067-314f48211344</uuid>  //同一物理机唯一,可用uuidgen生成
 <memory>524288</memory>  //单位为KB
 <currentMemory>524288</currentMemory>  //memory这两个值最好设成一样
 <vcpu>1</vcpu> //vcpu个数

 #系统信息
 <os>
   <type arch='x86_64'>hvm</type> //arch指出系统架构类型,machine 则是机器类型,查看机器类型:qemu-system-x86_64 -M ?
   <boot dev='hd'/>  //启动介质,第一次需要装系统可以选择cdrom光盘启动;之后可以修改为'hd'
   <bootmenu enable='yes'/>  //表示启动按F12进入启动菜单
 </os>

 #硬件资源特性
 <features>
   <acpi/>  //Advanced Configuration and Power Interface,高级配置与电源接口
   <apic/>  //Advanced Programmable Interrupt Controller,高级可编程中断控制器
   <pae/>   //Physical Address Extension,物理地址扩展
 </features>
 <clock offset='localtime'/>  //虚拟机时钟设置,这里表示本地本机时间

 #突发事件处理
 <on_poweroff>destroy</on_poweroff>
 <on_reboot>restart</on_reboot>
 <on_crash>restart</on_crash>

 #设备配置,这里增加了pty 模拟设备用于串口
 <devices>
   <emulator>/usr/libexec/qemu-kvm</emulator> //如果是Xen则是/usr/lib/xen/binqemu-dm
   <serial type='pty'>
       <target port='0'/>
   </serial>
   <console type='pty'>
      <target type='serial' port='0'/>
   </console>

  #硬盘配置

  <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2'/>
    <source file='/root/eric.feng/test/vm3.qcow2'/>
    <target dev='vda' bus='virtio'/>
  </disk>

  #添加网络配置,基于网桥
  <interface type='bridge'>
    <source bridge='br0'/>
    <target dev='vnet3'/>
    <alias name='net3'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  </interface>

  #配置vnc
  <graphics type='vnc' port='5903' autoport='yes' listen='0.0.0.0' keymap='en-us'>
    <listen type='address' address='0.0.0.0'/>
  </graphics>
 </devices>
</domain>

完成操作后,后续连接虚拟机便可以不再使用vnc,直接ssh 连接到virtualbox 虚拟机,然后执行 virsh console vm3 去进入虚拟机了

  1. 嵌套虚拟机访问外网

在第一步创建virtualbox 虚拟机后,我们知道这个虚拟机是通过其中的NAT网卡实现的访问外网,目前br0网桥无法把数据发送到0.0.0.0,需要我们将enp0s3 这个virtualbox默认生成的NAT网卡加入到网桥中,并将原本配置在enp0s3上的ip 摘除重新配置到br0上。

csharp 复制代码
 brctl addif br0 enp0s3  (这个默认的nat网卡,对应默认网关10.0.2.2用于访问外网,先把enp0s3网卡加入到br0网桥)
 ip addr del dev enp0s3 10.0.2.15/24  (将原网卡上ip配置摘除)
 ip addr add dev br0 10.0.2.15/24  (将nat网卡ip配置加入到br0上)
  ip route add default via 10.0.2.2 dev br0  (配置默认网关,让0.0.0.0流量通过br0网桥走到10.0.2.2默认网关去转发)
  
  经过处理后,原来的enp0s3网卡上不再有ip信息 
  

处理过后,route -n 可以看到默认网关已经默认配置了从br0流出。

ping 8.8.8.8 -I br0 可以验证

进入虚拟机,配置网卡ip和默认网关10.0.2.2后,嵌套虚拟机成功实现外网访问:

之后,启动的虚拟机内配置好网卡和网关,就可以访问外网:

csharp 复制代码
 ip  addr add dev ens3 10.0.2.20/24
 ip route add default via 10.0.2.2 dev ens3
相关推荐
PFinal社区_南丞1 天前
现代PHP开发实战
后端·php
徐小夕1 天前
10k Star 的开源 AI 记忆引擎:6 行代码,用图谱+向量打造永不遗忘的 AI
前端·后端·github
czlczl200209251 天前
拒绝 DTO 爆炸:详解 Spring Boot 参数校验中的“分组校验” (Validation Groups) 技巧
java·spring boot·后端
兔丝1 天前
FastAdmin框架SSE实时消息推送实现教程
后端
悟空码字1 天前
SpringBoot动态脱敏实战,从注解到AOP的优雅打码术
java·后端
小鸡脚来咯1 天前
springboot项目包结构
java·spring boot·后端
爱学习的小可爱卢1 天前
JavaEE进阶——SpringBoot日志从入门到精通
java·spring boot·后端
Clarence Liu1 天前
Go Context 深度解析:从源码到 RESTful 框架的最佳实践
开发语言·后端·golang
踏浪无痕1 天前
Nacos到底是AP还是CP?一文说清楚
分布式·后端·面试
踏浪无痕1 天前
深入JRaft:Nacos配置中心的性能优化实践
分布式·后端·面试