KVM

参考文章:

朱双印的博客

检查是否支持KVM

# ubuntu检查
apt install cpu-checker -y
kvm-ok

lscpu | grep -E 'vmx|svm'

VMware的嵌套虚拟化在 处理器 -> 虚拟化引擎 -> 虚拟化Intel VT-x/EPT 或 AMD-V/RVI中开启
但是VMware的虚拟化似乎不能和dockerWSL共存

KVM使用

示例管理

虚拟机创建

创建新的虚拟机
完全虚拟化
# 全虚拟化, 纯软件模拟硬件设备
virt-install \
--name=kvm2_centos7 \ # 虚拟机名称
--vcpus=2 \           # 分配cpu核心数
--memory=2048 \       # 设置虚拟机内存
--location=/data/iso/CentOS-7-x86_64-Everything-2009.iso \ # 镜像文件位置 貌似cdrom才是指定镜像位置的命令?
--disk path=/var/lib/libvirt/images/kvm2_centos7.qcow2 \   # 虚拟机磁盘镜像
--network network=default \ # 指定kvm网络
--graphics none \ # 是否需要图形化安装界面
--extra-args='console=ttyS0'# 创建虚拟机指定内核启动参数, 此处为分配一个x终端
半虚拟化
  • 是否支持半虚拟化
# 半虚拟化, 虚拟机系统需支持virtio驱动
## 貌似是centos独有的?
lsmod | grep virtio
## 若CONFIG_VIRTIO_BLK和CONFIG_VIRTIO_NET的值均为m才可
grep -i virtio /boot/config-$(uname -r)
  • virtio创建
## 指定使用virtio
virt-install \
--name=kvm2_centos7 \ # 虚拟机名称
--vcpus=2 \           # 分配cpu核心数
--memory=2048 \       # 设置虚拟机内存
--location=/data/iso/CentOS-7-x86_64-Everything-2009.iso \ # 镜像文件位置
--disk path=/var/lib/libvirt/images/kvm2_centos7.qcow2,bus=virtio \   # 虚拟机磁盘镜像, 硬盘驱动使用virtio
--network network=default,model=virtio \ # 指定kvm网络, 网卡驱动virtio
--graphics none \ # 是否需要图形化安装界面
--extra-args='console=ttyS0'# 创建虚拟机指定内核启动参数, 此处为分配一个x终端
镜像导入虚拟机
# 导入镜像
 virt-install --import \
 --name kvm2import \ # 虚拟机名称
 --vcpus=4 \         # 分配cpu核心数
 --ram 4096 \        # 导入内存
 --cpu host-model \  # 尚不明确
--disk path=/var/lib/libvirt/images/kvm2_centos7.qcow2,bus=virtio \   # 虚拟机磁盘镜像
 --network network=default,model=virtio \
 --nographics    # 已向内核传入参数, 采用非图形化的console连入虚拟机
 --noautoconsole # 不会自动连入控制台
配置导入虚拟机
virsh define xml_path
克隆生成虚拟机
virt-clone --auto-clone \
-o kvm1 \ # 克隆kvm1
-n kvm2   # 生成kvm2
创建WIN10LTS虚拟机
理论操作(网上抄的)
 virt-install \            
 --name WIN10LTS \ # 虚拟机命名
 --memory 8192 \   # 虚拟机内存大小设置
 --vcpus=4 \       # 虚拟机核心数分配
 --cdrom=/kvm/ios/Windows.iso \    # 虚拟机安装镜像位置指定
 --os-type=windows \            # 尚不明确作用
 --os-variant=auto \            # 尚不明确作用
 --disk /kvm/kvm-img/win10-01.qcow2,size=30,format=qcow2 \ # 指定硬盘位置
 --disk /kvm/kvm-img/virtio-win-0.1.173_amd64.vfd,device=floppy \    # 指定windows驱动文件位置
 --network bridge=br0,model=virtio \ # 创建网卡br0
 --graphics vnc,listen=0.0.0.0 \     # 开启vnc, 可连接localhost:5900连接
 --hvm \         # 尚不明确作用
 --autostart \   # 自动重启
 --virt-type kvm \ # 尚不明确作用
 --noautoconsole \ # 尚不明确作用
 --features kvm_hidden=on,hyperv_relaxed=on,hyperv_vapic=on,hyperv_spinlocks=on,hyperv_spinlocks_retries=8191 # 尚不明确作用
实际操作(自己试了)
virt-install \
--name=WIN10LTS \
--vcpus=16 \
--memory=8192 \
--cdrom=/opt/KVM_file/ISO/win10LTS_x64_dvd.iso \
--disk path=/opt/KVM_file/disk/win10LTSdisk.qcow2 \
--network network=default \
--graphics vnc, listen=0.0.0.0,port=2500 \
--autostart
KVM多核心问题

未遇到, 先保存

安装win10指定8核 实际只有2核    
    优化:    
            关闭虚拟机                
            修改/etc/libvirt/qemu下虚拟机配置文件xml,添加一个socket多个core                
            在<cpu>下添加下面内容    
                    <topology sockets='2' cores='2' threads='2'/>          
            然后修改<vcpu placement='static'>8</vcpu>中的vcpu数量为8    
            启动虚拟机    

虚拟机状态修改

virsh list       --all    # 查看所有虚拟机状态
virsh domstate   kvm_name # 查看某一虚拟机状态
virsh start      kvm_name # 启动虚拟机
virsh shutdown   kvm_name # 关闭虚拟机
virsh suspended  kvm_name # 挂起虚拟机
virsh resume     kvm_name # 恢复虚拟机
virsh undefine   kvm_name # 删除虚拟机
virsh undefine   kvm_name -remove-all-storage # 彻底删除虚拟机, 包括磁盘, 配置文件

虚拟机信息查询

# 一个虚拟机称为一个domain
virsh dominfo    kvm_name # 查看虚拟机信息
## 虚拟机详细信息在 /etc/libvirt/qemu
virsh dumpxml    kvm_name # 输出虚拟机配置
virsh domstate   kvm_name # 查看虚拟机状态
virsh domblklist kvm_name # 查看虚拟机使用磁盘信息

虚拟机信息修改

virsh autostart kvm_name # 自启虚拟机
virsh autostart --disable kvm_name # 取消自启虚拟机virsh domrename kvm_old_name kvm_new_name # 虚拟机改名
virt-clone --auto-clone -o kvm_src -n kvm_des # 复
virsh edit      kvm_name # 编辑虚拟机设置 直接vim无效
制虚拟机
# 虚拟机详细信息在 /etc/libvirt/qemu

# cpu动态扩容, 只能加不能减
virsh edit kvm_name
<vcpu placement='auto' current="1">4</cpu> # 但是win10试了, 貌似不成功
virsh setvcpus kvm_name 4 --config # 貌似当修改配置不行, 还得再加句这个? 该句出处是静态分配cpu

# 内存动态扩容
virsh qemu-monitor-command kvm_name --hmp --cmd info balloon # 查看虚拟机当前内存
virsh qemu-monitor-command kvm_name --hmp --cmd ballon 512 # 限制虚拟机内存为512M

快照管理

创建快照

virsh snapshot-create  kvm_name # 生成快照 --atomic可保证磁盘创建快照成功
virsh snapshot-create-as --domain kvm_name --name shot_name --description # 生成快照并指定名字和备注

删除快照

virsh snapshot-delete kvm_name shot_name # 删除快照 --children可删除子快照 --children-only 仅删除子快照

查找快照

# 快照配置位置默认为/var/lib/libvirt/qemu/snapshot/
virsh snapshot-list    kvm_name # 查看快照 --tree可看到快照层级关系
virsh snapshot-parent  kvm_name shot_name # 查看快照父快照
virsh snapshot-info    kvm_name shot_name # 查看快照简要信息
virsh snapshot-dumpxml kvm_name shot_name # 查看快照详细信息
virsh snapshot-current kvm_name # 查看虚拟机当前属于哪个快照

恢复快照

virsh snapshot-revert kvm_name --snapshotname shot_name # 恢复虚拟机至某快照
virsh snapshot-revert kvm_name --current # 恢复至最近快照

磁盘管理

创建磁盘

qemu-img create -f qcow2 disk.qcow2 50G # 创建一个qcow2格式的50G大小硬盘

查询磁盘

qemu-img -h | grep Supported # 所有支持的格式
qemu-img info disk_name      # 查看硬盘详细信息
qemu-img snapshot -l disk_file # 查看硬盘镜像信息

扩容磁盘

# 需要磁盘没有镜像!
qemu-img resize disk_file +20G
扩容根分区和拓展分区

emmm, Linux基础还不熟, 下次一定

网络管理

默认情况下, KVM会创建一个virbr0的默认nat网络虚拟交换机
所有默认网络的虚拟机会连接到virbr0交换机, 做一个snat访问外部资源

还剩部分网络实验, 没有需求, 暂时放着了
剩余

查看网口

brctl show # 展示交换机?

修改网口

ifconfig vnet0 down # 模拟拔下虚拟机网线?(没试)
最后修改:2025 年 03 月 22 日
赛博讨口子