1、前言

目前正在涉足云计算IaaS工作,虚拟化是IaaS的重要部分,因此这段时间对各个虚拟机化技术和工具进行研究,研究的目的不仅仅是为了会使用这个工具,而是通过研究了解技术的实现机制和原理,即知其然也要知其所以然,本文主要算是本人进入这个技术领域的入门的开始,在记录自己的进展的同时,希望对有类似追求的同仁有所帮助。为了更明晰各个步骤,安装步骤不采用图形方式。

KVM(不是键盘、显示器、鼠标)是一个基于Linux内核的虚拟化工具,具体的原理正在研究。

闲话少说,言归正传:

2、试验环境

硬件:Dell PowerEdge 2CPU 8G MEM

操作系统:Centos 5.5

hypervisor:kvm(Kenerl-based virtulization machine)

3、安装步骤

3.1 操作系统安装

这个步骤就不多说了,需要注意的是在安装过程中,选择定制功能,在Virtualization下选择kvm,因为在centos5.5下,虚拟化默认支持xen,安装完成后,建立虚拟化所需要的包如kvm、kvm-qemu、libvirt、Python等,会自动安装。

安装完成后,可以使用virsh命令检查一下虚拟化环境是否正常,具体命令如下:

virsh -c qemu:///system list

如果显示一个空列表,说明运行正常。

注:virsh命令是libvirt库提供的一个命令行工具,可以用来管理虚拟机。libvirt是什么?呵呵,这个可是个重要的东东,我将专门用一篇文章进行说明。

3.2 网络配置

操作系统安装完成支持虚拟化相关包后,会自动建立一个名称为virbr0的虚拟网桥,在多网卡情况下,此网桥默认与eth1网卡绑定。为了向虚拟机提供联网功能,KVM使用virbr0作为默认网络设备,因此在实际应用中,需要将virbr0与连接到实际网络的网卡绑定,例如我的是eth0。

具体方法是修改/etc/sysconfig/network-scripts目录下的网卡配置文件,如绑定etho,则修改ifcfg-eth0 和ifcfg-virbr0

修改后的配置文件内容如下:

1)ifcfg-eth0

DEVICE=eth0
      ONBOOT=yes
      BRIDGE=virbr0
      BOOTPROTO=dhcp
      TYPE=Ethernet

2)ifcfg-virbr0
      
      DEVICE=virbr0
      TYPE=Bridge 
      ONBOOT=yes
      DELAY=0
      BOOTPROTO=none
      IPADDR=10.100.0.3
      NETMASK=255.255.255.0
      GATEWAY=10.100.0.254

修改完成后,重新启动网络服务:service network restart
   默认的virbr0设置保存在/etc/libvirt/qemu/networks目录下,里面有一个default.xml文件,里面是virbr0的默认配置。

注:虚拟网桥由bridge-utils包中的brctl工具建立,这个包在安装虚拟化相关的包后自动安装, 使用brctl addbr 网桥名称可以增加网桥,使用brctl show显示已有网桥

3.3 建立虚拟机使用的文件

服务器上建立虚拟机的机制与在PC机上使用VMware Workstation、VirtualBox建立虚拟机类似,每个虚拟机均使用一个物理文件保存其安装的系统,模拟成磁盘,用来安装guest 操作系统,此文件可以先建好并格式化为一个专门的虚拟化文件格式(如qcow2),也可以在建立虚拟机的过程中指定,由虚拟机构建程序自动生成。

虚拟机使用的文件可以先以qemu-img命令先建好,也可以在通过使用virt-manager 、 virt-install建立虚拟机时建立,下面是使用qemu-img的语法:

qemu-img create -f qcow2 win7.img 20G     <---建立一个格式为qcow2、大小为20G的文件 
   
   建立完成后,显示:Formatting 'win7.img', fmt=qcow2, size=20971520 kB

   可以使用下面的命令检查文件格式:
   
A、file win7.img
Win7.img: x86 boot sector; partition 1: ID=0x7, active, starthead 32, startsector 2048, 204800 sectors; partition 2: ID=0x7, starthead 223, startsector 206848, 40751104 sectors
B、qemu-img info win7.img
      image: VM-Win7-1.img
      file format: raw
      virtual size: 20G (20971520000 bytes)
      disk size: 20G
备注:虚拟文件的格式有许多种,将在独立的文章中说明和分析。

3.4 建立虚拟机

完成上述的准备后,可以建立虚拟机了,这里使用virt-install命令完成本项工作。命令如下:

virt-install --name VM-Win7-2 \
                --hvm      \
                --ram 512  \
                --vcpus 2        \
                --disk path=/opt/images/win7.img,size=20 \
                --network network:default --accelerate \
                --vnc --vncport=5911 \
                --os-variant rhel5.4 \
                --cdrom /opt/ISO/windows7.iso -d
   
各个参数的意义如下 :
    
    --name   虚拟机名称
    --hvm     使用全虚拟化(与para-irtualization向对),如果在一个主机上para和full virtulization均可用,连接到没有硬件虚拟化支持的机器的xen hypervisor,这个 参数无效,这个参数意味着连接到基于qemu的hypervisor
    --ram     虚拟机内存大小
    --vcpus   虚拟机虚拟CPU个数
    --disk    虚拟机使用的磁盘(文件)的路径,本例中使用第3步中建立的文件,文件放置在/opt/images目录下
    --network 网络设置,使用默认设置即可,默认设置为使用第1步中说明的virbr0网桥
    --vnc     设置连接桌面环境的vnc端口,本例是5911
    --os-variant  指示为一个特定的操作系统变体(或版本)进一步优化客户机(guest)配置
    --cdrom   设置光驱获取虚拟光驱文件的路径 -d 指示从光驱启动( -c 指示从硬盘启动)

上面命令执行后,显示一连串提示,主要是建立虚拟机的进度和根据命令参数形成的虚拟机配置,虚拟机配置文件用xml文件存储,通过查看这个过程,能够对建立虚拟机过程有个比较直观的了解,下面是上述命令的的输出:

Thu, 17 Nov 2011 18:19:49 DEBUG    Requesting libvirt URI default              说明:请求连接默认URI,基于kvm hypervisor URI为 qemu:///system
Thu, 17 Nov 2011 18:19:49 DEBUG    Received libvirt URI 'qemu:///system'
Thu, 17 Nov 2011 18:19:49 DEBUG    Requesting virt method 'hvm' 说明:使用full虚拟化
Thu, 17 Nov 2011 18:19:49 DEBUG    Received virt method 'hvm'
Thu, 17 Nov 2011 18:19:49 DEBUG    Hypervisor name is 'kvm'
Thu, 17 Nov 2011 18:19:49 DEBUG    parse_disk: returning ('/opt/images/win7.img', None, None, 'disk', None, False, False, 20.0, True, None)
Thu, 17 Nov 2011 18:19:49 DEBUG    Setting os type to 'linux' for variant 'rhel5.4' 说明:设置基于rhel linux变体进行优化
Thu, 17 Nov 2011 18:19:49 DEBUG    DistroInstaller location is a local file/path: /opt/ISO/windows7.iso
Thu, 17 Nov 2011 18:19:49 DEBUG    Setting size for existing storage to '2.38835525513'
Thu, 17 Nov 2011 18:19:49 DEBUG    Detected storage as type 'file'     
     
Starting install...
Thu, 17 Nov 2011 18:19:49 DEBUG    Setting size for existing storage to '2.38835525513'
Thu, 17 Nov 2011 18:19:49 DEBUG    Detected storage as type 'file'
Creating storage file...                                                                                                                        |  20 GB     00:00    
    Thu, 17 Nov 2011 18:19:49 DEBUG    Creating guest from:
  
      <domain type='kvm'>                --说明:以下是虚拟机的配置文件,术语“domain”指虚拟机
        <name>VM-Win7-2</name>
        <currentMemory>524288</currentMemory>
        <memory>524288</memory>
        <uuid>8da64796-97aa-a6ae-5ecb-30a312139c19</uuid>
        <os>
          <type arch='x86_64'>hvm</type>
          <boot dev='cdrom'/>
        </os>
        <features>
          <acpi/><apic/><pae/>
        </features>
        <clock offset="utc"/>
        <on_poweroff>destroy</on_poweroff>
        <on_reboot>destroy</on_reboot>
        <on_crash>destroy</on_crash>
        <vcpu>2</vcpu>
        <devices>
          <emulator>/usr/libexec/qemu-kvm</emulator>
          <console type='pty'/>
          <disk type='file' device='disk'>
            <driver name='qemu' cache='none'/>
            <source file='/opt/images/win7.img'/>
            <target dev='vda' bus='virtio'/>
          </disk>
          <disk type='file' device='cdrom'>
            <source file='/opt/ISO/windows7.iso'/>
            <target dev='hdc' bus='ide'/>
            <readonly/>
          </disk>
          <interface type='network'>
            <source network='default'/>
            <mac address='54:52:00:1b:bc:d0'/>
            <model type='virtio'/>
          </interface>
          <input type='mouse' bus='ps2'/>
          <graphics type='vnc' port='5911' keymap='en-us'/>
        </devices>
      </domain>
     
      Creating domain...                                                                                                                              |    0 B     00:01    
      Thu, 17 Nov 2011 18:19:50 DEBUG    Created guest, looking to see if it is running 说明:建立完成guest,查看其是否正在运行
      Thu, 17 Nov 2011 18:19:50 DEBUG    Launching console callback
      Thu, 17 Nov 2011 18:19:50 DEBUG    Saving XML boot config:
      <domain type='kvm'>
        <name>VM-Win7-2</name>
        <currentMemory>524288</currentMemory>
        <memory>524288</memory>
        <uuid>8da64796-97aa-a6ae-5ecb-30a312139c19</uuid>
        <os>
          <type arch='x86_64'>hvm</type>
          <boot dev='hd'/>
        </os>
        <features>
          <acpi/><apic/><pae/>
        </features>
        <clock offset="utc"/>
        <on_poweroff>destroy</on_poweroff>
        <on_reboot>restart</on_reboot>
        <on_crash>restart</on_crash>
        <vcpu>2</vcpu>
        <devices>
          <emulator>/usr/libexec/qemu-kvm</emulator>
          <console type='pty'/>
          <disk type='file' device='disk'>
            <driver name='qemu' cache='none'/>
            <source file='/opt/images/win7.img'/>
            <target dev='vda' bus='virtio'/>
          </disk>
          <disk type='file' device='cdrom'>
            <target dev='hdc' bus='ide'/>
            <readonly/>
          </disk>
          <interface type='network'>
            <source network='default'/>
            <mac address='54:52:00:1b:bc:d0'/>
            <model type='virtio'/>
          </interface>
          <input type='mouse' bus='ps2'/>
          <graphics type='vnc' port='5911' keymap='en-us'/>
        </devices>
      </domain>
     
     
      (virt-viewer:10164): Gtk-WARNING **: cannot open display: 
      Thu, 17 Nov 2011 18:19:53 DEBUG    Domain state after install: 1
      Domain installation still in progress. You can reconnect to
      the console to complete the installation process.      

后面的错误指示virt-viewer 不能通过 5911连接vnc,这与vnc的设置有关,但是这不影响虚拟机继续安装操作系统和运行,通过这个错误可以看到virt-install在生产虚拟机的最后调用virt-viewer打开虚拟机图形界面,进行操作系统的安装,可以通过vnc或者virt-manager打开虚拟机图形界面,继续完成guest操作系统的安装即可,vnc可以安装realVNC。

通过vnc客户端或者virt-manager连接到新建立的虚拟机,继续进行虚拟机内操作系统的安装,安装过程与在物理机上安装相同,不在赘述。安装完操作系统后,就像拥有了另一台机器一样,通过VNC远程连接(如果装的是Windows操作系统,也可以使用RDP进行连接,就windows那个远程桌面连接)可以进行相关操作了。

4、总结

在配置虚拟机的过程中

1)上述工作,在virt-manager中可以通过图形向导界面也可以完成,virt-manager可以通过在终端中输入virt-manager或者从菜单应用程序->系统工具中打开

2)使用qemu-kvm 命令也可以建立虚拟机【libvirt api中应该也提供了类似的函数,openstack、eucalyptus之类的虚拟机管理(也称为云计算管理)工具调用这个函数建立虚拟机】

命令如下:
        qemu-kvm -m 1024 -localtime -M pc -smp 1 -drive file=/opt/images/Win7.img,cache=writeback,boot=on -net nic,macaddr=52:54:00:12:34:80 -net tap -cdrom /opt/ISO/Windows7.iso -boot d -name win7,process=kvm-win7 -vnc :2 -usb -usbdevice tablet

参数说明如下:
              -m 1024  设置虚拟系统内存1024MB
              -localtime  使虚拟系统与宿主系统时间一致
              -M pc  虚拟系统类型为pc
              -smp 1  1个CPU
              -drive file=Windows7_x86.img,cache=writeback,boot=on
                     硬盘选项,虚拟磁盘是Windows7_x86.img,cache方式为writeback,可引导型磁盘。
              -net nic,macaddr=52:54:00:12:34:80  网卡选项,手工指定mac地址。
              -net tap  tap类型网络,相当于“桥模式”
              -cdrom Windows7.iso  光驱
              -boot d  启动顺序。d代表光驱。
              -name kvm-win7,process=kvm-win7  为虚拟机取名,便于识别
              -vnc :2  这里是通过vnc连接控制窗口,这里是在5902端口。
              -usb -usbdevice tablet  启用usb设备中的tablet功能。开启该功能可使虚拟机内外的鼠标同步

参数与virt-install基本相同。
 
        在安装了磁盘和网卡的半虚拟化驱动后,可以在-drive中加入if=virtio使用磁盘半虚拟化,在-net nic中加入model=virtio使用网卡半虚拟化驱动。virio在kenerl 2.6.24以上版本才能更好的发挥效用。

3)其实无论用哪种方法建立的基于kvm的虚拟机,都由qemu-kvm进行启动和管理,下面是查看liunx进程显示的一个虚拟机进程:

qemu-kvm -S -M rhel5.4.0 -m 1024 -smp 2 -name VM-win7 -uuid 71c4020b-ca54-20f2-780c-ec9fa070aa84 -no-kvm-pit-reinjection -monitor pty -pidfile /var/run/libvirt/qemu//VM-ubuntu-1104.pid -boot c -drive file=/opt/images/ubuntu-11.04-desktp.img,if=virtio,index=0,boot=on,cache=none -drive file=,if=ide,media=cdrom,index=2 -net nic,macaddr=54:52:00:0a:55:05,vlan=0,model=virtio -net tap,fd=17,script=,vlan=0,ifname=vnet0 -serial pty -parallel none -usb -vnc 0.0.0.0:11 -k en-us

一个虚拟机占用一个进程,可以通过进程管理和控制虚拟机。

4)虚拟机个相关配置保存在一个配置文件中,因此可以手工可以编写一个配置文件,然后通过virsh命令行构建虚拟机,已建好的虚拟机,配置文件更改后,需要用virsh define重新定义后才能生效。

5)基于KVM建立的虚拟机相关文件默认存放位置
         kvm虚拟机配置文件位置/etc/libvirt/qemu/      <---都是xml文件
         kvm虚拟机文件位置:var/lib/libvirt/images/   <---可以在建立虚拟机时指定

6)建立的虚拟机在运行时相关文件及存放位置
        在虚拟机运行时,会在/var/run/libvirt/qemu目录下存放虚拟机的pid文件和配置文件,配置文件与/etc/libvirt/qemu目录下对应的虚拟机文件相同,pid文件保存有此虚拟机进程号。虚拟机的日志文件存放在/var/log/libvirt/qemu目录下,每个虚拟机一个,文件名称为:虚拟机名称(或UUID)+“.log”

7)qemu不使用linux下的vncserver提供vnc服务,因此在此服务没有启动的情况下,也能通过vnc客户端连接到虚拟机。

通过上面的配置验证,说明在服务器上的虚拟化与桌面上的虚拟化在原来上基本相同,都是通过相关配置构建一个虚拟机,这个虚拟机的各类外设如磁盘、内存、CPU、网卡等通过都是对物理资源虚拟而获得,形成一个逻辑上的计算机,并通过一个文件进行保存。区别是桌面上的虚拟化采用的是软件模拟,服务器上则实现机制很多,由不依赖与操作系统(bare metal)的VMware ESX、Microsoft Hyper-V,也有与操作系统集成的kvm,还有同时提供bare metal机制,又需要一个操作系统对虚拟机进行管理的xen等,这些东西都称之为hypervisor。其实对于用户来说都是透明的,他们不需要知道其使用的虚拟机是采用何种方式实现的。

http://blog.csdn.net/starshine/article/details/6990599

基于KVM建立虚拟机的步骤及总结说明的更多相关文章

  1. 基于KVM的虚拟机创建

    KVM基本介绍:   KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中,KVM目前 ...

  2. 基于KVM的虚拟化研究及应用

    引言 虚拟化技术是IBM在20世纪70年代首先应用在IBM/370大型机上,这项技术极大地提高了大型机资源利用率.随着软硬件技术的迅速发展,这项属于大型机及专利的技术开始在普通X86计算机上应用并成为 ...

  3. 基于KVM、Xen、OpenVZ等虚拟化技术的WEB在线管理工具

    1.Proxmox proxmox是一个开源的虚拟化管理平台,支持集群管理和HA.在存储方面,proxmox除了支持常用的lvm,nfs,iscsi,还支持集群存储glusterfs和ceph,这也是 ...

  4. kvm libvirt 虚拟机管理

    http://www.2cto.com/os/201203/123128.html kvm虚拟机管理一.环境role         hostname    ip                  O ...

  5. .NET Core微服务之基于IdentityServer建立授权与验证服务

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.IdentityServer的预备知识 要学习IdentityServer,事先得了解一下基于Token的验证体系,这是一个庞大的主题 ...

  6. VM 操作系统实例化(基于 KVM 的虚拟化研究及应用--崔泽永(2011))的论文笔记

    一.VM操作系统实例化 1.建立虚拟磁盘镜像 虚拟磁盘镜像在逻辑上是提供给虚拟机使用的硬盘, 在物理上可以是 L inux系 统内一普通镜像文件, 也可以是真实的物理磁盘或分区. 本方案设计中将虚拟机 ...

  7. 1-安装kvm及虚拟机

    安装KVM及虚拟机 1.       创建lvm 2.       安装kvm相关的包 需要安装的包 安装好后,进入系统,发现没有eth0 然后重启网络 然后就看到了eth0,以及ip 挂载光盘 ' ...

  8. .NET Core微服务之基于IdentityServer建立授权与验证服务(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇我们基于IdentityServer4建立了一个AuthorizationServer,并且继承了QuickStartUI,能够成功 ...

  9. [qemu][kvm] 在kvm嵌套kvm的虚拟机里启动kvm加速

    常规情况下,如果在kvm的虚拟机里,又想使用kvm的虚拟机,会报如下的错误信息: [root@host0 nlb]# Could not access KVM kernel module: No su ...

随机推荐

  1. Myeclipse 常用操作(待补充)

    1.更改背景色 进入myeclipse工作区,选择window->Preferences->General->Editors->Text Editors->Backgro ...

  2. gets()函数

    基本信息: 可以无限读取,不会判断上限,以回车结束读取(这个换行符也被读取了),所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出. 函数原型: char*gets(char*b ...

  3. CMD Create Database & Table

    Just do it: /* SQL 创建库 CREATE DATABASE jsp_demo DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ...

  4. uvalive 6888 Ricochet Robots bfs

    题目链接 给一个n*m的图, 图上有n个标号, n<=4, 然后有墙, 还有一个终点x. 每一步, 只能走某一个标号, 可以向四个方向走, 然后必须要碰到墙或者图的边界或者另一个标号才能停下来. ...

  5. ASP.NET 连接 SQL Server 和 Oracle 教程

    临近期末,有很多同学都问我怎么关于ASP.NET 连接 SQL Server 和 Oracle 的问题.由于人太多了,我也不能一一去帮忙,就写了这篇博客.希望对大家有用处. 首先,前期准备是要安装数据 ...

  6. CSS3 Test

    CSS3Test 如何判定一个浏览器对css3的支持情况呢 有这么一个站点http://css3test.com 可以测试浏览器对CSS3的支持情况 对应的Github在这里 原理 实际上浏览器对CS ...

  7. JS中String的反转函数

    利用prototype封住reverse方法: (求更简便的方法: String.prototype.reverse=function () { var str=""; for(v ...

  8. [问题解决] ubuntu server12.04 认证的问题

    错误: 今天无缘无故登录不了系统ubuntu server12.04. 在登录界面输入正确密码后,黑屏一闪后又跳转到登录界面. 黑屏出现的时间太短,经过多次查看发现,卡在check battery s ...

  9. [LeetCode][Python]Palindrome Number

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com'https://oj.leetcode.com/problems/palindr ...

  10. openstack 开发step-by-step

    Set up your Open Stack There are several ways to deploy openstack, Devstack is easily for developer ...