Redhat/CentOS系统KVM虚拟机安装过程详解

什么是 KVM ?

KVM 是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine)。 2006 年 10 月,由以色列的Qumranet 组织开发的一种新的“虚拟机”实现方案。 2007 年 2 月发布的 Linux 2.6.20 内核第一次包含了 KVM 。增加 KVM 到 Linux 内核是 Linux 发展的一个重要里程碑,这也是第一个整合到 Linux 主线内核的虚拟化技术。

KVM 在标准的 Linux 内核中增加了虚拟技术,从而我们可以通过优化的内核来使用虚拟技术。在 KVM 模型中,每一个虚拟机都是一个由 Linux 调度程序管理的标准进程,你可以在用户空间启动客户机操作系统。一个普通的 Linux 进程有两种运行模式:内核和用户。 KVM 增加了第三种模式:客户模式(有自己的内核和用户模式)。

一个典型的 KVM 安装包括以下部件:

  • 一个管理虚拟硬件的设备驱动,这个驱动通过一个字符设备 /dev/kvm 导出它的功能。通过 /dev/kvm每一个客户机拥有其自身的地址空间,这个地址空间与内核的地址空间相分离或与任何一个正运行着的客户机相分离。
  • 一个模拟硬件的用户空间部件,它是一个稍微改动过的 QEMU 进程。从客户机操作系统执行 I/O 会拥有QEMU 。 QEMU 是一个平台虚拟化方案,它允许整个 PC 环境(包括磁盘、显示卡(图形卡)、网络设备)的虚拟化。任何客户机操作系统所发出的 I/O 请求都被拦截,并被路由到用户模式用以被 QEMU 过程模拟仿真。

CentOS上安装KVM功能模块步骤

1.KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持。

  •   基于 Intel 处理器的系统,运行grep vmx /proc/cpuinfo查找 CPU flags 是否包括 vmx 关键词
  •   基于 AMD 处理器的系统,运行grep svm /proc/cpuinfo查找 CPU flags 是否包括 svm 关键词
  •   检查BIOS,确保BIOS里开启VT选项:

注 : 一些厂商禁止了机器 BIOS 中的 VT 选项 , 这种方式下 VT 不能被重新打开。**

注意:/proc/cpuinfo 仅从 Linux 2.6.15(Intel) 和 Linux 2.6.16(AMD) 开始显示虚拟化方面的信息。请使用 uname -r 命令查询您的内核版本。如有疑问,请联系硬件厂商。

2.iptables设置

[root@localhost qemu]# cat /bin/iptables.sh 
modprobe ip_conntrack_ftp
iptables -F
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o em1  -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#for ping:
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

#for kvm
iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT

iptables -A INPUT -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP
[root@localhost qemu]# 

3.安装与启动

yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils

/etc/init.d/libvirtd start

4.建立虚拟机

划分硬盘

qemu-img create -f qcow2 -o preallocation=metadata /home/kvm/centos65-x64-mysql.qcow2 200G

安装KVM,下面是两种常见的网络连接方式,默认是default,适用于不同需求的网络环境,后面配置KVM中会详细说明。

bridge网络模式

virt-install --name=gatewat-4 --ram 4096 --vcpus=4 -f /home/kvm/gateway-4.qcow2 --cdrom /home/iso/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,listen=0.0.0.0,port=5920, --network bridge=br0 --force --autostart

NAT网络模式

virt-install --name=test --ram 512 --vcpus=1 -f /home/kvm/test.qcow2 --cdrom /opt/CentOS-6.5-x86_64-bin-DVD1.iso --graphics vnc,listen=0.0.0.0,port=5988, --network network=default, --force --autostart

5.启动

使用virsh list --all查看已安装的kvm

使用virsh start test启动虚拟机

使用VNC工具连接KVM来进行初始化配置

配置KVM

使用virsh-install安装完KVM之后,会自动生成相应配置

KVM的配置文件存储在/etc/libvirt/qemu/

[root@localhost ~]# cd /etc/libvirt/qemu/
[root@localhost qemu]# ll
total 24
drwxr-xr-x. 2 root root 4096 Jul 24 17:30 autostart
drwx------. 3 root root 4096 Jun 20 19:21 networks
-rw-------. 1 root root 2566 Aug 20 18:28 vm_1.xml
-rw-------. 1 root root 2560 Jul  4 02:02 vm_2.xml
-rw-------. 1 root root 2566 Aug 20 18:28 vm_3.xml

长的大概是这个样子

[root@localhost qemu]# cat vm_1.xml 
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE 
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit vm_1
or other application using the libvirt API.
-->

<domain type=\'kvm\'>
  <name>vm_1</name>  //此处为hostname
  <uuid>2f952159-b231-80a4-8086-d49978513fb4</uuid>  //此处为uuid标识
  <memory unit=\'KiB\'>8388608</memory>  //此处为内存
  <currentMemory unit=\'KiB\'>8388608</currentMemory>
  <vcpu placement=\'static\'>6</vcpu>  //此处为cpu核数
  <os>
    <type arch=\'x86_64\' machine=\'rhel6.5.0\'>hvm</type>
    <boot dev=\'hd\'/>  //此处为启动项目,若想从光盘启动可设置为<boot dev=\'cdrom\'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset=\'utc\'/>
  <on_poweroff>destroy</on_poweroff>  //此处为关机命令 使用 virsh destroy vm_1 关闭
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type=\'file\' device=\'disk\'>  //此处为硬盘信息
      <driver name=\'qemu\' type=\'raw\' cache=\'none\'/>
      <source file=\'/home/kvm/vm_1.qcow2\'/>
      <target dev=\'hda\' bus=\'ide\'/>
      <address type=\'drive\' controller=\'0\' bus=\'0\' target=\'0\' unit=\'0\'/>
    </disk>
    <disk type=\'block\' device=\'cdrom\'>  //此处为cdrom信息,可修改为iso的路径
      <driver name=\'qemu\' type=\'raw\'/>
      <target dev=\'hdc\' bus=\'ide\'/>
      <readonly/>
      <address type=\'drive\' controller=\'0\' bus=\'1\' target=\'0\' unit=\'0\'/>
    </disk>
    <controller type=\'usb\' index=\'0\'>  //此处为usb接口信息
      <address type=\'pci\' domain=\'0x0000\' bus=\'0x00\' slot=\'0x01\' function=\'0x2\'/>
    </controller>
    <controller type=\'ide\' index=\'0\'>
      <address type=\'pci\' domain=\'0x0000\' bus=\'0x00\' slot=\'0x01\' function=\'0x1\'/>
    </controller>
    <interface type=\'network\'>  //此处为网卡1信息,使用network也就是nat模式连接virbr0联网
      <mac address=\'52:54:00:9a:d7:82\'/>
      <source network=\'default\'/>
      <address type=\'pci\' domain=\'0x0000\' bus=\'0x00\' slot=\'0x03\' function=\'0x0\'/>
    </interface>
    <interface type=\'bridge\'>  //此处为网卡2信息,使用bridge桥接方式到br1
      <mac address=\'52:54:11:fd:39:23\'/>
      <source bridge=\'br1\'/>
      <address type=\'pci\' domain=\'0x0000\' bus=\'0x00\' slot=\'0x05\' function=