跳转至

Linux虚拟化技术

概述

Linux虚拟化技术允许在单个物理主机上运行多个虚拟机,提高硬件利用率,简化系统管理。

虚拟化类型

类型 说明 代表
全虚拟化 完全模拟硬件 KVM、VMware、VirtualBox
半虚拟化 修改客户系统 Xen
容器虚拟化 进程级隔离 Docker、LXC

KVM虚拟化

安装KVM

Bash
# Ubuntu/Debian
apt install qemu-kvm libvirt-daemon-system libvirt-clients virt-manager

# CentOS/RHEL
yum install qemu-kvm libvirt virt-install virt-manager

# 启动libvirtd
systemctl start libvirtd
systemctl enable libvirtd

# 检查KVM支持
egrep -c '(vmx|svm)' /proc/cpuinfo    # 检查CPU虚拟化支持
kvm-ok                                # Ubuntu检查命令

virsh命令

Bash
# 查看虚拟机
virsh list --all

# 启动虚拟机
virsh start vm1

# 关闭虚拟机
virsh shutdown vm1
virsh destroy vm1    # 强制关闭

# 重启虚拟机
virsh reboot vm1

# 暂停/恢复
virsh suspend vm1
virsh resume vm1

# 删除虚拟机
virsh undefine vm1

# 查看虚拟机信息
virsh dominfo vm1

# 查看虚拟机状态
virsh domstate vm1

# 控制台连接
virsh console vm1

创建虚拟机

Bash
# 使用virt-install创建
virt-install \
  --name vm1 \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/vm1.qcow2,size=20 \
  --os-variant ubuntu20.04 \
  --network bridge=virbr0 \
  --graphics vnc,listen=0.0.0.0 \
  --cdrom /path/to/ubuntu.iso

# 使用现有磁盘
virt-install \
  --name vm2 \
  --ram 4096 \
  --vcpus 4 \
  --disk /var/lib/libvirt/images/vm2.qcow2 \
  --import

虚拟机克隆

Bash
# 克隆虚拟机
virt-clone --original vm1 --name vm1-clone --file /var/lib/libvirt/images/vm1-clone.qcow2

快照管理

Bash
# 创建快照
virsh snapshot-create-as vm1 snap1 "Before update"

# 查看快照
virsh snapshot-list vm1

# 恢复快照
virsh snapshot-revert vm1 snap1

# 删除快照
virsh snapshot-delete vm1 snap1

# 查看快照信息
virsh snapshot-info vm1 snap1

QEMU命令行

直接使用QEMU

Bash
# 创建磁盘镜像
qemu-img create -f qcow2 disk.qcow2 20G
qemu-img create -f raw disk.raw 20G

# 启动虚拟机
qemu-system-x86_64 \
  -m 2048 \
  -smp 2 \
  -drive file=disk.qcow2,format=qcow2 \
  -cdrom ubuntu.iso \
  -boot d \
  -netdev user,id=net0 -device e1000,netdev=net0

# 启用KVM加速
qemu-system-x86_64 -enable-kvm -m 2048 disk.qcow2

# 查看镜像信息
qemu-img info disk.qcow2

# 转换镜像格式
qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2
qemu-img convert -f qcow2 -O vmdk disk.qcow2 disk.vmdk

网络配置

网络模式

Bash
# NAT模式(默认)
virsh net-start default
virsh net-autostart default

# 查看网络
virsh net-list --all
virsh net-info default

# 创建桥接网络
# /etc/network/interfaces
auto br0
iface br0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0

存储池管理

Bash
# 查看存储池
virsh pool-list --all

# 创建目录存储池
virsh pool-define-as --name local --type dir --target /var/lib/libvirt/images
virsh pool-build local
virsh pool-start local
virsh pool-autostart local

# 查看存储池信息
virsh pool-info local

# 查看存储卷
virsh vol-list local

VirtualBox

命令行管理

Bash
# 查看虚拟机
VBoxManage list vms
VBoxManage list runningvms

# 启动虚拟机
VBoxManage startvm vm1 --type headless

# 关闭虚拟机
VBoxManage controlvm vm1 poweroff
VBoxManage controlvm vm1 acpipowerbutton

# 创建虚拟机
VBoxManage createvm --name vm1 --register
VBoxManage modifyvm vm1 --memory 2048 --cpus 2
VBoxManage createhd --filename vm1.vdi --size 20480

# 快照
VBoxManage snapshot vm1 take snap1
VBoxManage snapshot vm1 restore snap1
VBoxManage snapshot vm1 delete snap1

Vagrant

基本使用

Ruby
# Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.vm.hostname = "myvm"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 2048
    vb.cpus = 2
  end
  config.vm.provision "shell", inline: <<-SHELL
    apt update
    apt install -y nginx
  SHELL
end
Bash
# 启动虚拟机
vagrant up

# 连接虚拟机
vagrant ssh

# 查看状态
vagrant status

# 停止虚拟机
vagrant halt

# 删除虚拟机
vagrant destroy

# 重新加载
vagrant reload

# 查看SSH配置
vagrant ssh-config

资源监控

查看虚拟机资源

Bash
# CPU使用
virsh vcpuinfo vm1

# 内存使用
virsh dommemstat vm1

# 磁盘I/O
virsh domblkstat vm1

# 网络I/O
virsh domifstat vm1 vnet0

# 综合监控
virt-top

迁移

在线迁移

Bash
1
2
3
4
5
# 迁移到另一台主机
virsh migrate --live vm1 qemu+ssh://dest-host/system

# 离线迁移
virsh migrate vm1 qemu+ssh://dest-host/system

参考资料