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 [email protected] systemctl status [email protected]

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 [email protected]
systemctl status [email protected]
 
 (需要主机上开启串口服务, 虚拟机内更新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
相关推荐
EngineerSuTao9 分钟前
Flask的app.run()里发生了什么
后端·python·flask
Asthenia041210 分钟前
进程与线程区别 / Java线程状态 / 同步方法与代码块差异 / Monitor线程同步原理 / 死锁解析 / 多线程访问资源避免死锁
后端
Asthenia041229 分钟前
模块引用/ pass/ 模块包/ range/xrange/ dict/items/ is/ func引用/ any/all/ 列表值/ 排序
后端
计算机学姐33 分钟前
基于SpringBoot的名著阅读网站
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
努力的小雨35 分钟前
Spring AI 增加混元 embedding 向量功能
后端
慕容靖翾39 分钟前
CSS语言的排序算法
开发语言·后端·golang
Asthenia04121 小时前
装饰器 / Lambda / Tuple-List / except / match-search / 全局变量 / 引号 / 参数 / 类-实例变量
后端
阳光照进我心窝1 小时前
Laravel 模型静态方法实现
后端
喵个咪1 小时前
Ent代码生成工具链
后端·go
SimonKing1 小时前
XXL-JOB:揭秘定时机制
java·后端·架构