背景:
家里有一台闲置的台式机,安装的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 去进入虚拟机了
- 嵌套虚拟机访问外网
在第一步创建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