# 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虛擬化架構

(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虛擬化

# KVM安裝
## 檢查主機是否支持虛擬化
打開您的虛擬機的虛擬化引擎

<pre>
egrep -c '(vmx|svm)' /proc/cpuinfo
</pre>
命令結果大于0表示cpu支持虛擬化

最好關閉防火墻和關閉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配置文件

## 安裝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內核模塊

## 配置網卡為橋接模式
<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

在vnc輸入172.31.129.95:5900即可遠程虛擬機
# KVM命令介紹
## virsh
virsh:虛擬化交互式終端

* 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(重啟生效)

虛擬機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

- 指定disk

- 刪除mac

- 修改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)一個小坑

這一行位置在第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>
重啟后進入虛擬機查看

(3)直接擴展qcow2磁盤
qcow2格式的好處就是支持直接擴展,下面我們關閉虛擬機直接對磁盤進行擴容
# qemu-img resize clone-3.qcow2 +10G

經過前后對比,磁盤大小已由20G擴展到30G,已擴展,qcow2磁盤格式必須采用此方式進行擴展!
## kvm虛擬機的網絡模式
(1)nat網絡模式

(2)橋接模式

(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交互界面)

將默認配置文件修改為:
<pre>
vim /etc/libvirt/qemu/networks/default.xml
</pre>

然后再執行如下命令
<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實戰