KVM的虚拟化简介

    KVM(全称Kernel-based Virtual Machine)是一套开源的全虚拟化解决方案,同时也支持半虚拟化。KVM不同于其他(如Xen),它是集成到Linux内核的Hypervisor,在X86架构上需要硬件支持(如Intel VT技术或者AMD V技术)虚拟化技术。KVM由一个可加载的内核模块kvm.ko提供核心虚拟化基础构造,和一个处理器特殊的模块kvm-intel.ko 或者 kvm-amd.ko组成。

    在KVM虚拟主机上,可以允许运行多个Linux或Windows虚拟机,每个虚拟机都有各自的虚拟硬件:网卡、磁盘、图形适配器等。


这里KVM的安装环境是VMware和CentOS6.7_64位系统

  • 前提需要足够大的硬件配置支持,如KVM主机内存需要至少2个G,硬盘需要40G以上。

  • 检查CPU是否支持虚拟化技术,查看虚拟机设置虚拟化引擎部分,把【虚拟化Inter VT-x/EPT或AMD-V/RVI(V)】选项打钩。

  • 同时可以在主机下查看CPU是否支持虚拟化,可以使用egrep 'vmx|svm' --color /proc/cpuinfo查看,若有输出则支持。


现在开始安装KVM

Step1:清除防火墙规则并把Selinux关闭

1
2
3
4
[root@kvm ~] # service iptables stop
[root@kvm ~] # iptables -F
[root@kvm ~] # sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 
[root@kvm ~] # setenforce 0

Step2:安装KVM核心包和其他所必须的虚拟化软件包

    kvm:             KVM核心模块,它在默认Linux内核中提供KVM管理程序

    virt:                 创建、克隆、虚拟机命令,以及图形化管理工具virt-manager

    qemu-img:      qemu组件,使用qemu命令来创建磁盘等

    libvirts:             虚拟机管理工具,使用virsh等命令来管理和控制虚拟机

    bridge-utils:      设置网络网卡桥接

KVM的安装需要解决的依赖比较多,其中virt需要安装200多个依赖包,安装过程比较费时,大约十几分钟,这取决于你的机器。

1
[root@kvm ~] # yum -y install kvm virt* libvirt qemu-img bridge-utils


Step3:确认安装KVM是否已经成功

检查KVM模块是否加载

1
2
3
[root@kvm ~] # lsmod |grep kvm
kvm_intel              55624  0 
kvm                   341551  1 kvm_intel

查看virt版本

1
2
3
4
[root@kvm ~] # virt-install --version
0.600.0
[root@kvm ~] # virsh --version
0.10.2
1
2
3
[root@kvm ~] # virsh list --all
  Id    Name                           State
----------------------------------------------------


Step4:接下来可以创建并安装虚拟机,首先是配置网卡

进入/etc/sysconfig/network-scripts/目录下,拷贝eth0网卡配置文件ifcfg-eth0为ifcfg-br0

1
2
[root@kvm ~] # cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts] # cp ifcfg-eth0 ifcfg-br0

编辑ifcfg-eth0文件

1
2
3
4
5
6
7
8
DEVICE=eth0
HWADDR=00:0C:29:6C:57:4E
TYPE=Ethernet
UUID=41b2bd36-fc1a-4bbf-ab3f-2e11a9fc888a
ONBOOT= yes
NM_CONTROLLED= yes
BOOTPROTO=none
BRIDGE=br0

编辑ifcfg-br0文件

1
2
3
4
5
6
7
8
9
10
11
DEVICE=br0
#HWADDR=00:0C:29:6C:57:4E
TYPE=Bridge
UUID=41b2bd36-fc1a-4bbf-ab3f-2e11a9fc888a
ONBOOT= yes
NM_CONTROLLED= yes
BOOTPROTO=static
IPADDR=192.168.1.33
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=192.168.1.1

重启网络服务

1
2
3
4
5
6
7
8
[root@kvm network-scripts] # service network restart
Shutting down interface br0:                               [  OK  ]
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:                                [  OK  ]
Bringing up interface br0:  Determining  if  ip address 192.168.1.33 is already  in  use  for  device br0...
                                                            [  OK  ]

查看一下网卡信息,其中br0就是刚刚创建的网卡配置文件,可以看到设置的IP已经生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@kvm ~] # ifconfig 
br0       Link encap:Ethernet  HWaddr 00:0C:29:6C:57:4E  
           inet addr:192.168.1.33  Bcast:192.168.1.255  Mask:255.255.255.0
           inet6 addr: fe80::20c:29ff:fe6c:574e /64  Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:1211 errors:0 dropped:0 overruns:0 frame:0
           TX packets:193 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:100106 (97.7 KiB)  TX bytes:18094 (17.6 KiB)
eth0      Link encap:Ethernet  HWaddr 00:0C:29:6C:57:4E  
           inet6 addr: fe80::20c:29ff:fe6c:574e /64  Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:160842 errors:0 dropped:0 overruns:0 frame:0
           TX packets:84216 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:210835385 (201.0 MiB)  TX bytes:7062228 (6.7 MiB)
lo        Link encap:Local Loopback  
           inet addr:127.0.0.1  Mask:255.0.0.0
           inet6 addr: ::1 /128  Scope:Host
           UP LOOPBACK RUNNING  MTU:65536  Metric:1
           RX packets:5 errors:0 dropped:0 overruns:0 frame:0
           TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)
virbr0    Link encap:Ethernet  HWaddr 52:54:00:07:F1:48  
           inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0 
           RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

Step5:启动或重启libvirtd和messagebus服务

启动libvirtd、messagebus

1
2
3
4
[root@kvm ~] # service libvirtd start
Starting libvirtd daemon:                                  [  OK  ]
[root@kvm ~] # service messagebus start
Starting system message bus:                               [  OK  ]

查看网络接口列表

1
2
3
4
[root@kvm ~] # brctl show
bridge name    bridge  id              STP enabled     interfaces
br             08000.000c296c574e    no              eth0
virbr0         8000.52540007f148      yes              virbr0-nic


Step6:创建一个虚拟机

首先创建一个用来存放虚拟机的目录/kvm,当然要先查看一下磁盘大小情况再选择的位置

1
2
3
4
5
6
7
[root@kvm ~] # df -Th
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda3       ext4    43G  1.3G   39G   4% /
tmpfs          tmpfs  932M     0  932M   0%  /dev/shm
/dev/sda1       ext4   190M   31M  149M  18%  /boot
 
[root@kvm ~] # mkdir /kvm

创建一个预分配的元数据选项的qcow2格式镜像文件(用来存储虚拟机的磁盘镜像)

1
2
[root@kvm ~] # qemu-img create -f qcow2 -o preallocation=metadata /kvm/centos6.7_v1.img 10G
Formatting  '/kvm/centos6.7_v1.img' fmt =qcow2 size=10737418240 encryption=off cluster_size=65536 preallocation= 'metadata'

stat命令输出磁盘镜像信息

1
2
3
4
5
6
7
8
[root@kvm ~] # stat /kvm/centos6.7_v1.img 
   File: ` /kvm/centos6 .7_v1.img'
   Size: 10739318784Blocks: 3488       IO Block: 4096   regular  file
Device: 803h /2051dInode : 2490371     Links: 1
Access: (0644 /-rw-r--r-- )  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-01-15 17:08:46.695998217 +0800
Modify: 2016-01-15 17:08:46.694998217 +0800
Change: 2016-01-15 17:08:46.694998217 +0800


info命令查看磁盘镜像的大小信息

1
2
3
4
5
6
[root@kvm ~] # qemu-img info /kvm/centos6.7_v1.img 
image:  /kvm/centos6 .7_v1.img
file  format : qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.7M
cluster_size: 65536


下面通过文本模式安装一个512内存、1核心、磁盘大小10G的linux系统。使用virt-install命令来创建虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
[root@kvm ~] # virt-install \
--name centos6.7_v1 \
-- ram  512 \
--disk path= /kvm/centos6 .7_v1.img, format =qcow2,size=10,bus=virtio \
--vcpus 1 \
--os- type  linux \
--os-variant rhel6 \
--network bridge=br0 \
--graphics none \
--location= /dev/sr0  \
--console pty,target_type=serial \
--extra-args  'console=ttyS0,115200n8 serial'


部分输出内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Starting  install ...
Retrieving  file  .treeinfo...                                                                      |  676 B     00:00 ... 
Retrieving  file  vmlinuz...                                                                        | 8.1 MB     00:00 ... 
Retrieving  file  initrd.img...                                                                     |  69 MB     00:00 ... 
Creating domain...                                                                                |    0 B     00:00     
Connected to domain centos6.7_v1
Escape character is ^]
[1;256r
Google, Inc.
Serial Graphics Adapter 12 /07/11
SGABIOS $Id: sgabios.S 8 2010-04-22 00:03:40Z nlaredo $ (mockbuild@c6b18n1.dev.centos.org) Wed Dec  7 17:04:47 UTC 2011
Term: 121x32
4 0
 
SeaBIOS (version seabios-0.6.1.2-30.el6)
Machine UUID 51dca1d8-adbc-51d1-1f39-343ad2c7a49f
 
 
gPXE (http: //etherboot .org) - 00:03.0 C100 PCI2.10 PnP BBS PMM1FE0@10 C100
                                                                                
 
Probing EDD (edd=off to disable)... ok
 
......
 
Greetings.
anaconda installer init version 13.21.239 starting
mounting  /proc  filesystem...  done
creating  /dev  filesystem... usb 2-1: new full speed USB device number 2 using uhci_hcd
done
starting udev... done
mounting  /dev/pts  (unix98 pty) filesystem... udevd[48]: error setting  /sys/class/firmware/timeout : No such  file  or directory
 
done
mounting  /sys  filesystem...  done
anaconda installer init version 13.21.239 using a serial console
trying to remount root filesystem  read  write...  done
Welcome to CentOS  for  x86_64
 
                      ┌───────────┤ Disc Found ├───────────┐
                      │                                    │
                      │ To begin testing the media before  │
                      │ installation press OK.             │
                      │                                    │                     
                      │ Choose Skip to skip the media  test  │                     
                      │ and start the installation.        │                     
                      │                                    │                     
                      │     ┌────┐           ┌──────┐      │                     
                      │     │ OK │           │ Skip │      │
                      │     └────┘           └──────┘      │
                      │                                    │
                      │                                    │
                      └────────────────────────────────────┘
 
 
 
 
   <Tab>/<Alt-Tab> between elements  | <Space> selects | <F12> next  screen

接下来的安装操作就变得简单了,安装完成选择Reboot就进入虚拟机了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
                                                                             
      ┌─────────────────────┤ Package Installation ├──────────────────────┐      
      │                                                                   │      
      │                                                                   │      
      │                                 0%                                │      
      │                                                                   │      
      │                   Packages completed: 6 of 225                    │      
      │                                                                   │      
      │ Installing glibc-common-2.12-1.166.el6.x86_64 (107 MB)            │      
      │ Common binaries and locale data  for  glibc                         │      
      │                                                                   │      
      │                                                                   │      
      │                                                                   │      
      └───────────────────────────────────────────────────────────────────┘


查看一下磁盘信息和登录信息

1
2
3
4
5
6
[root@localhost ~] # df -Th
Filesystem           Type   Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                      ext4   8.3G  644M  7.3G   9% /
tmpfs                tmpfs  246M     0  246M   0%  /dev/shm
/dev/vda1             ext4   477M   33M  419M   8%  /boot
1
2
3
4
[root@localhost ~] # last
root     ttyS0                         Fri Jan 15 18:01   still logged  in   
reboot   system boot  2.6.32-573.el6.x Fri Jan 15 18:00 - 18:03  (00:02)    
wtmp begins Fri Jan 15 18:00:36 2016


退出返回到KVM主机,键入ctrl+]即可,在KVM主机中使用virsh list可以查看虚拟机列表

[root@kvm ~]# virsh list --all

 Id    Name                           State

----------------------------------------------------

 4     centos6.7_v1                   running


进入虚拟机,使用virsh console命令

1
2
3
4
[root@kvm ~] # virsh console centos6.7_v1
Connected to domain centos6.7_v1
Escape character is ^]
[root@localhost ~] #


使用virsh命令管理虚拟机

1
[root@kvm ~] # virsh shutdown hostname    #关闭虚拟机,需要在虚拟机中安装acpid服务并启动
1
[root@kvm ~] # virsh destroy hostname     #强制关闭电源
1
[root@kvm ~] # virsh undefine hostname    #删除虚拟机