命令行下的虚拟化矩阵:掌握 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 |
删文件 |
生产环境建议
- KVM:适用于需要完全隔离、运行不同内核或Windows的场景,配合libvirt生态成熟。
- LXC:适用于高性能、轻量级场景,启动快,资源开销小,适合微服务和开发测试。
- OpenVZ:老系统维护场景,资源调控粒度细,但已逐渐被LXC替代。
- XEN:适用于对安全性和隔离性要求极高的场景(AWS早期使用),配置复杂但稳定。
所有操作在生产环境前,务必先在测试环境验证!