KVM 虚拟机管理
前言
本环境是基于 Centos 7.7 系统构建KVM环境
具体构建,请参考 KVM环境的部署
一、创建 KVM 虚拟机
1、安装 windows_xp_professional
执行命令,创建虚拟机
[root@kvm01 iso]# virt-install \
> --name=windows_xp_professional \
> --graphics vnc,listen=0.0.0.0,port=6000,keymap=en_us \
> --ram=500 \
> --vcpus=1 \
> --disk path=/var/lib/libvirt/images/windowsxp.img,size=8,format=qcow2 \
> --bridge=virbr0 \
> --cdrom=/iso/"zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso"
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
WARNING No console to launch for the guest, defaulting to --wait -1
Starting install...
Allocating 'windowsxp.img' | 8.0 GB 00:00:00
Domain installation still in progress. Waiting for installation to complete.
VNC 连接
点击”回车键“开始安装系统
点击“继续”进一步安装
输入秘钥,进一步完成系统安装
查看系统信息
2、安装 Centos-7.8 系统
执行命令,创建虚拟机
[root@kvm01 iso]# virt-install \
> -n name=CentOS-7 \
> --memory 2048,maxmemory=3500 \
> --vcpus 2,maxvcpus=4 \
> --os-type=linux \
> --cdrom=/iso/CentOS-7-x86_64-Minimal-1908.iso \
> --disk path=/var/lib/libvirt/images/centos7u6.img,size=5,format=qcow2 \
> -w bridge=virbr0 \
> --vnc \
> --vncport=6500 \
> --vnclisten=0.0.0.0 \
> --autostart
WARNING No operating system detected, VM performance may suffer. Specify an OS with --os-variant for optimal results.
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package.
WARNING No console to launch for the guest, defaulting to --wait -1
Starting install...
Allocating 'centos7u6.img' | 5.0 GB 00:00:00
Domain installation still in progress. Waiting for installation to complete.
VNC 连接
选择语言类型,点击”continue“,继续安装系统
选择系统参数,开始安装系统
安装完成
登录系统,查看系统信息
二、KVM 管理
1、使用virsh来管理虚拟机
#查看virsh命令帮助
[root@kvm01 ~]# virsh -h
#查看现有系统上安装的所有虚拟机
[root@kvm01 ~]# virsh list --all
Id Name State
----------------------------------------------------
2 windows_xp_professional running
3 name=CentOS-7 running
#停止系统运行
[root@kvm01 ~]# virsh destroy windows_xp_professional
Domain windows_xp_professional destroyed
#删除系统
[root@kvm01 ~]# virsh undefine windows_xp_professional
Domain windows_xp_professional has been undefined
#查看剩余系统
[root@kvm01 ~]# virsh list --all
Id Name State
----------------------------------------------------
3 name=CentOS-7 running
#查看已经运行的虚拟机
[root@kvm01 ~]# virsh list
Id Name State
----------------------------------------------------
3 name=CentOS-7 running
virsh命令常用参数总结
2、管理虚拟存储
a、使用qemu-img管理虚拟磁盘
虚拟存储
KVM 存储模式
[root@kvm01 ~]# qemu-img --help | grep Supported
Supported formats: vvfat vpc vmdk vhdx vdi ssh sheepdog rbd raw host_cdrom host_floppy host_device file qed qcow2 qcow parallels nbd iscsi gluster dmg tftp ftps ftp https http cloop bochs blkverify blkdebu
#创建虚拟磁盘
[root@kvm01 ~]# qemu-img create t1.img 1g
Formatting 't1.img', fmt=raw size=1073741824
#查看虚拟磁盘信息
[root@kvm01 ~]# qemu-img info t1.img
image: t1.img
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
#检查虚拟磁盘
[root@kvm01 ~]# qemu-img check CentOS-7
根据以上测试,默认情况下qemu-img创建的磁盘文件的类型是动态的(Dynamic 空洞)会根据真实存放数据的大小进行动态扩容直到磁盘空间设定值的大小。
b、预分配磁盘策略(qcow2)–磁盘使用多少,将会占用多少
虚拟磁盘格式转换
[root@kvm01 ~]# qemu-img --help | grep convert
convert [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-o options] [-s snapshot_name] [-S sparse_size] filename [filename2 [...]] output_filename
options are: 'none', 'writeback' (default, except for convert), 'writethrough',
'directsync' and 'unsafe' (default for convert)
导出系统
将.vmdk虚拟磁盘文件拷入到KVM虚拟机中
磁盘文件的格式转换
[root@kvm01 images]# qemu-img convert -O qcow2 rhel_7.2-test-disk1.vmdk node6-disk1.img
#查看结果
[root@kvm01 images]# ll -h
total 4.1G
-rw-r--r--. 1 root root 484M Oct 12 05:26 rhel_7.2-test-disk1.vmdk
-rw-r--r--. 1 root root 1.2G Oct 12 05:32 rhel_7.2-test.img
-rw-------. 1 root root 8.1G Oct 11 23:30 windowsxp.img
[root@kvm01 images]# qemu-img info rhel_7.2-test.img
image: rhel_7.2-test.img
file format: qcow2
virtual size: 20G (21474836480 bytes)
disk size: 2.0G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
[root@kvm01 images]# virsh list --all
Id Name State
----------------------------------------------------
3 name=CentOS-7 running
4 rhel_7.2-test running
VNC连接
安装完成
#调整虚拟磁盘大小
[root@kvm01 images]# qemu-img resize centos7u6.img +10G
Image resized.
3、管理存储池
查看现有的存储池
[root@kvm01 ~]# virsh pool-list
Name State Autostart
-------------------------------------------
images active yes
iso active yes
#查看指定存储池中的存储卷
[root@kvm01 ~]# virsh vol-list images
Name Path
------------------------------------------------------------------------------
centos7u6.img /var/lib/libvirt/images/centos7u6.img
[root@kvm01 ~]# virsh vol-list iso
Name Path
------------------------------------------------------------------------------
CentOS-7-x86_64-Minimal-1908.iso /iso/CentOS-7-x86_64-Minimal-1908.iso
a、基于目录的存储池
#常见目录
[root@kvm01 ~]# mkdir /guest_images
#常见存储池
[root@kvm01 ~]# virsh pool-start guest_images
#启动存储池
[root@kvm01 ~]# virsh pool-start guest_images
#设置开机自启
[root@kvm01 ~]# virsh pool-autostart guest_images
#列出所有存储池
[root@kvm01 ~]# virsh pool-list
Name State Autostart
-------------------------------------------
guest_images active yes
images active yes
iso active yes
#删除存储池
[root@kvm01 ~]# virsh pool-destroy guest_images
Pool guest_images destroyed
#删除存储池目录
[root@kvm01 ~]# virsh pool-delete guest_images
Pool guest_images deleted
#删除存储池配置文件
[root@kvm01 ~]# virsh pool-undefine guest_images
Pool guest_images has been undefined
#完成删除
[root@kvm01 ~]# virsh pool-list --all
Name State Autostart
-------------------------------------------
images active yes
iso active yes
b、基于分区的存储池
添加一块磁盘
分区格式化
[root@kvm01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 80G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 79G 0 part
├─centos-root 253:0 0 49.1G 0 lvm /
├─centos-swap 253:1 0 5.9G 0 lvm [SWAP]
└─centos-home 253:2 0 24G 0 lvm /home
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 2G 0 part
sr0 11:0 1 942M 0 rom
[root@kvm01 ~]# mkfs.xfs /dev/sdb1
meta-data=/dev/sdb1 isize=512 agcount=4, agsize=131072 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
创建存储池
[root@kvm01 ~]# virsh pool-define-as guest_images_fs fs --source-dev "/dev/sdb1" --target "/guest_images2"
ol-start guest_images_fs #启动存储
virsh pool-autostart guest_images_fs #标记存储池开机自启动
mount | grep /dev/sdb1 #已经自动挂载Pool guest_images_fs defined
[root@kvm01 ~]# virsh pool-define-as guest_images_fs fs --source-dev "/dev/sdb1" --target "/guest_images2"
[root@kvm01 ~]# virsh pool-build guest_images_fs #创建存储池存储目录
Pool guest_images_fs built
[root@kvm01 ~]# virsh pool-start guest_images_fs #启动存储
Pool guest_images_fs started
[root@kvm01 ~]# virsh pool-autostart guest_images_fs #标记存储池开机自启动
Pool guest_images_fs marked as autostarted
[root@kvm01 ~]# mount | grep /dev/sdb1 #已经自动挂载
/dev/sdb1 on /guest_images2 type xfs (rw,nosuid,nodev,noexec,relatime,seclabel,attr2,inode64,noquota)
c、基于LVM的存储池
#创建vg
[root@kvm01 ~]# virsh pool-define-as guest_images_lvm3 logical --source-dev=/dev/sdc --sourcename=libvirt_lvm --target=/dev/libvirt_vg
#创建lv
[root@kvm01 ~]# virsh pool-build guest_images_lvm3
#启动LVM存储池并标记开机自启动
[root@kvm01 ~]# virsh pool-start guest_images_lvm3
[root@kvm01 ~]# virsh pool-autostart guest_images_lvm3
#常见基于NFS的存储池
[root@kvm01 ~]# virsh pool-define-as --name nfstrial2 --type netfs --source-host 192.168.150.132 --source-path /nfsshare --target /nfstrial2
Pool nfstrial2 defined
3、管理存储卷
#向VM存储池里创建一个存储卷
[root@kvm01 ~]# virsh vol-create-as vm test1.qcow2 1G --format qcow2
[root@kvm01 ~]# virsh vol-info /vm/test1.qcow2
[root@kvm01 ~]# virsh vol-info test1.qcow2 --pool vm
#定义一个基于LVM的存储池
[root@kvm01 ~]# virsh pool-define-as guest_images_lvm logical \
--source-dev=/dev/sdc --target=/dev/vg_libvirt
[root@kvm01 ~]#构建LVM存储池(如果构建失败,可手动pvcreate -y /dev/sdc后再执行)
[root@kvm01 ~]# virsh pool-build guest_images_lvm
#启动基于LVM的存储池
[root@kvm01 ~]# virsh pool-start guest_images_lvm
[root@kvm01 ~]# virsh pool-autostart guest_images_lvm
#向LVM存储池中创建一个存储卷
[root@kvm01 ~]# virsh vol-create-as guest_images_lvm lvvoll 1G
[root@kvm01 ~]# virsh vol-create-as guest_images_lvm lvvol2 2G
[root@kvm01 ~]# virsh vol-create-as guest_images_lvm lvvol3 3G
#定义一个基于LVM的存储池
virsh pool-define-as guest_images_lvm logical \
--source-dev=/dev/sdc --target=/dev/vg_libvirt
[root@kvm01 ~]#构建LVM存储池(如果构建失败,可手动pvcreate -y /dev/sdc后再执行)
[root@kvm01 ~]# virsh pool-build guest_images_lvm
#向VM存储池里创建一个存储卷
[root@kvm01 ~]# virsh vol-create-as vm test1.qcow2 1G --format qcow2
#查看test1.qcow2的卷信息的两种方式
[root@kvm01 ~]# virsh vol-info /vm/test1.qcow2
[root@kvm01 ~]# virsh vol-info test1.qcow2 --pool vm
#定义一个基于LVM的存储池
[root@kvm01 ~]# virsh pool-define-as guest_images_lvm logical \
--source-dev=/dev/sdc --target=/dev/vg_libvirt
[root@kvm01 ~]#构建LVM存储池(如果构建失败,可手动pvcreate -y /dev/sdc后再执行)
[root@kvm01 ~]# virsh pool-build guest_images_lvm
存储卷的克隆
[root@kvm01 ~]# virsh vol-clone --help
#克隆基于目录的存储池中的存储卷test1.qcow2
[root@kvm01 ~]# virsh vol-clone test1.qcow2 test2.qcow2 --pool vm
#克隆基于LVM的存储池中的存储卷
[root@kvm01 ~]# virsh vol-clone lvvoll lvvol4 --pool guest_images_lvm
#存储卷的删除
#查看命令帮助
[root@kvm01 ~]# virsh vol-delete --help
#删除基于LVM存储池中的存储卷
[root@kvm01 ~]]# virsh vol-delete lvvol4 guest_images_lvm
#删除基于LVM的存储池
[root@kvm01 ~]# virsh pool-destroy guest_images_lvm
[root@localhost ~]# virsh pool-undefine guest_images_lvm
#删除基于目录的存储池中的存储卷
[root@kvm01 ~]# virsh vol-delete /vm/test2.qcow2
#删除基于LVM存储池中的存储卷
[root@kvm01 ~]# virsh vol-delete lvvol4 guest_images_lvm
#删除基于LVM的存储池
[root@kvm01 ~]# virsh pool-define-as guest_images_lvm logical \
--source-dev=/dev/sdc --target=/dev/vg_libvirt
[root@kvm01 ~]# virsh pool-build guest_images_lvm
[root@kvm01 ~]# virsh vol-create-as vm test1.qcow2 1G --format qcow2
[root@kvm01 ~]# virsh vol-info /vm/test1.qcow2
[root@kvm01 ~]# virsh vol-info test1.qcow2 --pool vm
[root@kvm01 ~]# virsh pool-define-as guest_images_lvm logical \
--source-dev=/dev/sdc --target=/dev/vg_libvirt
[root@kvm01 ~]# virsh pool-build guest_images_lvm
[root@kvm01 ~]# virsh vol-clone --help
[root@kvm01 ~]#克隆基于目录的存储池中的存储卷test1.qcow2
[root@kvm01 ~]# virsh vol-clone test1.qcow2 test2.qcow2 --pool vm
#克隆基于LVM的存储池中的存储卷
[root@kvm01 ~]# virsh vol-clone lvvoll lvvol4 --pool guest_images_lvm
#查看命令帮助
[root@kvm01 ~]# virsh vol-delete --help
#删除基于LVM存储池中的存储卷
[root@kvm01 ~]]# virsh vol-delete lvvol4 guest_images_lvm
#删除基于LVM的存储池
[root@kvm01 ~]# virsh pool-destroy guest_images_lvm
[root@kvm01 ~]# virsh pool-undefine guest_images_lvm
#删除基于目录的存储池中的存储卷
[root@kvm01 ~]# virsh vol-delete /vm/test2.qcow2
内部资料,仅限学习交流root@localhost ~]# virsh pool-destroy guest_images_lvm
[root@kvm01 ~]]# virsh pool-undefine guest_images_lvm
#删除基于目录的存储池中的存储卷
[root@kvm01 ~]]# virsh vol-delete /vm/test2.qcow2
4、管理快照
[root@kvm01 ~]# qemu-img snapshot -l centos7.img
[root@kvm01 ~]# qemu-img snapshot -c s1 centos7.img #创建磁盘快照
[root@kvm01 ~]# qemu-img snapshot -l centos7.img
#关闭虚拟机回滚磁盘快照
#在虚拟机里删除一个文件然后进行磁盘回滚
[root@kvm01 ~]# qemu-img snapshot -a s1 centos7.img