《UNIX/Linux系统管理技术手册-读书笔记-第二十四章

虚拟化

1. 虚拟化概述

1.1 什么是虚拟化

概念 说明 能做什么
虚拟化 在同一物理硬件上同时运行多个操作系统实例 提高硬件利用率,隔离应用,支持多租户
hypervisor(虚拟机监控器) 协调VM与底层硬件的软件层,管理资源分配和隔离 让多个guest OS共享同一物理硬件
guest OS 运行在虚拟机中的操作系统(可异构:Linux+FreeBSD+Windows) 每个VM有独立的OS和应用程序栈

1.2 Hypervisor类型

类型 说明 代表
1型(裸金属hypervisor) 直接运行在硬件之上,无需宿主OS VMware ESXi、XenServer、KVM(Linux内核模块)
2型(托管hypervisor) 运行在通用OS之上的用户空间应用 Oracle VirtualBox、VMware Workstation、FreeBSD bhyve

1型与2型界线已模糊(如KVM是内核模块,既像1型又集成在OS中),现代实践更关注功能而非分类。

1.3 虚拟化模式演进

模式 说明 性能 对guest要求
全虚拟化 hypervisor完整仿真硬件(磁盘/网卡/BIOS等) 较低(转换开销) guest OS无需修改
半虚拟化(PV) guest OS主动与hypervisor协作访问硬件 高(>10倍提升) guest内核需大量修改
硬件辅助虚拟化 Intel VT / AMD-V CPU扩展,硬件直接虚拟化 优秀 guest OS无需修改
半虚拟化驱动(PVHVM) 硬件辅助CPU虚拟化 + 半虚拟化设备驱动 接近裸金属 仅需安装专用驱动
PVH(现代混合模式) 硬件虚拟化 + 少量guest内核半虚拟化代码 最佳 guest内核有最低要求

现代hypervisor自动为guest选择最优模式,管理员通常无需手动干预。保持软件更新即可自动受益。

1.4 虚拟机 vs 容器(表24.1)

对比维度 虚拟机(VM) 容器
启动时间 1~2分钟(完整引导) <1秒(直接运行进程)
生命周期 长期存活 频繁替换(短暂)
存储 专用虚拟磁盘(GB级) 分层镜像(MB级)
密度 每物理主机数十个 每物理/虚拟主机数百个
隔离性 完全隔离(独立OS) 共享宿主机内核(轻量隔离)
OS多样性 可运行不同OS(Linux+Windows) 必须与宿主机内核一致

典型组合:虚拟机提供硬件隔离边界 → 其上运行容器实现高密度应用部署(“bin packing”)。

2. Linux虚拟化

2.1 Xen

特性 说明
类型 裸金属1型hypervisor,半虚拟化起家
架构 dom0(特权域,管理硬件+其他域) + domU(非特权域,运行guest)
性能开销 0.1% ~ 3.5%
应用 AWS、IBM SoftLayer等大型公有云
当前状态 Linux基金会项目,持续活跃

Xen dom0工具与配置

路径/命令 用途
/etc/xen/ 主配置目录
/etc/xen/auto/ 引导时自动启动的guest配置
xl Xen管理命令行工具(,替代xm
xl create /etc/xen/guest.cfg 启动guest
xl list 列出所有域
xl console <id> 连接到guest控制台
xl shutdown <id> / xl destroy <id> 优雅关机/强制停止

guest配置文件示例/etc/xen/chef.cfg):

builder = "hvm"          # 硬件辅助虚拟化
name = "chef"
memory = 512
vcpus = 1
disk = ['file:/home/ben/chef.img,xvda,w']
vif = ['bridge=virbr0']
boot = "dc"

2.2 KVM(Kernel-based Virtual Machine)

特性 说明
类型 Linux内核模块,将内核变为hypervisor
架构 VM是普通Linux进程(可用ps/top/kill管理)
虚拟化方式 默认全虚拟化(Intel VT/AMD-V),可选半虚拟化驱动
guest支持 Linux、FreeBSD、Windows等
管理工具 virshvirt-install

KVM管理命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 创建guest
sudo virt-install --connect qemu:///system \
  -n UbuntuGuest -r 512 \
  -f ~/ubuntu.img -s 12 \
  -c /dev/dvd \
  --os-type linux --accelerate --hvm --vnc

# virsh交互式管理
sudo virsh --connect qemu:///system
virsh # list --all          # 列出所有VM(含关机)
virsh # start VMname        # 启动
virsh # shutdown VMname     # 优雅关机
virsh # destroy VMname      # 强制停止
virsh # quit

💡 KVM与Linux内核的无缝集成是其最大优势——VM即进程,可用标准Linux工具管理。

2.3 Xen vs KVM 选型

对比 Xen KVM
架构 独立hypervisor + dom0管理域 Linux内核原生集成
管理工具 xl virsh / virt-install
性能 优秀(半虚拟化成熟) 优秀(硬件辅助+内核优化)
生态系统 大型公有云验证 主流Linux发行版默认
选型建议 已有Xen经验/需要半虚拟化深度优化 新部署推荐(Linux原生,工具链成熟)

3. FreeBSD bhyve

特性 说明
类型 FreeBSD原生的2型hypervisor(用户空间)
首次发布 FreeBSD 10.0
guest支持 BSD、Linux、Windows(有限硬件支持)
成熟度 相对较新,功能不如Xen/KVM完备
建议 除非有嵌入式FreeBSD虚拟化定制需求,否则优先选择其他方案

4. VMware ESXi

特性 说明
类型 裸金属1型hypervisor(x86架构)
授权 免费基础版,高级功能需付费
优势 行业领先的动态迁移(vMotion)、集中管理(vCenter)
适用场景 企业级生产环境,混合OS环境(含Windows)

VMware是企业虚拟化的“默认选择”,但成本较高。纯Linux环境可用KVM替代。

5. Oracle VirtualBox

特性 说明
类型 跨平台2型hypervisor(桌面级)
历史 Innotek → Sun → Oracle
支持平台 Linux、FreeBSD(社区移植)、Windows、macOS、Solaris
适用场景 开发测试、个人实验、学习环境
生产建议 不推荐用于生产环境(性能/硬件支持不足)
无GUI运行 VBoxHeadless(命令行工具)

6. Packer(镜像构建工具)

概念 说明 能做什么
Packer HashiCorp开源工具,从规范文件(JSON)构建虚拟机镜像 多种平台(AWS/GCP/DO/VMware/VirtualBox)构建一致的自定义镜像
基础设施即代码 镜像规范可版本控制、审计、回滚 消除“手工构建镜像”的不可重复性

Packer工作流程

  1. 从源镜像启动临时实例
  2. 运行脚本或配置管理(Ansible/Chef)定制
  3. 保存状态为新镜像

模板示例custom_ami.json,AWS):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
{
  "builders": [
    {
      "type": "amazon-ebs",
      "access_key": "AKIAIOSFODNN7EXAMPLE",
      "secret_key": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
      "region": "us-west-2",
      "source_ami": "ami-d440a6e7",
      "instance_type": "t2.medium",
      "ssh_username": "ubuntu",
      "ami_name": "ULSAH5E",
      "tags": { "Name": "ULSAH5E Demo AMI" }
    }
  ],
  "provisioners": [
    {
      "type": "shell",
      "inline": ["sudo apt-get update", "sudo apt-get install -y nginx"]
    }
  ]
}

💡 Packer与配置管理(Ansible/Salt/Chef)配合使用效果最佳:Packer构建基础镜像,CM在运行时做最后调优。

7. 本章核心命令速查表

命令 功能 平台
xl list 列出Xen域 Xen
xl create /etc/xen/guest.cfg 启动Xen guest Xen
xl console <id> 连接Xen guest控制台 Xen
xl shutdown <id> / xl destroy <id> 优雅/强制停止Xen guest Xen
virsh --connect qemu:///system 进入KVM管理shell KVM/Linux
virsh list --all 列出所有VM KVM
virsh start <name> / shutdown <name> 启动/关机VM KVM
virt-install ... 创建新KVM guest KVM
VBoxHeadless VirtualBox无GUI运行 VirtualBox
packer build template.json 构建镜像 Packer

DBA视角补充

  • 虚拟化是数据库部署的主流形式:绝大多数生产数据库运行在VMware ESXi或KVM之上。虚拟机提供了资源隔离(CPU/内存/IO)和可移植性(vMotion/热迁移),便于数据库维护和灾难恢复。
  • 数据库VM性能考量
    • CPU:硬件辅助虚拟化(Intel VT/AMD-V)性能损失极小(<5%)
    • 内存:避免内存超额分配(overcommit),确保数据库guest有足够预留内存
    • 存储:使用半虚拟化磁盘驱动(virtio)可大幅提升I/O性能;避免使用模拟IDE/SATA驱动
    • 网络:使用半虚拟化网卡(virtio-net)降低网络延迟
  • VM vs 容器选型
    • OLTP数据库(MySQL/PostgreSQL/Oracle):建议虚拟机(强隔离,资源保障)
    • 开发/测试数据库:容器可快速拉起/销毁,节省资源
    • 云数据库(AWS RDS等):底层本质是虚拟化+托管服务
  • Packer在DBA场景的价值:用Packer构建包含数据库软件、监控工具、安全补丁的标准镜像,新数据库服务器可在数分钟内上线,且配置完全一致,消除“手工安装数据库”导致的配置漂移。
  • VM备份:虚拟机快照是数据库备份的有效补充,但必须与数据库内的一致性点协调(如先执行FLUSH TABLES WITH READ LOCK或使用支持崩溃一致的存储)。不建议仅依赖VM快照,仍需结合逻辑备份。