- 服务器:CentOS 8 Linux内核4.18.0-500.el8.x86_64,Java开发环境为:Win11
- 本篇将介绍kvm,qemu,libvirt相关概念,以及Java创建虚拟机流程
一、基本概念
KVM简介
KVM(Kernel-based Virtual Machine 即基于内核的虚拟机),通过虚拟化硬件设备,使每个虚拟机都有各自的CPU、内存、磁盘、网卡等硬件资源。于2007年2月被集成到Linux内核2.6.20中,它可以模拟虚拟机的CPU,而虚拟机的I/O设备则是通过qemu这个用户空间程序来模拟
QEMU简介
QEMU (Quick Emulator)是一个通用的开源机器模拟器和虚拟器。
可以进行系统仿真,提供整个机器(CPU、内存和外围设备)的虚拟模型来运行客户操作系统。
libvirt简介
libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口,而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack、ZStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。
libvirt是为了更方便地管理平台虚拟化技术而设计的开放源代码的应用程序接口、守护进程和管理工具,它不仅提供了对虚拟化客户机的管理,也提供了对虚拟化网络和存储的管理。libvirt支持多种虚拟化方案,既支持包括KVM、QEMU、Xen、VMware、VirtualBox、Hyper-V等在内的平台虚拟化方案,也支持OpenVZ、LXC等Linux容器虚拟化系统,还支持用户态Linux(UML)的虚拟化。
libvirt作为中间适配层,可以让底层Hypervisor对上层用户空间的管理工具是完全透明的,因为libvirt屏蔽了底层各种Hypervisor的细节,为上层管理工具提供了一个统一的、较稳定的接口(API)。通过libvirt,一些用户空间管理工具可以管理各种不同的Hypervisor和上面运行的客户机。
二、Java创建虚拟机
1、配置virt-0.dll
Java API 基于JNA技术需要调用本地virt-0.dll 文件,博主是win11环境这里,需要先安装virt-viewer软件。
- 点击virt-viewer,下载完成后点击安装
- 进入安装路径,C:\Program Files\VirtViewer v11.0-256\bin
- 复制libvirt-0.dll,并命名为virt-0.dll,注意保留原文件
2、maven引入依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.libvirt</groupId>
<artifactId>libvirt</artifactId>
<version>0.53</version>
</dependency>
<repositories>
<repository>
<id>libvirt-org</id>
<url>https://download.libvirt.org/maven2</url>
</repository>
</repositories>
3、创建虚拟存储盘
java代码如下,url和VirtViewer路径按需修改
public class LibvirtApi {
private static final String url = "192.168.3.xx:12306";
private static volatile Connect connect = null;
public static Connect getConnect() {
try {
if (connect == null) {
synchronized (LibvirtApi.class) {
if (connect == null) {
connect = new Connect(String.format("qemu+tcp://%s/system",url) );
}
}
}
} catch (LibvirtException e) {
throw new RuntimeException(e);
}
return connect;
}
public static void main(String[] args) {
System.setProperty("jna.library.path", "C:\\Program Files\\VirtViewer v11.0-256\\bin");
LibvirtApi libvirtApi = new LibvirtApi();
try {
libvirtApi.createVolume();
} catch (LibvirtException e) {
throw new RuntimeException(e);
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
//创建存储卷
private void createVolume() throws LibvirtException, DocumentException {
Connect connect = getConnect();
StoragePool storagePool = connect.storagePoolLookupByName("default");
SAXReader reader = new SAXReader();
Document document = reader.read(new File(getXmlPath("volume.xml")));
String storageVolXml = document.asXML();
// 在这个存储池对象下创建存储卷
StorageVol storageVol = storagePool.storageVolCreateXML(storageVolXml, 0);
// 存储卷信息
StorageVolInfo info = storageVol.getInfo();
// 两种结果 VIR_STORAGE_VOL_FILE,或者VIR_STORAGE_VOL_BLOCK; 代表它的type属性
log.info("type:{},total:{},use:{}", info.type, info.capacity, info.allocation);
}
}
volume.xml配置如下
<volume type='file'>
<name>test1.qcow2</name> <!--名称必须唯一-->
<source>
</source>
<capacity unit='GiB'>50</capacity> <!--StorageVol 的容量-->
<allocation>0</allocation> <!--StorageVol 的已用容量-->
<target>
<path>/var/lib/libvirt/images</path> <!--StorageVol 在宿主机的路径-->
<format type='qcow2'/> <!--文件类型,通常都是 qcow2,也可以是 raw-->
<permissions> <!--权限-->
<mode>0600</mode>
<owner>0</owner>
<group>0</group>
</permissions>
</target>
</volume>
4、上传镜像至Linux服务器
5、创建虚拟机
public static void main(String[] args) {
System.setProperty("jna.library.path", "C:\\Program Files\\VirtViewer v11.0-256\\bin");
LibvirtApi libvirtApi = new LibvirtApi();
try {
libvirtApi.createKvm();
} catch (LibvirtException e) {
throw new RuntimeException(e);
} catch (DocumentException e) {
throw new RuntimeException(e);
}
}
public void createKvm() throws LibvirtException, DocumentException {
Connect conn = getConnect();
SAXReader reader = new SAXReader();
Document docu = reader.read(new File(getXmlPath("createVm.xml")));
String xmlDesc = docu.asXML();
Domain domain = conn.domainCreateXML(xmlDesc, 0);
}
createVm.xml,配置如下,光盘位置按需修改
<domain type = "kvm"> <name>centos7V1</name> <!--虚拟机名称--> <memory unit = "MiB">4096</memory> <!--最大内存,单位MiB--> <currentMemory unit = "MiB">4096</currentMemory> <!--可用内存,单位MiB--> <vcpu>2</vcpu> <!--//虚拟cpu个数--> <os> <type arch = "x86_64" machine = "pc">hvm</type> <boot dev = "hd" /> <!-- 硬盘启动 --> <boot dev = "cdrom" /> <!--//光盘启动--> </os> <features> <acpi /> <apic /> <pae /> </features> <clock offset = "localtime" /> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='qcow2' cache='none' io='threads'/> <source file='/var/lib/libvirt/images/test1.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> <!-- 限制磁盘大小为 50GB --> <size units='GiB'>50</size> </disk> <disk type = "file" device = "cdrom"> <source file = "/opt/kvm/CentOS-7-x86_64-DVD-2009.iso" /> <!--光盘镜像路径 --> <target dev = "hdb" bus = "ide" /> </disk> <interface type = "bridge"> <!--虚拟机网络连接方式--> <source bridge = "virbr0" /> <!--当前主机网桥的名称--> </interface> <input type = "mouse" bus = "ps2" /> <!--vnc方式登录,端口号自动分配,自动加1,可以通过virsh vncdisplay来查询--> <graphics type = "vnc" port = "-1" autoport = "yes" listen = "0.0.0.0" keymap = "en-us" /> </devices> </domain>
6、验证
- 在服务器上执行验证是否创建,virsh list --all
- 如果有xshell并且安装了XManager,可以在xshell中执行virt-manager命令,进入图像化界面
后续会继续更新,网络配置、快照等。
参考
如有遗漏,和侵权请及时作者
KVM运行时native_write_msr — Cloud Atlas beta 文档
https://www.cnblogs.com/lvtiantiantian/p/17715118.html