Virtualization Matrix on the Command Line: Mastering the Lifecycle of KVM/LXC/OpenVZ/XEN Deployment, Monitoring, and Operations

命令行下的虚拟化矩阵:掌握 KVM/LXC/OpenVZ/XEN 的创建、监控与运维闭环

管理和操作不同的虚拟化技术(KVM, LXC, OpenVZ, XEN)是Linux运维的核心技能。虽然它们底层技术各异,但通过相应的命令行工具,我们可以对虚拟机(容器)进行全生命周期管理。


完整运维小鸡实战流程


一、KVM 完整运维

1. 创建虚拟机(小鸡)

# 创建磁盘镜像(qcow2格式支持快照)
[root@nodeloc ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/web01.qcow2 20G
Formatting '/var/lib/libvirt/images/web01.qcow2', fmt=qcow2 size=21474836480

# 使用virt-install安装系统(通过VNC)
[root@nodeloc ~]# virt-install \
  --name web01 \
  --ram 2048 \
  --vcpus 2 \
  --disk path=/var/lib/libvirt/images/web01.qcow2,size=20 \
  --os-type linux \
  --os-variant centos7.0 \
  --network bridge=br0 \
  --graphics vnc,port=5901 \
  --location http://mirror.centos.org/centos/7/os/x86_64/

2. 查看与管理

# 查看所有虚拟机状态
[root@nodeloc ~]# virsh list --all
 Id   Name    State
----------------------
 3    web01   running
 -    db01    shut off

# 查看IP地址(需安装qemu-guest-agent)
[root@nodeloc ~]# virsh domifaddr web01
Name       MAC address          Protocol     Address
----------------------------------------------------
vnet0      52:54:00:xx:xx:xx    ipv4         192.168.1.10/24

# 进入VNC控制台(需要VNC客户端)
[root@nodeloc ~]# virt-viewer web01

# 或通过SSH直接登录
[root@nodeloc ~]# ssh [email protected]

3. 配置调整

# 动态调整内存(在线扩容)
[root@nodeloc ~]# virsh setmem web01 4096M --live

# 动态调整CPU
[root@nodeloc ~]# virsh setvcpus web01 4 --live

# 添加网卡
[root@nodeloc ~]# virsh attach-interface web01 bridge br0 --model virtio --live --config

# 挂载ISO光驱
[root@nodeloc ~]# virsh attach-disk web01 /iso/CentOS-7.iso hdc --type cdrom --mode readonly

4. 备份与快照

# 创建快照(热备份,不停机)
[root@nodeloc ~]# virsh snapshot-create-as web01 snap_20260723 --description "Before update"

# 查看快照列表
[root@nodeloc ~]# virsh snapshot-list web01
 Name                 Creation Time             State
------------------------------------------------------------
 snap_20260723        2026-07-23 10:30:15       running

# 恢复快照
[root@nodeloc ~]# virsh snapshot-revert web01 snap_20260723

# 删除快照
[root@nodeloc ~]# virsh snapshot-delete web01 snap_20260723

# 完整备份磁盘文件
[root@nodeloc ~]# virsh suspend web01  # 暂停保证一致性
[root@nodeloc ~]# cp /var/lib/libvirt/images/web01.qcow2 /backup/web01_$(date +%Y%m%d).qcow2
[root@nodeloc ~]# virsh resume web01

5. 迁移与删除

# 在线迁移到另一台宿主机
[root@nodeloc ~]# virsh migrate --live web01 qemu+ssh://dest-host/system --persistent --undefinesource

# 彻底删除虚拟机
[root@nodeloc ~]# virsh shutdown web01
[root@nodeloc ~]# virsh undefine web01 --remove-all-storage

二、LXC 完整运维

1. 创建容器(小鸡)

# 查看可用模板
[root@nodeloc ~]# lxc-create --help | grep template
# 常用: ubuntu, centos, debian, alpine

# 创建Ubuntu 20.04容器
[root@nodeloc ~]# lxc-create -n web01 -t ubuntu -- --release focal --arch amd64

# 创建CentOS 7容器(使用第三方模板)
[root@nodeloc ~]# lxc-create -n db01 -t centos

# 创建Alpine最小容器(资源占用极小)
[root@nodeloc ~]# lxc-create -n proxy01 -t alpine

2. 启动与进入

# 后台启动容器
[root@nodeloc ~]# lxc-start -n web01 -d

# 查看运行状态和IP
[root@nodeloc ~]# lxc-info -n web01
Name:           web01
State:          RUNNING
PID:            12345
IP:             10.0.3.101
CPU use:        0.23 seconds
BlkIO use:      12.34 MiB
Memory use:     45.67 MiB
KMem use:       5.67 MiB
Link:           veth3J4K2A

# 进入容器(root用户)
[root@nodeloc ~]# lxc-attach -n web01
root@web01:~# 

# 或通过SSH(需先配置IP和密码)
[root@nodeloc ~]# ssh [email protected]

3. 配置调整

# 修改容器配置文件(需停止容器)
[root@nodeloc ~]# lxc-stop -n web01
[root@nodeloc ~]# vi /var/lib/lxc/web01/config

# 增加内存限制(在config中添加)
lxc.cgroup.memory.limit_in_bytes = 512M

# 增加CPU限制(权重,范围0-1024)
lxc.cgroup.cpu.shares = 256

# 绑定宿主机目录到容器(挂载)
lxc.mount.entry = /data/shared var/www/html none bind 0 0

# 重新启动生效
[root@nodeloc ~]# lxc-start -n web01 -d

# 动态调整资源(无需重启)
[root@nodeloc ~]# echo 1024M > /sys/fs/cgroup/memory/lxc/web01/memory.limit_in_bytes

4. 备份与克隆

# 容器快照(使用LVM或直接复制文件)
[root@nodeloc ~]# lxc-stop -n web01
[root@nodeloc ~]# cp -a /var/lib/lxc/web01 /backup/web01_snap_20260723

# 克隆容器(快速复制)
[root@nodeloc ~]# lxc-copy -n web01 -N web02 -k  # -k表示保持原hostname

# 打包成模板(用于分发)
[root@nodeloc ~]# cd /var/lib/lxc
[root@nodeloc ~]# tar czf web01_template.tar.gz web01

# 在其他机器上恢复
[root@nodeloc2 ~]# tar xzf web01_template.tar.gz -C /var/lib/lxc/
[root@nodeloc2 ~]# lxc-start -n web01 -d

5. 销毁与清理

# 停止并删除
[root@nodeloc ~]# lxc-stop -n web01
[root@nodeloc ~]# lxc-destroy -n web01

# 清理残留网卡
[root@nodeloc ~]# ip link show | grep veth | awk -F: '{print $2}' | xargs ip link delete

三、OpenVZ 完整运维

1. 创建容器(小鸡)

# OpenVZ使用模板(预置的系统镜像)
[root@nodeloc ~]# vzctl create 101 --ostemplate centos-7-x86_64 --config basic

# 查看可用模板
[root@nodeloc ~]# vzlist -T
centos-6-x86_64
centos-7-x86_64
ubuntu-14.04-x86_64
debian-8.0-x86_64

# 设置初始资源(创建时指定)
[root@nodeloc ~]# vzctl set 101 --ipadd 192.168.1.101 --hostname web01 --save
[root@nodeloc ~]# vzctl set 101 --ram 1024M --swap 512M --save
[root@nodeloc ~]# vzctl set 101 --diskspace 10G --save

2. 启动与进入

# 启动容器
[root@nodeloc ~]# vzctl start 101
Container 101 is mounted
Setting CPU units: 1000
Setting CPUs: 1
Container 101 started

# 查看状态
[root@nodeloc ~]# vzlist -a
VEID      NPROC STATUS  IP_ADDR         HOSTNAME
101           8 running 192.168.1.101   web01

# 进入容器(类似chroot)
[root@nodeloc ~]# vzctl enter 101
entered into VE 101
[root@web01 /]# 

# 在宿主机直接执行容器内命令
[root@nodeloc ~]# vzctl exec 101 "yum install nginx -y"
[root@nodeloc ~]# vzctl exec 101 "systemctl start nginx"

3. 配置调整(热更新)

# 在线调整内存(无需重启)
[root@nodeloc ~]# vzctl set 101 --ram 2048M --save
Saved parameters for Container 101

# 增加CPU(在线生效)
[root@nodeloc ~]# vzctl set 101 --cpus 2 --save

# 增加磁盘空间
[root@nodeloc ~]# vzctl set 101 --diskspace 20G --save

# 添加第二个IP
[root@nodeloc ~]# vzctl set 101 --ipadd 192.168.1.102 --save

# 添加网卡到另一个网段
[root@nodeloc ~]# vzctl set 101 --netif_add eth1,00:11:22:33:44:55,venet0:1 --save

# 设置带宽限制(流量整形)
[root@nodeloc ~]# vzctl set 101 --rate 100Mbps --save

4. 备份与迁移

# 备份容器(在线备份)
[root@nodeloc ~]# vzctl stop 101  # OpenVZ需要停止备份
[root@nodeloc ~]# tar czf /backup/101_$(date +%Y%m%d).tar.gz -C /vz/private/101 .
[root@nodeloc ~]# vzctl start 101

# 使用vzdump工具(自动化备份)
[root@nodeloc ~]# vzdump 101 --dumpdir /backup --compress gzip

# 恢复到新VEID
[root@nodeloc ~]# mkdir /vz/private/102
[root@nodeloc ~]# tar xzf /backup/101_20260723.tar.gz -C /vz/private/102
[root@nodeloc ~]# vzctl create 102 --private /vz/private/102 --ostemplate none
[root@nodeloc ~]# vzctl set 102 --ipadd 192.168.1.102 --hostname web02 --save
[root@nodeloc ~]# vzctl start 102

# 跨物理机迁移(使用vzmigrate)
[root@nodeloc ~]# vzmigrate --online 192.168.1.200 101

5. 销毁

# 停止并删除
[root@nodeloc ~]# vzctl stop 101
Container was stopped
[root@nodeloc ~]# vzctl destroy 101
Container 101 private area was destroyed

四、XEN 完整运维

1. 创建虚拟机(小鸡)

# 准备磁盘镜像
[root@nodeloc ~]# dd if=/dev/zero of=/var/lib/xen/images/web01.img bs=1M count=20480

# 创建配置文件(半虚拟化PV)
[root@nodeloc ~]# cat > /etc/xen/web01.cfg <<EOF
name = "web01"
memory = 2048
vcpus = 2
disk = ['file:/var/lib/xen/images/web01.img,xvda,w']
vif = ['bridge=br0']
kernel = "/boot/vmlinuz-3.10.0-514.el7.x86_64"
ramdisk = "/boot/initramfs-3.10.0-514.el7.x86_64.img"
extra = "console=hvc0 root=/dev/xvda1 ro"
root = "/dev/xvda1 ro"
bootloader = "/usr/bin/pygrub"
EOF

# 创建全虚拟化HVM(Windows支持)
[root@nodeloc ~]# cat > /etc/xen/win10.cfg <<EOF
name = "win10"
memory = 4096
vcpus = 4
disk = ['file:/var/lib/xen/images/win10.img,hda,w','file:/iso/win10.iso,hdc:cdrom,r']
vif = ['bridge=br0']
vga = "stdvga"
video_mem = 16
device_model = "qemu-system-x86_64"
EOF

# 启动虚拟机(自动安装)
[root@nodeloc ~]# xl create /etc/xen/web01.cfg -c  # -c连接控制台看安装过程

2. 查看与管理

# 查看所有虚拟机
[root@nodeloc ~]# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  4096     8     r-----  12345.6
web01                                        1  2048     2     -b----    123.4
win10                                        2  4096     4     -b----     45.6

# 查看详细信息(含CPU、内存、磁盘)
[root@nodeloc ~]# xl info
[root@nodeloc ~]# xl dominfo web01

# 查看虚拟机IP(通过控制台)
[root@nodeloc ~]# xl console web01
CentOS Linux 7 (Core)
Kernel 3.10.0-514.el7.x86_64 on an x86_64
localhost login: root
Password: 
[root@web01 ~]# ip a
# 按 Ctrl+] 退出控制台

3. 配置调整

# 动态调整内存
[root@nodeloc ~]# xl mem-set web01 4096

# 动态调整CPU(在线增加vCPU)
[root@nodeloc ~]# xl vcpu-set web01 4

# 热插拔磁盘(添加第二块盘)
[root@nodeloc ~]# qemu-img create -f raw /var/lib/xen/images/web01_data.img 100G
[root@nodeloc ~]# xl block-attach web01 /var/lib/xen/images/web01_data.img xvdb w

# 热插拔网卡
[root@nodeloc ~]# xl network-attach web01 bridge=br0,model=virtio

# 在虚拟机内部识别新硬件
[root@web01 ~]# echo 1 > /sys/bus/pci/rescan
[root@web01 ~]# fdisk -l /dev/xvdb

4. 快照与备份

# 创建快照(使用LVM,需底层支持)
[root@nodeloc ~]# lvcreate -L 20G -s -n web01_snap /dev/vg0/web01

# 从快照备份
[root@nodeloc ~]# dd if=/dev/vg0/web01_snap of=/backup/web01_$(date +%Y%m%d).img bs=4M

# 删除快照
[root@nodeloc ~]# lvremove web01_snap

# 热备份(使用dump)
[root@nodeloc ~]# xl pause web01
[root@nodeloc ~]# virsh save web01 /backup/web01.state  # 保存内存状态
[root@nodeloc ~]# cp /var/lib/xen/images/web01.img /backup/
[root@nodeloc ~]# xl unpause web01

5. 迁移与删除

# 在线迁移(需共享存储)
[root@nodeloc ~]# xl migrate web01 192.168.1.200

# 使用xmigrate工具(支持非共享存储)
[root@nodeloc ~]# xmigrate -s /var/lib/xen/images web01 [email protected]

# 彻底删除
[root@nodeloc ~]# xl destroy web01
[root@nodeloc ~]# rm -f /var/lib/xen/images/web01.img /etc/xen/web01.cfg

运维对比总结表

操作 KVM LXC OpenVZ XEN
创建 virt-install lxc-create vzctl create 写cfg文件 + xl create
启动 virsh start lxc-start vzctl start xl create
停止 virsh shutdown lxc-stop vzctl stop xl shutdown
强制停 virsh destroy lxc-stop -k vzctl stop --fast xl destroy
进入 virt-viewer/SSH lxc-attach vzctl enter xl console
热调内存 virsh setmem --live echo到cgroup vzctl set --ram xl mem-set
热调CPU virsh setvcpus echo到cgroup vzctl set --cpus xl vcpu-set
快照 virsh snapshot 复制文件 快照LV LVM快照
备份 复制qcow2 tar打包 vzdump dd/LVM
迁移 virsh migrate lxc-copy vzmigrate xl migrate
删除 virsh undefine lxc-destroy vzctl destroy 删文件

生产环境建议

  1. KVM:适用于需要完全隔离、运行不同内核或Windows的场景,配合libvirt生态成熟。
  2. LXC:适用于高性能、轻量级场景,启动快,资源开销小,适合微服务和开发测试。
  3. OpenVZ:老系统维护场景,资源调控粒度细,但已逐渐被LXC替代。
  4. XEN:适用于对安全性和隔离性要求极高的场景(AWS早期使用),配置复杂但稳定。

所有操作在生产环境前,务必先在测试环境验证!

3 Likes

感谢分享

:ac31:

No idea what this is for, but I saved it anyway.

Got it.

Thank you

Save and learn