# kvm简绍
KVM 全称是 基于内核的虚拟机(Kernel-basedVirtual Machine),它是一个 Linux 的一个内核模块,该内核模块使得 Linux 变成了一个 Hypervisor:
* 它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
* 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
* 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
* 它需要支持虚拟化扩展的 CPU。
* 它是完全开源的。
(1)KVM特性
嵌入到Linux正式Kernel(提高兼容性),代码级资源调用(提高性能),虚拟机就是一个进程(内存易于管理)
(2)KVM虚拟化架构
![1.20](http://oxysobnip.bkt.clouddn.com/1.20.png)
(3)KVM CPU性能优化
* 一个 KVM 虚机即一个 Linux qemu-kvm 进程,与其他Linux 进程一样被Linux 进程调度器调度。
* KVM 虚机包括虚拟内存、虚拟CPU和虚机 I/O设备,其中,内存和 CPU 的虚拟化由 KVM 内核模块负责实现,I/O 设备的虚拟化由 QEMU 负责实现。
* KVM户机系统的内存是 qumu-kvm 进程的地址空间的一部分。
* KVM 虚机的 vCPU 作为 线程运行在 qemu-kvm 进程的上下文中。
CPU虚拟化
![1.21](http://oxysobnip.bkt.clouddn.com/1.21.png)
# KVM安装
## 检查主机是否支持虚拟化
打开您的虚拟机的虚拟化引擎
![1.22](http://oxysobnip.bkt.clouddn.com/1.22.png)
<pre>
egrep -c '(vmx|svm)' /proc/cpuinfo
</pre>
命令结果大于0表示cpu支持虚拟化
![1.23](http://oxysobnip.bkt.clouddn.com/1.23.png)
最好关闭防火墙和关闭selinux
<pre>
systemctl stop firewalld
systemctl disable firewalld
vim /etc/selinux/config
将enforcing改为disabled
</pre>
## 配置本地yum源
替换CentOS默认源,默认生产环境上不了外网,所以你得想办法用自己的内部Yum源,如果没有,需要搭建一个。让系统上网,然后运行下面命令:
<pre>
cd /etc/yum.repos.d
rm -rf *
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
</pre>
在我的实验环境中我已经搭好了本地yum源,在这里我直接使用本地yum源,下面是我的yum配置文件
![1.24](http://oxysobnip.bkt.clouddn.com/1.24.png)
## 安装kvm以及相应的依赖包
安装依赖包
<pre>
yum -y groupinstall "Virtualization Host"
yum -y install virt-{install,viewer,manager}
</pre>
相关组件介绍
【1】libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。
【2】Virsh:基于 libvirt 的 命令行工具 (CLI)
【3】Virt-Manager:基于 libvirt 的 GUI 工具
kvm内核模块
![1.25](http://oxysobnip.bkt.clouddn.com/1.25.png)
## 配置网卡为桥接模式
<pre>
cd /etc/sysconfig/network-scripts/
cp ifcfg-eno16777736 ifcfg-br0
</pre>
我的配置文件
<pre>
[root@kvm network-scripts]# cat ifcfg-eno16777736
TYPE="Ethernet"
DEVICE="eno16777736"
NAME="eno16777736"
BRIDGE=br0
[root@kvm network-scripts]# cat ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
IPADDR=172.31.129.95
NETMASK=255.255.255.0
GATEWAY=172.31.129.254
</pre>
## 创建虚拟机硬盘
<pre>
qemu-img create -f qcow2 /mnt/vm-test/iso/centos-7.2.qcow2 10G
chown qemu:qemu /mnt/vm-test/iso/centos-7.2.qcow2 -R
</pre>
## 创建虚拟机
<pre>
[root@kvm iso]# virt-install --virt-type kvm --name centos-7.2 --ram 512 \ # name 是自己取得
> --vcpus 1 \ #指定cpu核数
> --cdrom=CentOS-7-x86_64-DVD-1511.iso \ #指定镜像
> --disk centos-7.2.qcow2,format=qcow2 \ #disk参数为上面创建的磁盘
> --network network=default \ #网络设置为默认网络(NAT)
> --graphics vnc,listen=0.0.0.0 --noautoconsole \ #运行所有网段远程,远程方式采用vnc
> --os-type=linux --os-variant=rhel7 #指定系统类型
</pre>
桥接网卡位置
<pre>
virt-install --virt-type kvm --name centos-7.2 --ram 512 --vcpus 1 --cdrom=CentOS-7-x86_64-DVD-1511.iso --disk centos7.2.qcow2,format=qcow2 --network bridge=virbr0 --vnc --vncport=5910 --vnclisten=0.0.0.0 --os-type=linux --os-variant=rhel7
</pre>
## 远程虚拟机
查看端口:netstat –natp
![1.26](http://oxysobnip.bkt.clouddn.com/1.26.png)
在vnc输入172.31.129.95:5900即可远程虚拟机
# KVM命令介绍
## virsh
virsh:虚拟化交互式终端
![1.27](http://oxysobnip.bkt.clouddn.com/1.27.png)
* virsh list # 显示本地活动虚拟机
* virsh start kvm_name # 启动非活动虚拟机, kvm_name为你的虚拟机名字
* virsh create kvm_name.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活动主机)
* virsh suspend kvm_name # 暂停虚拟机
* virsh resume kvm_name # 启动暂停的虚拟机
* virsh shutdown kvm_name # 正常关闭虚拟机
* virsh destroy kvm_name # 强制关闭虚拟机
* virsh dominfo kvm_name # 显示虚拟机的基本信息
* virsh dumpxml kvm_name # 显示虚拟机的当前配置文件
* virsh setmem kvm_name 51200 # 给不活动虚拟机设置内存大小
* virsh setvcpus kvm_name 4 # 给不活动虚拟机设置cpu个数
* virsh edit kvm_name # 编辑配置文件(一般用在刚定义完VM)
虚拟机配置文件路径:/etc/libvirt/qemu
## 虚拟化vcpu操作
<pre>
yum -y install numactl
</pre>
* nodeinfo #查看节点配置信息
* dominfo #查看虚拟机节点配置信息
* numactl --hardware #查看节点硬件信息
* numastat –c qemu-kvm
* virsh
- vcpuinfo kvm_name #查看运行在那个逻辑cpu上
- emulatorpin kvm_name #查看可以调度逻辑cpu
- emulatorpin kvm_name 1-2 –live #限制可以调度逻辑cpu(重启生效)
![1.28](http://oxysobnip.bkt.clouddn.com/1.28.png)
虚拟机cpu优化
vcpu单独强制绑定
- vcpupin kvm_name 0 1
- vcpupin kvm_name 1 2
- vcpuinfo
- dumpxml kvm_name
命令使用参考文章:
[CPU性能监控之二-----Numa架构下进程与CPU绑定](http://hl914.blog.51cto.com/4128173/1557615/
)
[numa总结](http://blog.csdn.net/shaoyunzhe/article/details/53606584)
## 安装acpid
默认情况下virsh工具不能对linux虚拟机进行关机操作,linux操作系统需要开启与启动acpid服务。在安装KVM linux虚拟机必须配置此服务。
<pre>
yum install -y acpid
systemctl enable acpid
</pre>
## 克隆虚拟机
(1)根据模板文件修改
- 进入对应目录拷贝模板文件
<pre>
cd /etc/libvirt/qemu
cp centos-7.2.xml clone-1.xml
</pre>
- 修改虚拟名称
- 删除uuid
![1.29](http://oxysobnip.bkt.clouddn.com/1.29.png)
- 指定disk
![1.30](http://oxysobnip.bkt.clouddn.com/1.30.png)
- 删除mac
![1.31](http://oxysobnip.bkt.clouddn.com/1.31.png)
- 修改vnc远程允许端口(可选)
如果您上面选择桥接模式创建虚拟机且指定了端口5910,请您把5910改为5911,这样可以避免与centos7.3的端口冲突
(2)复制qcow2文件
<pre>
cp centos-7.2.qcow2 clone-1.qcow2
</pre>
(3)virsh define 模板文件路径
<pre>
virsh define /etc/libvirt/qemu/clone-1.xml
</pre>
(4)启动虚拟机
<pre>
virsh start clone-1
</pre>
(5)删除克隆的虚拟机
<pre>
virsh shutdown clone-1
virsh undefine clone-1
rm –rf /mnt/vm-test/clone-1.qcow2
</pre>
(6)一个小坑
![1.32](http://oxysobnip.bkt.clouddn.com/1.32.png)
这一行位置在第86行,修改配置文件时一定要删除,不知道为什么,它会出现在CentOS7.2版本的系统中,而在CentOS7.3版本的系统中不会出现这一行代码!
## 虚拟机快照snapshot
<pre>
virsh # snapshot-create-as centos-7.2 kuaizhao #创建虚拟机centos-7.2的快照,快照名字为kuaizhao
Domain snapshot kuaizhao created
virsh # snapshot-list centos-7.2 #显示虚拟机快照的名称
Name Creation Time State
------------------------------------------------------------
kuaizhao 2017-10-17 09:53:49 +0800 shutoff
virsh # snapshot-revert centos-7.2 kuaizhao #恢复快照
</pre>
## 添加磁盘
(1)创建磁盘
<pre>
qemu-img create -f qcow2 /mnt/vm-test/ios/testadd.qcow2 10G
</pre>
(2)修改配置文件
<pre>
virsh edit centos-7.2
</pre>
添加以下内容并保存配置文件
```
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/mnt/vm-test/ios/testadd.qcow2'/>
<target dev='vdb' bus='virtio'/>
</disk>
```
<pre>
virsh create /etc/libvirt/qemu/centos-7.2.xml
virsh destroy centos-7.2
virsh start centos-7.2
</pre>
重启后进入虚拟机查看
![1.33](http://oxysobnip.bkt.clouddn.com/1.33.png)
(3)直接扩展qcow2磁盘
qcow2格式的好处就是支持直接扩展,下面我们关闭虚拟机直接对磁盘进行扩容
# qemu-img resize clone-3.qcow2 +10G
![1.35-1](http://oxysobnip.bkt.clouddn.com/1.35-1.png)
经过前后对比,磁盘大小已由20G扩展到30G,已扩展,qcow2磁盘格式必须采用此方式进行扩展!
## kvm虚拟机的网络模式
(1)nat网络模式
![1.34](http://oxysobnip.bkt.clouddn.com/1.34.png)
(2)桥接模式
![1.35](http://oxysobnip.bkt.clouddn.com/1.35.png)
(3)添加NAT网络
定义一个虚拟网络
<pre>
virsh net-define /usr/share/libvirt/networks/default.xml
</pre>
添加内容
```
<network>
<name>default</name>
<bridge name="virbr0" />
<forward/>
<ip address="192.168.122.1" netmask="255.255.255.0">
<dhcp>
<range start="192.168.122.2" end="192.168.122.254" />
</dhcp>
</ip>
</network>
```
设置为自动启动
<pre>
virsh net-autostart default
</pre>
查看网络
<pre>
brctl show
</pre>
修改/etc/sysctl.conf中参数,允许ip转发
<pre>
net.ipv4.ip_forward=1
</pre>
修改虚拟机配置文件
<pre>
virsh edit centos-7.2
</pre>
修改网卡链接模式
桥接模式
<interface type='bridge'>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</interface>
nat模式
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
修改完之后,保存退出。
<pre>
virsh create /etc/libvirt/qemu/centos-7.2.xml
</pre>
4. 修改桥接后nat不能上网问题
默认配置文件:(virsh交互界面)
![1.36](http://oxysobnip.bkt.clouddn.com/1.36.png)
将默认配置文件修改为:
<pre>
vim /etc/libvirt/qemu/networks/default.xml
</pre>
![1.37](http://oxysobnip.bkt.clouddn.com/1.37.png)
然后再执行如下命令
<pre>
virsh # net-define /etc/libvirt/qemu/networks/default.xml
virsh # net-destroy default
virsh # net-start default
</pre>
- 献给我的朋友们
- 一、个人对学习的看法
- 二、运维技能图谱
- 三、运维常用技能
- 3.1 Vim(最好用的编辑器)
- 3.2 Nginx & Tengine(Web服务)
- 1. Nginx介绍和部署
- 2. Nginx配置解析
- 3. Nginx常用模块
- 4. Nginx 的session 一致性问题
- 3.3 Tomcat(Web中间件)
- 3.4 Keepalived(负载均衡高可用)
- 3.5 Memcache(分布式缓存)
- 3.6 Zookeeper(分布式协调系统)
- 3.7 KVM(开源虚拟化)
- 1. 虚拟化介绍
- 2. KVM基础
- 3. 设置VNC和时间同步
- 4. kvm虚拟机快照备份
- 5. kvm虚拟机在线扩展磁盘
- 6. kvm虚拟机静态迁移
- 7. kvm虚拟机动态迁移
- 8. kvm虚拟机存储池配置
- 9. cpu添加虚拟化功能
- 3.8 GitLab(版本控制)
- 3.8.1 GitLab安装与汉化
- 3.9 Jenkins(运维自动化)
- 3.10 WAF(Web防火墙)
- 3.10.1初探WAF
- 四、常用数据库
- 4.1 MySQL(关系型数据库)
- 1. MySQL源码安装
- 4.2 Mongodb(适用与大数据分析的数据库)
- 4.3 Redis(非关系数据库)
- 五、自动化运维工具
- 5.1 Cobbler(系统自动化部署)
- 5.2 Ansible(自动化部署)
- 5.3 Puppet(自动化部署)
- 5.4 SaltStack(自动化运维)
- 六、存储
- 6.1 GFS(文件型存储)
- 6.2 Ceph(后端存储)
- 七、运维监控工具
- 7.1 对监控的理解
- 7.2 Zabbix(运维监控)
- 7.2.1 Zabbix简介
- 7.2.2 Zabbix服务部署
- 1. Zabbix服务端部署
- 2. Zabbix客服端部署
- 3. 配置前端展示
- 4. zabbix告警配置
- 7.2.3 Zabbix监控服务
- 1. 监控网络设备
- 2. 自定义Nginx监控
- 7.3 云镜(安全监控)
- 7.4 ELK(日志收集展示)
- 八、运维云平台
- 8.1 OpenStack(开源云操作系统)
- 8.1.1 OpenStack简介
- 8.1.2 实验架构设计
- 8.1.3 集群环境准备
- 8.1.4 controller节点部署
- 1. 安装Mariadb Galera Cluster集群
- 2. 安装RabbitMQ Cluster集群
- 3. 安装Pacemaker
- 4. 安装HAProxy
- 5. 安装配置Keystone
- 6. 安装配置glance
- 1. 制作镜像模板
- 7. 安装配置nova
- 8. 安装配置neutron
- 1. 配置虚拟机网络
- 9. 安装Dashboard
- 10. 安装配置cinder
- 8.1.5 compute节点部署
- 1. 安装相关软件包
- 2. 安装Neutron
- 3. 配置cinder
- 4. 创建第一个虚拟机
- 8.1.6 OpenStack报错处理
- 1. cinder僵尸卷删除
- 8.1.7 快速孵化虚拟机方案
- 8.1.8 Kolla容器化部署OpenStack
- 1. 单点部署
- 2. 多节点部署
- 8.2 Tstack(腾讯云平台)
- 8.3 K8s(微服务容器化)
- 九、运维编程技能
- 9.1 Shell(运维必会语言)
- 9.2 Python(万能的胶水语言)
- 十、Devops运维
- 10.1 理念
- 10.2 Devops实战