Centos7部署KVM虚拟机

查看cpu是否支持虚拟化

cat /proc/cpuinfo | egrep 'vmx|svm'

查看是否加载KVM

lsmod | grep kvm

没有加载则执行

modprobe -a kvm
modprobe -a kvm_intel

关闭selinux

setenforce 0
vim /etc/sysconfig/selinux
-------------------
SELINUX=disabled
-------------------

安装KVM软件

yum install qemu-kvm qemu-img libguestfs-tools \
virt-manager libvirt libvirt-python virt-manager qemu-kvm \
libvirt-client virt-install virt-viewer libvirt -y

启动libvirt并设置开机自启动

systemctl start libvirtd
systemctl enable libvirtd
systemctl status libvirtd

创建两个新目录,一个存放系统镜像,一个做虚拟机的存储盘

mkdir /opt/images

进入图形化

virt-manager

修改kvm网段

virsh net-edit default

宿主机查看虚拟机

virsh list --all

查看compute1虚拟机的配置文件

ll /etc/libvirt/qemu

开始克隆

virt-clone -o compute1 -n compute2 -f /home/images/compute2.qcow2

kvm配置网络

宿主机

virsh net-edit default
修改想要的网段
virsh net-define /etc/libvirt/qemu/networks/default.xml
virsh net-destroy default
virsh net-start default
systemctl restart libvirtd

虚拟机配置网络

kvm命令

virsh list --all        查看虚拟机
virsh start xxx     启动虚拟机xxx
virsh shutdown xxx  关闭虚拟机xxx
virsh reboot xxx    重启虚拟机xxx
-o 原虚拟机  -n 新虚拟机  -f  存放路径
virt-clone -o centos7.0 -n xuegod110 -f /var/images/xuegod110.qcow2  克隆虚拟机
virsh snapshot-create 【虚拟机名称】       创建快照
virsh snapshot-list   【虚拟机名称】       查看快照
virsh snapshot-create-as 【虚拟机名】 【快照名】   创建快照
virsh snapshot-revert 【虚拟机名】 【快照名】      快照恢复
virsh snapshot-delete 【虚拟机名】 【快照名】      快照删除


kvm命令脚本

批量克隆

[root@hpc machine]# cat clone_vms.sh 
# 设置原始虚拟机名称和磁盘文件路径
original_vm="centos7.9_01"
original_disk="/mnt/kvm/machine/centos7.9_01.qcow2"

# 目标虚拟机名称和磁盘路径的前缀
target_vm_prefix="centos7.9_"
target_disk_prefix="/mnt/kvm/machine/centos7.9_"

# 使用 for 循环批量克隆虚拟机
for i in $(seq -w 2 17); do
    # 格式化 i 为两位数
    target_vm="${target_vm_prefix}${i}"
    target_disk="${target_disk_prefix}${i}.qcow2"
    
    # 执行 virt-clone 命令
    virt-clone -o "$original_vm" -n "$target_vm" -f "$target_disk"
    
    echo "已克隆虚拟机:$original_vm 到 $target_vm,磁盘文件路径:$target_disk"
done

批量创建快照

[root@hpc machine]# cat create_snapshots.sh 
#!/bin/bash

# 定义快照名称
snapshot_name="purity"

# 循环遍历虚拟机名称并创建快照
for i in $(seq -w 1 17); do
    vm_name="centos7.9_${i}"
    
    # 检查虚拟机是否存在
    if virsh dominfo "$vm_name" &> /dev/null; then
        # 创建快照
        virsh snapshot-create-as "$vm_name" "$snapshot_name" --description "Snapshot $snapshot_name for $vm_name"
        echo "已为虚拟机 $vm_name 创建快照:$snapshot_name"
    else
        echo "虚拟机 $vm_name 不存在,跳过"
    fi
done

批量查看快照

[root@hpc machine]# cat list_snapshots.sh 
#!/bin/bash

# 定义虚拟机的前缀和范围
vm_prefix="centos7.9_"

# 循环遍历所有虚拟机
for i in $(seq -w 2 17); do
    vm_name="${vm_prefix}${i}"
    
    # 检查虚拟机是否存在
    if virsh dominfo "$vm_name" &> /dev/null; then
        echo "虚拟机 $vm_name 的快照列表:"
        virsh snapshot-list "$vm_name"
        echo "-----------------------------"
    else
        echo "虚拟机 $vm_name 不存在,跳过"
    fi
done

批量开关机

[root@hpc machine]# cat manage_vms.sh 
#!/bin/bash

# 检查输入参数
if [ "$1" == "start" ]; then
    action="start"
    echo "Starting all virtual machines..."
elif [ "$1" == "stop" ]; then
    action="shutdown"
    echo "Shutting down all virtual machines..."
else
    echo "Usage: $0 [start|stop]"
    exit 1
fi

# 获取所有虚拟机名称
vm_list=$(virsh list --all --name)

# 遍历虚拟机列表并执行操作
for vm in $vm_list; do
    if [ -n "$vm" ]; then
        echo "${action^}ing $vm..."
        virsh $action $vm
    fi
done

echo "All virtual machines have been ${action}ed."

批量删除快照

[root@hpc sunty]# cat drop_snapshots.sh 
#!/bin/bash

# 定义虚拟机的前缀和范围
vm_prefix="centos7.9_"
snapshot_name="base01"

# 循环遍历虚拟机名称并删除快照
for i in $(seq -w 1 21); do
    vm_name="${vm_prefix}${i}"
    
    # 检查虚拟机是否存在
    if virsh dominfo "$vm_name" &> /dev/null; then
        echo "正在处理虚拟机 $vm_name ..."
        
        # 检查并删除指定名称的快照
        snapshot_exists=$(virsh snapshot-list "$vm_name" --name | grep "$snapshot_name")
        if [ -n "$snapshot_exists" ]; then
            echo "删除快照 $snapshot_name ..."
            virsh snapshot-delete "$vm_name" --snapshotname "$snapshot_name" --metadata
            
            # 删除快照源文件(这里假设快照文件的存放路径根据虚拟机而不同,需要根据实际情况调整)
            snapshot_file="/var/lib/libvirt/images/${vm_name}_${snapshot_name}.qcow2"  # 假设快照存储在该路径下
            
            if [ -f "$snapshot_file" ]; then
                echo "删除快照源文件:$snapshot_file"
                rm -f "$snapshot_file"
            else
                echo "找不到快照源文件:$snapshot_file"
            fi
        else
            echo "虚拟机 $vm_name 没有名为 $snapshot_name 的快照,跳过"
        fi
        
        echo "-----------------------------"
    else
        echo "虚拟机 $vm_name 不存在,跳过"
    fi
done