Linux内核模型: 单内核
- 单内核
单内核指整个内核从整体上作为一个过程实现,运行在一个单独的地址空间内 ,内核之间的通信可以简单的用函数调用实现。这样的设计简单高效,但是每次的修改都需要整体重新编译,升级比较麻烦。 - 微内核
微内核是指整个内核划分为多个独立的过程,拥有独立的地址空间,只有少量的核心的过程运行在特权模式下,使用进程通信而不是简单的函数调用。多模块的内核设计能够提升健壮性,但是进程间通信设计内核空间和用户上下文的切换,开销远远大于函数调用 - Linux内核
为了满足性能要求,Linux被设计成单内核,但是也借鉴了微内核的精华:模块化以及模块的动态装载。除了核心模块一直运行在内核如进程切换,内存管理等,其他的大部分内核功能作为单独的模块,以二进制文件的形式存在,使用时动态状态,不使用的时候动态卸载。
虚拟化模型
模型: 物理系统 —— Hypervisor —— 虚拟机
- 底层物理系统: 处理器,内存,输入输出设备
- VMM/Hypervisor: 管理物理系统,并未虚拟机提供虚拟的硬件平台
- 虚拟机: 包括虚拟硬件和虚拟系统
KVM架构
KVM作为内核的一个模块,是KVM虚拟机的核心部分,仅支持硬件虚拟化,其功能是打开并初始化系统硬件以支持虚拟机的运行。
KVM工作流程
- KVM模块被内核加载后,首先初始化内部的数据结构;
- 检查宿主机的CPU,打开CPU寄存器CR4的虚拟化开关,并将宿主机的操作系统置于虚拟化模式的根模式;
- KVM模块创建/dev/kvm,并等待用户空间的指令。
- QEMU程序与KVM模块配合完成虚拟机的创建和运行。
虚拟机创建
- KVM和用户空间的QEMU通信,主要通过一系列的IOCTL的调用
- QEMU发送创建虚拟机的指令给KVM模块,KVM创建对应的内核数据结构,同时返回一个文件句柄表示创建的虚拟机
- 对返回的文件句柄操作,可以对虚拟机进行相应的管理:如分配虚拟内存和虚拟CPU,KVM创建对应的句柄以便操作。
QEMU是完全软件虚拟化,KVM仅支持硬件虚拟化,KVM+QEMU是双赢
KVM环境
- 内存过载使用
CPU允许过载使用,同样内存也允许虚拟机过载使用(因为虚拟机中内存和cpu往往不会达到百分百的使用率),内存的过载使用有几种实现方式- 交换分区,使用交换分区弥补虚拟内存的不足
- virio_ballon
- 页共享,使多个虚拟机上的进程使用相同的内存页。
KVM允许内存的过载使用,但是在实际的生产环境中使用过载内存,应该经过充分的测试。
- qemu支持的镜像格式:
- raw :原始的镜像格式,如果系统支持空洞文件,则只有写有数据的扇区才会占用磁盘空间,从而达到节省空间的效果。dd创建的镜像也是raw格式,不过一开始创建的时候就分配全部的空间,没有采用稀疏的文件存储。
- qcow2: 推荐的镜像格式。支持稀疏文件存储, 支持可选的AES加密已提高镜像的安全性
- vdi:virtualbox
- vmdk: vmware
- 宿主机镜像存储:
- 本地存储 :一开始使用的这个,随着镜像越来越大
- 额外的磁盘存储: 挂在单独的磁盘存储镜像
- NFS: 集群下开始使用nfs网络文件系统
- LVM: 没有使用逻辑卷管理。
- 网络配置
- 图形显示
VNC:虚拟远程计算机,使用RFB远程帧缓冲协议,将控制端的鼠标,键盘传递给远程被控制的计算机,并将图形界面反向传输回来。