• [原创]KVM虚拟化实践记录


    KVM虚拟机管理系统实现视频演示:http://v.youku.com/v_show/id_XMjg4MTczODU1Ng==.html


    一、KVM简介
    KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机),是一个开源的系统虚拟化模块,基于硬件的完全虚拟化,不过需要硬件支持(如Intel VT技术或者AMD V技术)。自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM目前已成为学术界的主流VMM之一。
    二、KVM安装配置
    1、准备工作
    1.1 关闭iptables防火墙
    [root@localhost ~]# service iptables stop //停止iptables
    1.2 CPU开通支持虚拟化
    需要在BIOS中开启虚拟化,一般是默认开启的
    2、安装kvm虚拟机
    2.1 查看CPU是否支持kvm完全虚拟机
    [root@localhost ~]# cat /proc/cpuinfo | grep 'vmx' //Intel CPU判断方法
    [root@localhost ~]# cat /proc/cpuinfo | grep 'svm' //AMD CPU判断方法
    根据对应的CPU型号进行选择判断方法,如果能出现信息 ,就说明CPU支持KVM完全虚拟机
    2.2 安装kvm和其它虚拟化所需管理软件包
    [root@localhost ~]# yum install -y kvm virt-* libvirts bridge-utils qemu-img
    软件包名称介绍:
    kvm:软件包中含有KVM内核模块,它在默认linux内核中提供kvm管理程序
    libvirts:安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机
    bridge-utils:设置网络网卡桥接
    virt-*:创建、克隆虚拟机命令,使用qemu命令来创建磁盘等。
    qemu-img:安装qemu组件,使用qemu命令来创建磁盘等。
    2.3 加载kvm模块,查看kvm模块是否被加载
    [root@localhost ~]# modprobe kvm-intel //加载kvm模块
    [root@localhost ~]# lsmod | grep kvm //查看kvm模块是否被加载
    2.4 重启确认kvm是否被加载
    [root@localhost ~]# reboot //重启
    [root@localhost ~]# lsmod | grep kvm //查看kvm模块是否被加载
    2.5 查看已打开虚拟机列表
    [root@localhost ~]# virsh list //查看虚拟机列表,如果有的话,就会显示出来
    2.6 配置eth0、br0网卡
    [eth0网卡]
    [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
    DEVICE=eth0
    HWADDR=74:D4:35:87:71:02
    TYPE=Ethernet
    UUID=723095b7-27d1-4f88-aa5f-5aa6b0472fbc
    ONBOOT=yes
    NM_CONTROLLED=yes
    BOOTPROTO=none
    BRIDGE=br0
    [br0网卡]
    [root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
    DEVICE=br0
    TYPE=Bridge
    ONBOOT=yes
    NM_CONTROLLED=no
    BOOTPROTO=static
    IPADDR=172.16.10.23
    NETMASK=255.255.255.0
    GATEWAY=172.16.10.254
    DNS1=202.96.128.86
    大家可以看着我的配置来进行修改,
    2.7 查看目前所有的网桥接口
    [root@localhost ~]# brctl show
    bridge name bridge id STP enabled interfaces
    br0 8000.74d435877102 no eth0
    virbr0 8000.5254005ce327 yes virbr0-nic
    (如果eth0没有挂载br0上就要使用命令:#brctl addif br0 eth0 将其挂上去即可)
    2.8 修改VNC服务器的配置文件
    [root@localhost ~]# vim /etc/libvirt/qemu.conf
    将 vnc_listen = "0.0.0.0" 前面的#号注释去掉 //在文件的第12行
    2.9 重启libvirtd和messagebus服务
    [root@localhost ~]# /etc/init.d/libvirtd restart //重启libvirtd服务
    Stopping libvirtd daemon: [ OK ]
    Starting libvirtd daemon: [ OK ]
    (若出现重启libvirtd服务失败,libvirtd: relocation error: libvirtd: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference,则执行:yum -y upgrade device-mapper-libs之后重启libvirtd服务即可)
    [root@localhost ~]# /etc/init.d/messagebus restart //重启messagebus服务
    Stopping system message bus: [ OK ]
    Starting system message bus: [ OK ]
    3、在宿主主机上创建、安装kvm虚拟机
    3.1 创建镜像文件目录和虚拟磁盘存放目录
    [root@localhost ~]# mkdir /data/iso
    [root@localhost ~]# mkdir -p /data/vm/
    3.2 把Centos6.5和windows2003系统文件拷贝到iso目录下
    这个可以通过ftp或者通过挂载,下载都行
    (kvm服务的存储将磁盘配置成lvm来使用,可动态扩展使用,还可以创建快照备份容灾)
    ======================================================================================================
    先创建磁盘:
    (windows)#qemu-img create -f raw /data/vm_disk/migrate.img 4G
    (linux)#qemu-img create -f qcow2 /data/vm_disk/migrate.img 6G
    安装虚拟机:
    (windows)#virt-install -n winxp01 -r 1024 -vcpus=1 -s 20 -c /data/iso/DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G.iso --hvm --os-type=windows -f /data/vm/win/winxp_01.img --bridge=br0 --graphics vnc,listen=0.0.0.0,port=7789 --force --autostart
    (linux)#virt-install -n openfiler -r 1024 -vcpus=2 -s 20 -c /data/iso/openfileresa-2.99.1-x86_64-disc1.iso --hvm --os-type=linux -f /data/vm/linux/openfiler.img --bridge=br0 --graphics vnc --force --autostart
    [安装过程需要在KVM主机上开启vncserver服务,然后使用vnc客户端连接上去,在使用virt-viewer (id号)连接上虚拟机安装界面进行安装]

    1.安装完毕后,要记的在虚拟机上安装acpid进程,以方便远程关闭机器
    yum install acpid -y
    chkconfig acpid on 345
    service acpid start
    2.等做完虚拟机的配置后,就需要对虚拟机做一个快照了。
    快照的制作有两种方法,一种是直接在virsh 里面使用snapshot来制作。另外一种是使用qemu-img来创建快照
    virsh snapshot-create-as winxp01
    快照创建的很快,其实,就是生成了一个XML的配置文件,记录下当前的信息。
    查看快照
    virsh snapshot-list winxp01
    名称
    CreationTime 状态
    ------------------------------------------------------------
    1330937069 2012-03-05 16:44:29 +0800 shutoff
    查看快照的配置文件
    virsh snapshot-current winxp01
    那么,快照文件存在什么地方呢,在/var/lib/libvirt/qemu/snapshot目录下,有以虚拟机的域名为名称的文件夹,就在里面哪
    使用qemu-img创建快照也很方便,这个镜像是直接对硬盘文件进行操作,硬盘文件的格式必须为qcow2格式的,记的貌似物理硬盘的格式为LVM才能创建快照,还是格式为LVM,qemu-img的格式不必为qcow2格式就能创建快照,还没整明白
    qemu-img snapshot -c 2012-3-5 /kvm/images/winxp01
    创建完毕后,查看一下
    qemu-img snapshot -l /kvm/images/winxp01
    Snapshot list:
    ID TAG VMSIZE DATE VM CLOCK
    1 1330937069 0 2012-03-0516:44:29 00:00:00.000
    2 2012-3-5 0 2012-03-0516:51:39 00:00:00.000
    可以看到有两个快照,ID=1为virsh创建的,ID=2为qemu-img创建的,这两个之间有什么关系,还没有想明白。
    【注意要使用 KVM 的快照功能,虚拟机的硬盘一定要是 qcow2 格式,否则无法使用快照功能。】
    ===========================================================================================================
    使用lvm安装虚拟机,制作镜像系统。然后创建快照来备份和快速复制启动虚拟机。
    #vgrename /dev/kvm /dev/vg01
    #lvcreate -L 8G -n ubuntu01 vg01
    #virt-install -n openfilertest_01 -r 2048 -vcpus=1 -s 10 -c /data/iso/ubuntu.iso --hvm --os-type=linux -f /dev/vg01/ubuntu01 --bridge=br0 --graphics vnc --force --autostart &
    #lvcreate -s -L 2G -n s_ubuntu01 /dev/vg01/ubuntu01
    创建虚拟机快照之后,编写kvm启动的s_ubuntu01.xml文件指定source设备是s_ubuntu01,修改uuid,mac和name。然后
    #virsh define s_ubuntu01.xml来启动虚拟机。
    #virsh start s_ubuntu01
    3.实现虚拟机动态迁移
    配置两台KVM主机SSH免密钥登录,关闭防火墙。执行#virsh -c qemu+ssh://dest_ip/system list
    成功表示可以做迁移了。执行下面命令进行迁移:#virsh migrate --verbose --live --persistent xp01 qemu+ssh://dest_ip/system
    迁移进度完成之后就迁移好了,但是配置文件还没有,需要在目标主机上创建并定义迁移过来的虚拟机,操作如下:
    #virsh dumpxml xp01 > /etc/libvirt/qemu/xp01.xml
    #virsh define /etc/libvirt/qemu/xp01.xml
    到此,完成迁移。
    ===========================================================================================================
    安装vnc服务:
    1.yum install tigervnc tigervnc-server
    2.设置vnc周密码:
    [root@www.linuxidc.com ~]# vncserver
    You will require a password to access your desktops.
    Password:<输入vnc登录密码>
    Verify:<再次输入vnc登录密码>
    3。 配置VNC:
    为了防黑屏,需要修改一下/root/.vnc/xstartup。
    注释下面两行
    #xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & [注意:若要使用vnc远程到字符界面进行操作则不要注释此行,并安装xterm工具即可。注意远程上去之后如果有界面不能操作则需要设置vnc客户端的键盘和鼠标的使用]
    #twm &
    然后再添加下面一行
    gnome-session & //如果是ubuntu系统,配置这个生效的话需要安装gdm:apt-get install gdm
    4.修改用户配置文件:/etc/sysconfig/vncservers,去掉下面这两行前的“#”,也就是说把这两行的注释给去掉。
    VNCSERVERS="2:root"
    VNCSERVERARGS[2]="-geometry 1024x768 -depth 32"
    4.改变xstartup的权限:
    chmod 777 /root/.vnc/xstartup
    5、防火墙开端口,netstat -antpl查看可以发现有三个端口在监听。
    5901 5801 6001
    这三个端口:
    默认的, vnc 服务监听3个TCP端口
    RFB(Remote FrameBuffer)协议 默认端口 : 5900 显示器号
    HTTP协议默认端口 : 5800 显示器号
    X协议 默认端口 : 6000 显示器号
    vncserver使用的显示器编号默认从1开始, 依次使用, 也可以参数指定端口号,我们只需要RFB协议就好了,所以,我们在防火墙中加5900到5903这几个。
    #vi /etc/sysconfig/iptables 找到下面的语句:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    在这之后填加:
    -A INPUT -m state --state NEW -m tcp -p tcp --dport 5900:5903 -j ACCEPT
    #service iptables restart
    # vncserver -kill :1 //kill进程
    # vncserver :1 //重启进程
    6.在windows中用vnc客户端登录测试。
    7.配置vnc开机自启,在/etc/rc.local文件中添加: /etc/init.d/vncserver start & 即可。
    ===========================================================================================================
    添加磁盘:
    方式一:
    qemu-img create -f qcow2 /data/vm_disk/vm_sda.img 1G
    //新建的大小和指定参数的大小不一样,但是挂载的时候大小是对的。

    cat > vm_sda.xml
    <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2'/>
    <source file='/data/vm_disk/vm_sda.img'/>
    <target dev='hdf' bus='virtio' type='virtio'/>
    </disk>

    virsh attach-device ubuntu_01 vm_sda.xml
    virsh detach-device ubuntu_01 vm_sda.xml

    方式二:
    virt-make-fs -F qcow2 -t ext4 -s 512M /data/vm/device/ /data/vm/device/vm_sda1.img
    //新建的大小和指定参数的大小不一样,但是挂载的时候大小是对的。

    cat > vm_sda1.xml
    <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2'/>
    <source file='/data/vm/device/vm_sda1.img'/>
    <target dev='hde' bus='virtio' type='virtio'/>
    </disk>

    virsh attach-device ubuntu_01 vm_sda1.xml
    virsh detach-device ubuntu_01 vm_sda1.xml

    分区格式化:
    fdisk -l
    fdisk /dev/sda
    n
    1
    w
    mkfs.ext4 /dev/sda1
    mount /dev/sda1 /data

    ===========================================================================================================

    1.kvm虚拟机部署之后安装shellinabox服务用于web操作该虚拟机。

    部署shellinabox:
    1)yum install git openssl-devel pam-devel zlib-devel autoconf automake libtool
    2)git clone https://github.com/shellinabox/shellinabox.git && cd shellinabox
    3)autoreconf -i
    4)./configure && make
    5)make install
    6)openssl genrsa -des3 -out my.key 1024
    7)openssl req -new -key my.key -out my.csr
    8)cp my.key my.key.org
    9)openssl rsa -in my.key.org -out my.key
    10)openssl x509 -req -days 3650 -in my.csr -signkey my.key -out my.crt
    11)cat my.crt my.key > certificate.pem
    12)/usr/local/shellinabox/bin/shellinaboxd -c /root -u root -b
    /usr/local/shellinabox/bin/shellinaboxd --disable-ssl -c /root -u root -b(不使用https)
    13)netstat -ntpl |grep 4200
    14)ps -ef |grep shell
    15)https://ip:4200 //(jhk/jhk123456)但是一直root登陆不上去,默认是不让root登陆的,只能其它用户登陆,然后再 su - 切换过去。

    2.随机生成mac地址和uuid:
    1)#MACADDR="52:54:$(dd if=/dev/urandom count=1 2>/dev/null | md5sum | sed 's/^(..)(..)(..)(..).*$/1:2:3:4/')"; echo $MACADDR
    2)#uuid=`/usr/bin/uuidgen`;echo $uuid

    ===========================================================================================================
    virsh console vm01 //默认是不起作用的,需要配置一下内容.
    1.echo "ttyS0" >> /etc/securetty
    2.在etc/grub.conf中加入如下内容console=ttyS0
    3.在/etc/inittab中加入
    S0:12345:respawn:/sbin/agetty ttyS0 115200
    4.reboot
    5.virsh console vm01

    kvm虚拟化windows操作系统鼠标有点不灵活等问题,在这里通过以下方式解决。在虚拟机的<devices>配置中增加:
    # virsh edit wintest01
    <input type=’tablet’ bus=’usb’/>

    kvm使用vnc连接虚拟机:使用id号和port连接都试一下
    如果vnc连接guest窗口一闪而过,那么在vnc viewer客户端软件中设置ColourLevel=rgb222即可。

    ===========================================================================================================
    配置KVM主机tcp方式互相访问:
    virsh -c qemu+tcp://server01/system
    修改文件vim /etc/sysconfig/libvirtd,用来启用tcp的端口
    LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
    LIBVIRTD_ARGS="--listen"
    修改文件vim /etc/libvirt/libvirtd.conf
    listen_tls = 0
    listen_tcp = 1
    tcp_port = "16509"
    listen_addr = "0.0.0.0"
    auth_tcp = "none"
    重启libvirtd:
    service libvirtd restart
    防火墙开放16509端口。
    python操作迁移:
    import libvirt
    import pprint
    conn_01 = libvirt.open('qemu+tcp://userename@server01/system')
    conn_02 = libvirt.open('qemu+tcp://userename@server02/system')
    vm_domain = conn_01.lookupByNName('instance_name')
    vm_domain.migrate(connm_02,True,'instance_name',None,0)
    pprint.pprint(help(vm_domain.migrate))
    ===========================================================================================================
    解决KVM虚拟机鼠标同步问题
    kvm虚拟化windows操作系统鼠标有点不灵活等问题,在这里通过以下方式解决。在虚拟机的<devices>配置中增加:
    # virsh edit wintest01
    <input type='tablet' bus='usb'/>
    ===========================================================================================================
    python迁移代码:
    #!/usr/bin/python

    import libvirt
    import pprint
    conn_01 = libvirt.open('qemu+tcp://vm01/system')
    conn_02 = libvirt.open('qemu+tcp://vm02/system')
    vm_domain = conn_01.lookupByName('s_migrate')
    vm_domain.migrate(conn_02,True,'s_migrate',None,0)
    pprint.pprint(help(vm_domain.migrate))
    手动迁移步骤:
    qemu-img create -f raw /data/vm_disk/migrate.img 4G
    virt-install -n s_migrate -r 2048 -vcpus=1 -s 20 -c /iso/DG8FV-B9TKY-FRT9J-6CRCC-XPQ4G.iso --hvm --os-type=windows -f /data/vm_disk/s_migrate.img --bridge=br0 --graphics vnc --force --autostart &
    迁移时报错:error: unable to connect to server at 'vm02:49152': Connection refused是因为ssh免密钥登录没有配置好。
    直接迁移,没有配置文件和存储的迁移:
    virsh migrate s_migrate --live qemu+tcp://vm01/system
    virsh migrate s_migrate --live qemu+ssh://vm01/system
    迁移时把存储一起迁移,需要目标主机先建立一样的路径和名称大小的磁盘文件:
    virsh migrate --live --copy-storage-all --unsafe --persistent s_migrate qemu+ssh://vm02/system
    virsh migrate --live --copy-storage-all --unsafe --persistent s_migrate qemu+tcp://vm02/system
    直接迁移,没有配置文件和存储的迁移,需要目标主机先建立一样的路径和名称大小的磁盘文件:
    virsh migrate --verbose --live --persistent s_migrate qemu+ssh://vm02/system
    virsh migrate --verbose --live --persistent s_migrate qemu+tcp://vm02/system

    ===========================================================================================================

    存储池和存储卷的管理

    1.创建 KVM主机存储池

    1).创建基于文件夹(目录)的存储池
    virsh pool-define-as vmware_pool –type dir –target /virhost/vmware#定义存储池vmware_pool或
    virsh pool-create-as –name vmware_pool –type dir –target /virhost/vmware
    #创建存储池vmware_pool,类型为文件目录,/virhost/vmware,与pool-define-as结果一样

    2).创建基于文件系统的存储池
    virsh pool-define-as –name vmware_pool –type fs –source-dev/dev/vg_target/LogVol02 –source-format ext4 –target/virhost/vmware

    virsh pool-create-as –name vmware_pool –type fs –source-dev/dev/vg_target/LogVol02 –source-format ext4 –target/virhost/vmware

    3).查看存储池信息
    virsh pool-info vmware_pool #查看存储域(池)

    4).启动存储池
    virsh pool-start vmware_pool #启动存储池
    virsh pool-list

    5)销毁存储域,取消存储池
    virsh pool-destroy vmware_pool #销毁存储池
    virsh pool-list –all
    virsh pool-undefine vmware_pool #取消存储池的定义
    virsh pool-list –all

    2.创建了存储池后,就可以创建一个卷,这个卷是用来做虚拟机的硬盘
    virsh vol-create-as –pool vmware_pool –name node6.img –capacity10G –allocation 1G –format qcow2#创建卷node6.img,所在存储池为vmware_pool,容量10G,初始分配1G,文件格式类型qcow2
    virsh vol-info /virhost/vmware/node6.img #查看卷信息名称: node6.img类型:文件容量: 10.00 GB分配: 136.00 KB
    3.在存储卷上安装虚拟主机
    virt-install –connect qemu:///system -n node7 -r 512 -f /virhost/vmware/node7.img –vnc –os-type=linux–os-variant=rhel6 –vcpus=1 –network bridge=br0 -c /mnt/rhel-server-6.0-x86_64-dvd.iso

  • 相关阅读:
    【转】Android开发——MediaProvider源码分析(2)
    关于ActivityGroup使用过程中遇到的一点问题
    HttpWebRequest详解
    关于Assembly.CreateInstance()与Activator.CreateInstance()方法的区别
    你会在C#的类库中添加web service引用吗?
    ASP.NET跳转网页的三种方法的比较
    .net发送HTTP POST包
    依赖注入
    微软ASP.NET MVC Beta版本发布
    随笔~
  • 原文地址:https://www.cnblogs.com/wsjhk/p/6909260.html
Copyright © 2020-2023  润新知