KVM虚拟化

KVM虚拟化


## [1、 kvm虚拟化管理软件的安装](#1) ## ## [2、安装一台KVM虚拟机](#2) ## ## [3、虚拟机virsh的日常管理和配置](#3) ## ## [4、KVM虚拟机开机自启和console控制台登录](#4) ## ## [5、kvm虚拟磁盘创建及格式转换](#5) ## ## [6、快照管理](#6) ## ## [7、KVM虚拟机克隆](#7) ## ## [8、kvm虚拟机的桥接网络](#8) ## ## [9、热添加技术](#9) ## ## [10、KVM热迁移](#10) ##

**KVM全称:Kernel-based Virtual Machine ( 基于内核的虚拟机 ) **

前提:

1. 查看是否开启CPU虚拟化
	在宿主机下输入: dmesg | grep kvm,输出为:kvm: no hardware support 表示未开启CPU虚拟化,需要在物理	机上打钩,即执行步骤2
	
2. 在关机状态下,启用cpu虚拟化
	编辑虚拟机设置 --> 处理器 --> 将  虚拟化Inter VT -xEPT 或 AMD-V/RVI(V)  选项打钩
	
3. 开启CPU虚拟化服务
	开启:modprobe kvm
	检查:cat /proc/cpuinfo |grep vmx		# 查看是否有“vmx”,有则表示开启成功
	
4. 加载KVM内核模块
	执行:modprobe kvm-intel
	检查:lsmod | grep kvm
	结果如下,则表示加载成功:
		[root@kvm ~]# lsmod | grep kvm
         kvm_intel             183737  0
         kvm                   615914  1 kvm_intel
         irqbypass              13503  1 kvm

1、 kvm虚拟化管理软件的安装

yum install libvirt virt-install qemu-kvm -y

安装说明:
	libvirt:虚拟机的管理软件,可以管理KVM、xen、qemu、lxc...
	virt-instal: 虚拟机的安装工具和克隆工具
	qemu-kvm  qemu-img (qcow2,raw):管理虚拟机的虚拟磁盘

各种虚拟化软件:
	qemu      软件纯模拟全虚拟化软件,特别慢!AIX,兼容性好!
	xen(半)   性能特别好,需要使用专门修改之后的内核,兼容性差!  redhat 5.5  xen
	KVM(linux)    全虚拟机,它有硬件支持cpu,基于内核,而且不需要使用专门的内核,性能较好,兼容较好

2、安装一台KVM虚拟机

准备:

本地:分发软件TightVNC或者VNC Viewer 4.exe
宿主机: vnc 远程的桌面管理工具		# 宿主机就是虚拟机所依赖的主机,我的宿主机IP:10.0.0.200

启动虚拟机管理软件 :systemctl start libvirtd.service

启动:systemctl start libvirtd.service
停止:systemctl stop libvirtd.service
查看:systemctl status libvirtd.service
开机自启动:systemctl enable libvirtd.service

上传镜像:

/opt/CentOS-7-x86_64-DVD-1810.iso	
### 这是我设置的路径,其他路径也可以,但建议不要放在root下,防止访问时权限不够而出现 Permission denied

安装KVM:( 建议虚拟机内存不要低于1024M,否则安装系统特别慢!)

执行:
virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 --cdrom /opt/CentOS-7-x86_64-DVD-1810.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

参数说明:
	--virt-type kvm    虚拟化的类型(qemu)
	--os-type=linux    系统类型
	--os-variant rhel7 系统版本
	--name centos7     虚拟机的名字 
	--memory 1024      虚拟机的内存
	--vcpus 1          虚拟cpu的核数
	--disk /opt/centos2.raw,format=raw,size=10	硬盘位置,存储格式,硬盘大小
	--cdrom /opt/CentOS-7-x86_64-DVD-1810.iso 	光驱路径/镜像路径(根据实际镜像路径配置)
	--network network=default   使用默认NAT的网络	使用宿主机IP
	--graphics vnc,listen=0.0.0.0 	
	--noautoconsole
	
磁盘格式:
	raw: 不支持做快照,性能好
	qcow2:   支持快照
	
安装一台KVM虚拟机相当于创建2个文件:
	磁盘文件:--disk /opt/centos2.raw,format=raw,size=10	硬盘位置,存储格式,硬盘大小
	配置文件:/etc/libvirt/qemu/虚拟机名.xml
  • 安装成功标志:

    Starting install...
    Allocating 'centos2.raw'                                                                                                      |  10 GB  00:00:00
    Domain installation still in progress. You can reconnect to
    the console to complete the installation process.
    
  • 安装过程如果报错如下:

    ERROR    Network not found: no network with matching name 'default'
    Removing disk 'centos2.raw'                                                                                                   |    0 B  00:00:00
    Domain installation does not appear to have been successful.
    If it was, you can restart your domain by running:
      virsh --connect qemu:///system start centos7
    otherwise, please restart your installation.
    

    则表示找不到默认网络配置文件,解决办法:https://wiki.libvirt.org/page/Networking

    安装成功后,使用VNC连接,10.0.0.200:5900(vnc默认端口为5900)

系统安装:

​ 连接成功后,使用上下键选择 Install Centos7,回车,开始系统安装!

系统语言使用默认英文,无需改变,直接下一步

①、配置 DATE & TIME:

②、配置 Kdump:

Kdump是个内核奔溃备份机制,需要占用内存

这里显示要占用160M,如果给虚拟机分配的内存很大,则可以勾选,否则不建议勾选:

③、选择网络和主机 (network & host name)

④、选择分区(Installation Destination)

然后点击 Installation 开始安装,安装过程中必须设置 root 密码

总结:

一、语言:
	选择默认(英语)
二、系统配置:
    1、修改时区
    2、关闭Kdump
    3、网卡开机启动
    4、手动分区:只要一个标准根分区
三、开始安装:
	设置root密码
四、安装完成点击reboot重启	


3、虚拟机virsh的日常管理和配置

-列表 list(--all)
	virsh list : 只列出正在运行的虚拟机
	virsh list --all : 列出所有虚拟机
	
-开机 start
	virsh start 虚拟机名
	
-关机 shutdown
	virsh shutdown 虚拟机名
	
-拔电源关机 destroy
	virsh destroy 虚拟机名
	
-删除 define
	virsh undeine 虚拟机名
	推荐:先destroy,在undefine
	
-导出配置dumpxml(默认导出是xml格式文件)
	eg:virsh dumpxml centos7 >centos7-off.xml
	
-导入配置define
	eg:virsh define centos7-off.xml
	
-重命名 domrename (低版本不支持)
	virsh domrename 虚拟机名
	
-挂起 suspend
	virsh suspend 虚拟机名
	
-恢复挂起 resume
	virsh resume 虚拟机名
	
-查询vnc端口号 vncdisplay	(默认第一个虚拟机端口是0,第二个是1,第三个是2,...一次类推)
	virsh vncdisplay 虚拟机名
	

4、KVM虚拟机开机自启和console控制台登录

  • 设置开机启动:
前提:将libvirtd服务设置为开机启动	systemctl enable libvirtd.service

KVM开机启动:virsh autostart 虚拟机名
取消开机启动:virsh autostart --disable 虚拟机名

ps:
    1、设置开启动后会在  /etc/libvirt/qemu/ 下生成一个autostart文件夹
    2、在autostart下会生成一个软连接:虚拟机名.xml 指向配置文件
    	centos7.xml -> /etc/libvirt/qemu/centos7.xml
    3、我们也可以为虚拟机手动创建一个指向该虚拟机配置文件的软连接,使得该虚拟机可以开机自启
    	ln -s /etc/libvirt/qemu/web01.xml /etc/libvirt/qemu/autostart/
    

  • 设置console控制台登录:
在虚拟机上执行以下命令来开启console登录:(宿主机无需做修改)
	grubby --update-kernel=ALL --args="console=ttyS0,115200n8"		# 修改内核参数
	reboot

	在虚拟机上进行修改时,需要手动输入上述命令,或者vim 编辑 /boot/grub2/grub.cfg 文件,100行左右
	此时虚拟机是无法进行粘贴辅助,我们可以通过宿主机ssh到虚拟机,然后进行修改(ip a 进行查看虚拟机ip)
	ssh 虚拟机ip
	

在虚拟机上进行修改时,需要手动输入上述命令,或者vim 编辑 /boot/grub2/grub.cfg 文件,100行左右,此时虚拟机 是无法进行粘贴辅助,我们可以通过宿主机ssh到虚拟机,然后进行修改(ip a 进行查看虚拟机ip),如下:

[root@kvm autostart]# ssh 192.168.122.235
The authenticity of host '192.168.122.235 (192.168.122.235)' can't be established.
ECDSA key fingerprint is SHA256:WS7XFnasPFwRohib6B+m7V6z9+5Pkh5IaornITRGGWo.
ECDSA key fingerprint is MD5:7a:9c:33:0e:ab:c1:a0:2f:d3:a9:96:71:d6:c1:c6:79.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.122.235' (ECDSA) to the list of known hosts.
root@192.168.122.235's password:
Last login: Sat Jun  8 17:42:58 2019
[root@localhost ~]#
[root@localhost ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@localhost ~]#
[root@localhost ~]# reboot
Connection to 192.168.122.235 closed by remote host.
Connection to 192.168.122.235 closed.

  • 设置成功后,在宿主机上通过命令登录虚拟机 :

    virsh console 虚拟机名


5、kvm虚拟磁盘创建及格式转换

查看磁盘信息:qemu-img info 磁盘名

2种磁盘格式比较:

raw:裸格式,占用空间比较大,不支持快照功能,性能较好,不方便传输          总50G 占用2G,但传输还是要传50G
qcow2:占用空间小,支持快照,性能比raw差一点,方便传输  总50G 占用2G,传输只传2G

qcow2全称:
	q:qemu
    cow:copy on write	写时复制(用多少,分配多少)

创建一块qcow2格式的虚拟硬盘:

创建一块qcow2格式的虚拟硬盘:
	qemu-img create -f qcow2 centos2.qcow2 10G
		-f qcow2  :  声明创建的磁盘文件格式为qcow2格式,如果不写,则默认创建raw格式的磁盘文件
		10G : 声明创建的磁盘文件的大小

磁盘扩容:磁盘容量只能扩容,不能缩减,缩减很有可能会丢失数据

qemu-img resize /data/centos2.qcow2 +20G
    +20G: 从原来的容量上增加20G
    20G:将容量扩容到20G,不加"+"表示扩容到x,这里的x要大于原本容量

磁盘格式转换

qemu-img  convert 	-f raw   	-O qcow2    	oldboy.raw   oldboy.qcow2					

		 convert 	[-f fmt]   [-O output_fmt]    filename     output_filename
		 转换			原格式		输出格式		源文件路径     输出文件路径
# 上述命令执行完成后,相当于转换成了一个新格式的磁盘文件,源文件并没有动,(相当于我们将word转换成pdf,会新	产	生一个文件)
# 此时,KVM使用的还是原来的磁盘文件,我们需要修改配置文件的磁盘信息(修改配置信息,在关机状态下修改)
    virsh destroy web01

    virsh edit web01:

    <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2'/>		# 将文件格式由raw修改为qcow2
    <source file='/opt/centos.qcow2'/>			# 将文件路径修改为转换后的文件路径
    <target dev='vda' bus='virtio'/>
    <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

    virsh start web01	

6、快照管理

创建快照virsh snapshot-create centos7	(这种方式创建的快照,以当前的时间戳作为快照名)
自定义快照名创建快照:virsh snapshot-create-as --name 快照名 centos7
查看快照virsh snapshot-list centos7
还原快照virsh snapshot-revert centos7 --snapshotname 快照名
删除快照virsh snapshot-delete centos7 --snapshotname 快照名
1、raw不支持做快照,qcow2支持快照,并且快照就保存在qcow2的磁盘文件中
2、由于qcow2属于用多少空间,分配多少,但当我们把快照删除后,分配给快照的空间不会自动回收
3、如果要回收空余的空间,可使用:
	qemu-img	convert -c -f qcow2 -O qcow2 oldboy.qcow2  oldboy.qcow2			# -c 表示压缩

7、KVM虚拟机克隆

  • 完整克隆

    virt-clone --auto-clone -o web01 -n web02	# 必须在关机或挂起状态进行克隆,否则会报错
    
  • 链接克隆(依赖基础磁盘文件,把变化的内容保存在一个新的qcow2文件中)

    a:生成虚拟机磁盘文件
    	qemu-img create -f qcow2 -b /data/centos2.qcow2 /data/centos3.qcow2	# -b表示创建的是链接磁盘
    
    b:生成虚拟机的配置文件
    	b1:先复制一份虚拟机的配置文件
    		cp /etc/libvirtd/qemu/centos7.xml /etc/libvirtd/qemu/centos7_link.xml
    	b2: 修改配置
        <name>49-web03</name>		# 修改name
        <uuid>8e505e25-5175-46ab-a9f6-feaa096daaa4</uuid>			# 删除掉uuid,重启会自动生成
        <source file='/opt/49-web03.qcow2'/>		#修改路径
        <mac address='52:54:00:4e:5b:89'/>		# 删除mac地址,重启会自动生成
        
    c:导入虚拟机并进行启动测试
    	导入:virsh define /etc/libvirtd/qemu/centos7_link.xml
    	启动:virsh start 虚拟机名    #这里的虚拟机名是我们在配置文件中修改name后的名称
    	
    ps:
    	写一个脚本,实现自动化链接克隆
    

8、kvm虚拟机的桥接网络

检查虚拟机网络状况,是否能上网?

从虚拟机ping外网:ping baidu.com ,发现不通
从宿主机ping外网:可以通

总结:当虚拟机将数据包转发给宿主机时,宿主机没有转发到外网,说明宿主机没有开启内核转发参数
解决:开启内核转发参数即可
    开启:sysctl net.ipv4.ip_forward = 1
    关闭:sysctl net.ipv4.ip_forward = 0

为什么要为虚拟机创建桥接网络?

  1. 当我们通过外网访问虚拟机时,时无法直接访问的,需要做端口映射
  2. 当虚拟机数量较大时,端口映射的方式也不适合,所以需要用到桥接网络,使得可以通过外网直接访问虚拟机

设置桥接网络

创建桥接网卡(创建完成后建议重启网卡)
	virsh iface-bridge eth0 br0			# 取消桥接网卡 virsh iface-unbridge br0

  • 新建桥接网络的虚拟机
1、创建链接磁盘:
	qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server2.qcow2
	
2、安装虚拟机:
	virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name web04 --memory 1024 --vcpus 1 --disk /data/web04.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole

3、检查
	查看虚拟机ip是否是dhcp动态分配的ip,如果是,则表示创建成功!
	
ps: 如果 ping 不通 dhcp 的网关,建议重启网卡:systemctl restart network=-0	(不行就多重启几次网卡)

  • 将nat模式的虚拟机修改为桥接模式
1、修改配置文件:
    <interface type='bridge'>		# 将原来的type='network' 改为 type='bridge'
    <mac address='52:54:00:55:aa:fa'/>
    <source bridge='br0'/>			# 将原来的network='default' 改为 bridge='br0'
    
2、在宿主机上,重启虚拟机生效
	virsh destroy 虚拟机名		# 线上环境建议使用shutdown平滑关机
	virsh start 虚拟机名
	
3、检查
	查看虚拟机ip是否是dhcp动态分配的ip,如果是,则表示创建成功!
	
ps: 如果 ping 不通 dhcp 的网关,建议重启网卡:systemctl restart network=-0	(不行就多重启几次网卡)

9、热添加技术

KVM热添加硬盘

1、宿主机-创建一块硬盘
	qemu-img create -f qcow2 /data/server1_add.qcow2 10G
	
2、宿主机-添加硬盘到虚拟机	(临时和永久都执行)
	临时生效
		virsh  attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 
	永久生效
		virsh  attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 --config
	参数说明:
		attach-disk:添加硬盘
		web04:虚拟机名 (要指定给哪台虚拟机添加硬盘)
		/opt/oldboy.qcow2:要添加的磁盘路径  (这块磁盘要事先创建好,所以第1步便是创建硬盘)
		vdb:盘符名称 (通过 fdisk -l 命令查看虚拟机已存在的盘符,新添加的盘符不能和已存在的相同)
		--subdriver qcow2 : 指定所添加的盘符类型为qcow2格式,不指定则默认添加的是raw格式
	
3、虚拟机-格式化硬盘
	mkfs.xfs /dev/vdb		# 格式化dev下的vdb盘

4、虚拟机-挂载
	mount /dev/vdb	/mnt
5、虚拟机-查看
	df -h
6、虚拟机-测试往里面写东西
	cp /etc/service /mnt

  • KVM扩容硬盘

    1、虚拟机-卸载盘符	(保证其他人不能再往该盘符写内容)
    	umount /mnt
    	
    2、宿主机-剥离硬盘
    	virsh detach-disk server1 vdb		# 剥离硬盘	虚拟机名  盘符名称		
    
    3、宿主机-扩容硬盘
    	qemu-img resize /data/server1_add.qcow2 +20G
    
    4、宿主机-添加硬盘到虚拟机	(临时和永久都执行)
    	临时生效(立即生效即可,因为该盘符本来就存在,无需永久生效)
    		virsh  attach-disk server1 /data/server1_add.qcow2 vdb --subdriver qcow2 
    		
    5、虚拟机-挂载盘符	(扩容不能格式化硬盘,否则原本的数据会丢失)
    	mount /dev/vdb	/mnt
    	
    	但此时我们用df -h 查看磁盘空间,发现vdb还是原本的大小,并没有扩容。原因是该盘符在最初被创建、格式化的时候,系统会分配Inode和block,此时该盘符所剩余的空间已经确定了。当我们进行扩容后,该盘符的信息还是最初格式化时的信息,所以该盘符能管理的空间还是原本大小,Inode和block没有改变。所以vdb还是原本的大小。为了解决上述问题,系统提供了一个命令:xfs_growfs	,用来重新调整 Inode 和 block,见步骤6
    
    6、重新调整盘符的 Inode 和 block
    	xfs_growfs /dev/vdb		# 也可以将 /dev/vdb 换成 /mnt
    

  • 重新调整盘符的 Inode 和 block

    在上面我们使用 xfs_growfs 来调整符的 Inode 和 block,这是因为该盘符的文件系统是 xfs

    查看盘符的文件系统类型;
    [root@localhost ~]# df -Th
    Filesystem     Type      Size  Used Avail Use% Mounted on
    /dev/vda1      xfs        10G  1.1G  9.0G  11% /
    devtmpfs       devtmpfs  486M     0  486M   0% /dev
    tmpfs          tmpfs     496M     0  496M   0% /dev/shm
    tmpfs          tmpfs     496M  6.7M  489M   2% /run
    tmpfs          tmpfs     496M     0  496M   0% /sys/fs/cgroup
    tmpfs          tmpfs     100M     0  100M   0% /run/user/0
    /dev/vdb       xfs        30G   34M   30G   1% /mnt
    

    但如果是盘符的文件系统类型是 ex4、ext3、ext2, 我们扩容完成后,使用 resize2fs来调整盘符的 Inode 和 block


KVM在线热添加网卡

1、添加网卡
	virsh attach-interface server1 bridge br0 --config  	# 网卡名以ens开头
	virsh attach-interface server1 bridge br0 --model virtio	# 网卡名以eth开头
        参数说明:
        attach-interface:添加接口/网卡
        server1:虚拟机名
        bridge:网卡类型
        br0:网卡源,基于宿主机的哪个网卡创建
        --config:将添加的网卡信息写入配置文件
        --model: 添加的网卡名以eth开头,将网卡信息写入配置文件,并自动启动该网卡
			
2、剥离网卡
	virsh detach-interface server1 bridge --mac 52:54:00:b7:6a:37
	ps:
		如果相同类型的网卡只有一块,则无需加 --mac区分

KVM在线热添加内存

前提:该内存是可以被扩容,即总最大内存比当前内存大,如下:
	可以扩容:
        <memory unit='KiB'>2097152</memory>
        <currentMemory unit='KiB'>524288</currentMemory>

	不可扩容:		
        <memory unit='KiB'>1048576</memory>
        <currentMemory unit='KiB'>1048576</currentMemory>
1、创建内存可扩容的虚拟机
	virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name server3 --memory 512,maxmemory=2048 --vcpus 1 --disk /data/server3.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
	#1、这里新增了参数:maxmemory=2048
	#2、虚拟磁盘需要提前创建好:
        	qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server3.qcow2
		
2、设置内存		
    临时热添加内存
    virsh setmem server3 1024M --live
    永久增大内存
    virsh setmem server3 1024M --config
        参数说明:
            setmem	:设置内存,既可以扩容内存,也可以缩减内存
            server3	:虚拟机名
            1024M	:设置内存大小 

KVM在线热添加cpu

1、创建内存可扩容的虚拟机
	virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name server4 --memory 512,maxmemory=2048 --vcpus 1,maxvcpus=10 --disk /data/server4.qcow2 --boot hd --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
    #1、这里新增了参数:maxvcpus=10
    #2、虚拟磁盘需要提前创建好:
    	qemu-img create -f qcow2 -b /data/server1.qcow2 /data/server3.qcow2
    #3、通过 lscpu 查看CPU数量	
 
 2、设置cpu核数
 	临时加cpu核数
	virsh setvcpus server4 8 --live
	永久添加cpu核数
	virsh setvcpus server4 8 --config

10、KVM热迁移

详情见:https://www.qstack.com.cn/archives/368.html

注意:需要互相做好host解析

[root@nfs01 data]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.0.0.11 kvm01
10.0.0.12 kvm02
10.0.0.21 nfs21

posted @ 2019-06-08 13:30  python余生之路  阅读(2210)  评论(0编辑  收藏  举报
ヾ(≧O≦)〃嗷~