一、KVM及虚拟机技术
1、什么是虚拟机技术
虚拟机技术是一种通过软件仿真创建的虚拟计算环境,它允许在一台物理计算机上运行多个虚拟的操作系统实例。这些虚拟机(VMs)是独立的、隔离的计算环境,它们共享物理计算机的硬件资源,但彼此之间互相隔离,就像是在同一台物理计算机上运行多个独立的计算机。虚拟机技术的核心思想是使用虚拟化软件(称为虚拟机监控器或hypervisor),它在物理硬件和操作系统之间添加了一个抽象层。这个抽象层负责管理和分配物理资源,以及在其上运行虚拟的操作系统。有两种主要类型的虚拟机技术:
-
全虚拟化(Full Virtualization): 在全虚拟化中,虚拟机监控器模拟完整的硬件环境,使得虚拟机能够运行未修改的操作系统。这样的虚拟机对于虚拟化的操作系统来说是透明的,它们认为自己在运行于独立的物理硬件上。
-
半虚拟化(Para-Virtualization): 在半虚拟化中,虚拟机知道自己是在虚拟环境中运行,因此需要进行一些修改以与虚拟化层更好地交互。这通常导致更高的性能,但需要修改虚拟机中运行的操作系统。
-
各种虚拟机技术主要差别在于CPU的虚拟化、内存的虚拟化和I/O的虚拟化。
1、CPU的虚拟化
CPU虚拟化的关键挑战之一是解决虚拟机和物理硬件之间的指令集不匹配的问题。当虚拟机试图执行指令时,这些指令通常需要在物理硬件上执行。虚拟化技术必须以某种方式截获并解释这些指令,以便在虚拟机中正确执行。有两种主要的CPU虚拟化技术:软件虚拟化和硬件虚拟化
2、内存的虚拟化
内存虚拟化通常由虚拟机监控器(VMM,也称为hypervisor)负责管理。VMM在物理硬件上运行,它负责为虚拟机提供虚拟内存和物理内存之间的映射。虚拟机在其自己的地址空间中运行,以为其提供了一个独立的内存空间,就像是在一台独立的物理机器上运行一样。主要的内存虚拟化技术包括:分页机制、内存 overcommitment和内存共享
3、I/O的虚拟化
I/O虚拟化的目标是在虚拟化环境中提供对物理硬件设备的虚拟访问,使虚拟机能够使用共享的I/O资源而不干扰彼此。
2、KVM API总结
KVM(Kernel-based Virtual Machine)是一个在Linux内核中实现的虚拟化基础设施,它允许在Linux上运行虚拟机。KVM提供了一组API(应用程序编程接口),使开发人员能够通过编程方式与KVM进行交互。KVM API允许开发人员编写应用程序、脚本或管理工具,以便更灵活地配置、监视和控制虚拟机。这些API为构建自定义虚拟化解决方案提供了基础,也为集成虚拟化技术到云计算平台提供了支持。
3、QEMU-KVM
KVM允许虚拟机监视器(VMM,如QEMU)以用户态的形式运行,并利用硬件虚拟化扩展,如Intel的VT-x和AMD的AMD-V,来提高虚拟机的性能。QEMU的任务包括虚拟CPU的模拟、虚拟设备的模拟、内存管理、I/O虚拟化等。QEMU使用KVM API与KVM模块进行通信,以利用硬件虚拟化来加速虚拟机的执行。
4、StratoVirt
StratoVirt 的主要特点
1、轻量级设计: StratoVirt 的设计目标之一是轻量级,以适应边缘计算设备的资源有限性。它采用模块化的设计,只选择并加载必要的组件,以减小系统的资源占用。
2、高性能: StratoVirt 旨在提供高性能的虚拟化解决方案,以满足对边缘计算场景中对计算能力和响应时间的高要求。
3、支持多架构: StratoVirt 支持多种体系结构,包括 ARM 和 x86 等,以适应不同硬件平台的需求。
4、支持多种操作系统: StratoVirt 被设计为能够运行各种操作系统,包括 Linux 和 Windows 等。
5、安全性: 安全性是 StratoVirt 关注的一个重要方面,尤其在边缘计算环境中,安全性是一个关键的考虑因素。
二、Linux容器技术
1、Linux容器技术
Linux 容器技术是一种轻量级虚拟化技术,允许将应用程序及其依赖项打包到一个独立的单元中,称为容器。每个容器都运行在共享的操作系统内核上,但它们是相互隔离的,具有自己的文件系统、进程空间、网络空间等。
chroot技术:可以将进程的根目录更改为指定的目录,使得该目录成为进程能够访问的文件系统的根。使用chroot
命令的基本语法如下:
sudo chroot newroot [command]
namespace技术:命名空间技术为容器化提供了强大的基础,容器技术(如 Docker)通常使用这些命名空间来实现应用程序的隔离。这种隔离性使得容器可以在相对独立的环境中运行,不受主机或其他容器的影响。
PID 命名空间(PID Namespace): 允许每个命名空间内的进程拥有独立的进程 ID(PID)。在不同的 PID 命名空间中,相同的 PID 可以对应不同的进程。
Mount 命名空间(Mount Namespace): 提供了独立的文件系统挂载点,使得在不同的 Mount 命名空间中,相同的路径可能对应不同的文件系统。
UTS 命名空间(UTS Namespace): 提供了对系统主机名和域名的隔离,使得在不同的 UTS 命名空间中,相同的系统主机名和域名可以有不同的值。
IPC 命名空间(IPC Namespace): 提供了独立的进程间通信资源,如消息队列、信号量和共享内存。
Network 命名空间(Network Namespace): 允许每个命名空间内的进程有独立的网络栈,包括网络设备、IP 地址、路由表等。这使得在不同的 Network 命名空间中,相同的端口号可以对应不同的服务。
User 命名空间(User Namespace): 允许将用户 ID 和组 ID 映射到不同的值,从而实现在命名空间内外拥有不同的用户身份。
2、如何创建一个容器
创建namespace:
在clone
系统调用中,通过设置CLONE_NEW*
标志来指定创建的命名空间类型。
使用clone
系统调用创建一个具有新 PID 命名空间的子进程:
#define _GNU_SOURCE
#include <sched.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#define STACK_SIZE (1024 * 1024)
static char child_stack[STACK_SIZE];
static int child_func(void *arg) {
printf("Child Process PID: %ld\n", (long)getpid());
sleep(2); // 等待父进程输出完毕
return 0;
}
int main() {
printf("Parent Process PID: %ld\n", (long)getpid());
int flags = CLONE_NEWPID | SIGCHLD;
pid_t child_pid = clone(child_func, child_stack + STACK_SIZE, flags, NULL);
if (child_pid == -1) {
perror("clone");
exit(EXIT_FAILURE);
}
// 等待子进程结束
if (waitpid(child_pid, NULL, 0) == -1) {
perror("waitpid");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
制作OCI包并运行容器:
准备应用程序,创建容器镜像,制作 root 文件系统,创建 config 文件,制作容器镜像,运行容器
3、Docker
Docker 利用容器技术,将应用程序及其所有依赖项封装在一个独立的容器中,使得应用程序可以在任何支持 Docker 的环境中运行,而不受底层系统的影响。
容器: 容器是 Docker 的基本单元,它包含了应用程序及其依赖项、运行时环境以及配置文件等。容器是轻量级、可移植且一致的,可以在不同的环境中运行。
镜像: 镜像是容器的模板,包含了运行容器所需的文件系统、工具、库和设置。镜像是只读的,多个容器可以基于同一个镜像运行,而不会相互影响。Docker 镜像可以通过 Docker Hub 或其他容器注册表共享和获取。
Dockerfile: Dockerfile 是一个文本文件,用于定义如何构建 Docker 镜像。Dockerfile 包含了一系列指令,从基础镜像中构建并配置容器。通过 Dockerfile,可以自动化地创建和定制镜像。
4、iSula
iSula的基本用法:
启动容器:
isula run -itd --name=my_container ubuntu:latest /bin/bash
查看正在运行的容器:
isula ps
进入正在运行的容器:
isula exec -it my_container /bin/bash
停止容器:
isula stop my_container
isula rm my_container
构建容器镜像:
isula build -t my_image:latest /path/to/dockerfile
iSulad的系统架构
iSula主要包含iSulad (iSula 轻量级容器引擎)、安全容器kata-containers、系统容器插件syscontainer-tools等关键组件。
三、chatgpt问答
四、总结
这次学习内容比较多,也有一定难度,但是通过使用chatgpt,我认识了虚拟机技术和容器技术的区别,虚拟机技术使虚拟机可以在不同的硬件和操作系统上运行,因为它们模拟了完整的计算环境。而容器更加依赖于宿主操作系统的内核,因此在跨平台性上可能有一些限制。虚拟机技术使虚拟机拥有一个单独的内核,隔离非常强大;容器技术共享宿主操作系统的内核只提供轻量级的隔离。