KVM 指令及操作

KVM常用指令

# 查看所有虚拟机
virsh list --all

# 关闭虚拟机
virsh shutdown name

# 查看虚拟机配置
virsh dominfo kvm-1

# 开机自启
virsh autostart VM-NAME (虚拟机名)     

# 取消开机自启
virsh autostart --disable VM-NAME(虚拟机名)  

# 通过xml 生成虚拟机列表(需要docw2),迁移后进行恢复
virsh define name.xml

# 重启
virsh reboot snale2

# 登录
virsh console name

virsh start kvm_name     //开机
virsh shutdown kvm_name  //关机
virsh destroy kvm_name   //强制(断电)
virsh autostart kvm_name //开机自动开机
virsh undefine kvm_name  //删除虚拟机
virsh suspend kvm_name   //暂停,挂起虚拟机
virsh resume kvm_name    //暂停状态还原
virsh domblklist kvm_name//查看配置的磁盘文件
qemu-img info vm.qcow2   //查看vm.qcow2磁盘信

Kvm虚拟机操作

备份配置文件

# KVM 虚拟机默认的配置文件在 /etc/libvirt/qemu 目录下
ls /etc/libvirt/qemu/

# KVM 虚拟机配置文件的修改
virsh edit centos65_6244

# 备份KVM 虚拟机配置文件
mkdir /data/kvmback
virsh dumpxml snale >/data/kvmback/snale_back.xml

克隆kvm虚拟机

# 克隆一个虚拟机,克隆前需要将原虚拟机关机
virt-clone -o kvm_name1 -n kvm_name2 -f /var/lib/libvirt/images/kvm_name.img
    -o old虚拟机  
    -n new虚拟机  
    -f 指定虚拟机镜像存储路劲

# 创建一个磁盘空间设置大小50G
qemu-img create -f qcow2 centos7.1_8129_129.qcow2 50G 
qemu-img create -f qcow2 -o preallocation=metadata centos7.1_8129_129.qcow2 50G 

修改kvm虚拟机名称

cd /etc/libvirt/qemu
mv old.xml new.xml
# 修改配置(名字)   //修改磁盘名 source file也要修改,使重命名后的虚拟机和磁盘名一致

<domain type='kvm'>
  <name>jcjg-db</name>  //修改此处名字
……
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/jcjg-db.qcow2'/>  //修改此处名字

# 删除原有虚拟机
virsh undefine oldname

# 使用现有文件创建虚拟机
cd /etc/libvirt/qemu
virsh define new.xml

#启动
virsh start newname

修改kvm虚拟机内存CPU

# 查看虚拟机配置
virsh dominfo kvm-1

# 增加虚拟机最大内存
virsh shutdown kvm-1
virsh edit kvm-1  //修改men最大内存值(kb)

# 启动虚拟机
virsh start kvm-1

# 动态修改虚拟机内存
virsh setmem kvm-1 2048M

# 动态修改虚拟机cpu
virsh setvcps kvm-1 2

kvm虚拟机静态迁移

静态迁移就是在虚拟机关机状态下,拷贝虚拟机磁盘文件与配置文件到目标主机中
# 确定虚拟机关闭状态(不关闭也可以使他挂起)
$ virsh list --all
$ virsh suspend test //挂起

# 准备迁移虚拟机,查看该虚拟机配置的磁盘文件
$ virsh domblklist fkh_v5_dev
Target     Source
------------------------------------------------
vda        /mnt/data/libvirt/fkh_dev.qcow2
hda        -

# 导入虚拟机配置文件
$ virsh dumpxml test >new.xml

tar zcvfS fkh_v5_public.tar.gz fkh_v5_public.qcow2
tar zxvf fkh_v5_public.tar.gz

# 拷贝虚拟机配置文件和磁盘文件到目标主机上
$ scp new.xml IP:PORT 
$ scp fkh_dev.qcow2 IP:PORT

# 传输方法1:
tar zcvfS fkh_v5_public.tar.gz fkh_v5_public.qcow2
scp fkh_v5_public.qcow2 IP:PORT

# 传输方法2:
scp fkh_dev.qcow2 IP:PORT
# 传输qcow2 文件过大需要压缩
# 压缩(正常方法)
qemu-img convert -c -O qcow2 fkh_v5_public_1.qcow2 fkh_v5_public.qcow2

# 定义注册虚拟机 //源和目标磁盘文件路径一样时,若不一样需修改xml
$ virsh define new.xml

# 启动虚拟机
$ virsh start new_kvm
$ virsh list --all

# 报错CPU类型不一致
# error: Failed to start domain fkh-mkbx
# error: the CPU is incompatible with host CPU: Host CPU does not provide required features: md-clear, spec-ctrl, ssbd

# 解决方法:
$ virsh capabilities 
 <capabilities>

  <host>
    <uuid>4c4c4544-0033-5910-8032-c8c04f4c4632</uuid>
    <cpu>
      <arch>x86_64</arch>
      <model>Broadwell</model>      //当前主机CPU类型
      <vendor>Intel</vendor>
      <microcode version='184549399'/>
      
# 修改xml文件的CPU类型
  <cpu mode='custom' match='exact' check='partial'>
    <model fallback='allow'>【Skylake-Server-IBRS】</model>   //修改为目标主机CPU类型,注意以下三行需要删除
    <feature policy='require' name='md-clear'/>
    <feature policy='require' name='spec-ctrl'/>
    <feature policy='require' name='ssbd'/>
  </cpu>

# 重新注册并启动
$ cp xml /home   //先进行备份,会删除默认路径下的xml文件
$ virsh undefine kvm
$ virsh define kvm
$ virsh start kvm

kvm虚拟机新家磁盘

# 创建新的磁盘
$ qemu-img create -f qcow2 /var/lib/libvirt/images/new.qcow2 100G

# 编辑配置xml
$ vim /etc/libvirt/qemu/test.xml
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/mnt/data/libvirt/fkh_dev.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    //复制以上6行配置,注意修改dev='vdb',新磁盘名字,卡槽名称的变动,符合16进制即可
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/mnt/data/libvirt/new.qcow2'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>  //不确定卡槽名称可不写
    </disk>

# 重新加载配置文件,重启虚拟机
$ virsh define test.xml
$ virsh start test

kvm虚拟机磁盘无损扩容-qcow2格式

# 关闭kvm虚拟机
virsh shutdown fkh-db

# 查看qcow2
virsh domblklist fkh-db
目标     源
------------------------------------------------
vda        /var/lib/libvirt/images/fkh-db.qcow2
hda        -

# 新增磁盘容量
qemu-img resize fkh-db.qcow2 +500G

# 查看磁盘变化
qemu-img info fkh-db.qcow2

# 开启虚拟机进行分区
fdisk /dev/vda

命令(输入 m 获取帮助):n
Partition type:    
  p primary (2 primary, 0 extended, 2 free)    
  e extendedSelect (default p): p
分区号 (3,4,默认 3):3
起始 扇区 (41943040-83886079,默认为 41943040):
将使用默认值 41943040
Last 扇区, +扇区 or +size{K,M,G} (41943040-83886079,默认为 83886079):
将使用默认值 83886079
分区 3 已设置为 Linux 类型,大小设为 20 GiB

命令(输入 m 获取帮助):t
分区号 (1-3,默认 3):3
Hex 代码(输入 L 列出所有代码):8e
已将分区“Linux”的类型更改为“Linux LVM”

命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
最终要的地方就是 分配新的区需要修改分区的system id,将分区类型改为LVM(Hex代码为8e)

# 刷新分区表
partprobe /dev/vda

# 创建物理卷pv
[root@localhost ~]# pvcreate /dev/vda3 
  Physical volume "/dev/vda3" successfully created.
[root@localhost ~]# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/vda2
  VG Name               centos
  PV Size               <49.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              12543
  Free PE               0
  Allocated PE          12543
  PV UUID               2qM0yj-5veI-3mtp-csc9-qdCi-HfXI-iRebMC
   
  "/dev/vda3" is a new physical volume of "500.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/vda3
  VG Name               
  PV Size               500.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               UMW1QC-ryDK-k2hh-Cm52-EoDh-A6DK-C3VVTD
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/vda2  centos lvm2 a--  <49.00g      0 
  /dev/vda3         lvm2 ---  500.00g 500.00g

# 查看vg卷组名  
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree
  centos   1   2   0 wz--n- <49.00g    0 
# 扩展vg卷组
[root@localhost ~]# vgextend centos /dev/vda3 
  Volume group "centos" successfully extended
[root@localhost ~]# vgs
  VG     #PV #LV #SN Attr   VSize   VFree   
  centos   2   2   0 wz--n- 548.99g <500.00g

# 扩展逻辑卷
[root@localhost ~]# lvextend -l +100%FREE /dev/centos/root 
  Size of logical volume centos/root changed from <44.00 GiB (11263 extents) to 543.99 GiB (139262 extents).
  Logical volume centos/root successfully resized.
# 扩展根目录文件系统
[root@localhost ~]# xfs_growfs /dev/mapper/centos-root
meta-data=/dev/mapper/centos-root isize=512    agcount=4, agsize=2883328 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=11533312, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=5631, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 11533312 to 142604288