kvm虚拟化_kvm虚拟化面试题 - CSDN
精华内容
参与话题
  • kvm虚拟化

    2020-06-09 14:51:49
    1. 虚拟化介绍 虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。 物理机我们一般称为宿主机(Host...

    1. 虚拟化介绍

    虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

    物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

    那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?
    这个主要是通过一个叫做 Hypervisor 的程序实现的。

    根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:

    • 全虚拟化
    • 半虚拟化
      全虚拟化:
      Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型
      半虚拟化:
      物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型
      理论上讲:
      全虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比半虚拟化要高;
      半虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

    2. kvm介绍

    kVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
    KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

    那 IO 的虚拟化,比如存储和网络设备则是由 Linux 内核与Qemu来实现。

    作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

    大家在网上看 KVM 相关文章的时候肯定经常会看到 Libvirt 这个东西。

    Libvirt 就是 KVM 的管理工具。

    其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。

    Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh

    • libvirtd是服务程序,接收和处理 API 请求
    • API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
    • virsh 是我们经常要用的 KVM 命令行工具

    3. kvm部署

    环境说明:

    环境说明: IP
    RHEL7 172.16.12.128

    3.1 kvm安装

    部署前请确保你的CPU虚拟化功能已开启。分为两种情况:

    • 虚拟机要关机设置CPU虚拟化
    • 物理机要在BIOS里开启CPU虚拟化
    //关闭防火墙与SELINUX
    [root@kvm ~]# systemctl stop firewalld
    [root@kvm ~]# systemctl disable firewalld
    Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    [root@kvm ~]# setenforce 0
    [root@kvm ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
    [root@localhost ~]# reboot
    
    //配置网络源
    [root@kvm yum.repos.d]# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
    [root@kvm ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    [root@kvm ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    [root@kvm ~]# yum -y install epel-release vim wget net-tools unzip zip gcc gcc-c++
    安装过程略.....
    
    //验证CPU是否支持KVM;如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的
    [root@kvm ~]# egrep -o 'vmx|svm' /proc/cpuinfo
    vmx
    vmx
    vmx
    vmx
    
    //kvm安装
    [root@kvm ~]# yum -y install qemu-kvm qemu-kvm-tools qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer bridge-utils libguestfs-tools
    安装过程略......
    
    
    //因为虚拟机中网络,我们一般都是和公司的其他服务器是同一个网段,所以我们需要把 \
    KVM服务器的网卡配置成桥接模式。这样的话KVM的虚拟机就可以通过该桥接网卡和公司内部 \
    其他服务器处于同一网段
    //此处我的网卡是ens33,所以用br0来桥接ens33网卡
    [root@kvm ~]# cd /etc/sysconfig/network-scripts/
    [root@kvm network-scripts]# ls
    ifcfg-ens33  ifdown-isdn      ifup          ifup-plip      ifup-tunnel
    ifcfg-lo     ifdown-post      ifup-aliases  ifup-plusb     
    .....此处内容省略
    [root@kvm network-scripts]# cp ifcfg-ens33 ifcfg-br0
    [root@kvm network-scripts]# cat ifcfg-br0
    TYPE=Bridge
    DEVICE=br0
    NM_CONTROLLED=no
    BOOTPROTO=static
    NAME=br0
    ONBOOT=yes
    IPADDR=192.168.160.109
    NETMASK=255.255.255.0
    GATEWAY=192.168.160.1
    DNS1=114.114.114.114
    DNS2=8.8.8.8
    [root@kvm network-scripts]# cat ifcfg-ens33
    TYPE=Ethernet
    BOOTPROTO=static
    NAME=ens33
    DEVICE=ens33
    ONBOOT=yes
    BRIDGE=br0
    NM_CONTROLLED=no
    
    //重启网络
    [root@kvm ~]# systemctl restart network
    [root@kvm ~]# ip a
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
        link/ether 00:0c:29:4c:50:b4 brd ff:ff:ff:ff:ff:ff
    3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
        link/ether 52:54:00:60:a8:ea brd ff:ff:ff:ff:ff:ff
        inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
           valid_lft forever preferred_lft forever
    4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
        link/ether 52:54:00:60:a8:ea brd ff:ff:ff:ff:ff:ff
    5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
        link/ether 72:63:57:0a:ca:76 brd ff:ff:ff:ff:ff:ff
        inet 192.168.160.109/24 brd 192.168.160.255 scope global br0
           valid_lft forever preferred_lft forever
        inet6 fe80::7063:57ff:fe0a:ca76/64 scope link
           valid_lft forever preferred_lft forever
           
    
    //启动服务
    [root@kvm ~]# systemctl start libvirtd
    [root@kvm ~]# systemctl enable libvirtd
    
    //验证安装结果
    [root@kvm ~]# lsmod|grep kvm
    kvm_intel             170086  0
    kvm                   566340  1 kvm_intel
    irqbypass              13503  1 kvm
    
    //测试并验证安装结果
    [root@kvm ~]# virsh -c qemu:///system list
     Id    Name                           State
    ----------------------------------------------------
    [root@kvm ~]# virsh --version
    3.9.0
    [root@kvm ~]# virt-install --version
    1.4.3
    [root@kvm ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
    [root@kvm ~]# ll /usr/bin/qemu-kvm
    lrwxrwxrwx 1 root root 21 Oct 18 10:57 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm
    [root@kvm ~]# lsmod |grep kvm
    kvm_intel             170086  0
    kvm                   566340  1 kvm_intel
    irqbypass              13503  1 kvm
    
    //查看网桥信息
    [root@kvm ~]# brctl show
    bridge name     bridge id               STP enabled     interfaces
    br0             8000.000c294c50b4       no              ens33
    virbr0          8000.52540060a8ea       yes             virbr0-nic
    

    3.2 kvm web管理界面安装

    kvm 的 web 管理界面是由 webvirtmgr 程序提供的。

    //安装依赖包
    [root@kvm ~]# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx python-devel
    
    //升级pip
    [root@kvm ~]# pip install --upgrade pip
    
    
    //从github上下载webvirtmgr代码
    [root@kvm ~]# cd /usr/local/src/
    [root@kvm src]# git clone git://github.com/retspen/webvirtmgr.git
    Cloning into 'webvirtmgr'...
    remote: Enumerating objects: 5730, done.
    remote: Total 5730 (delta 0), reused 0 (delta 0), pack-reused 5730
    Receiving objects: 100% (5730/5730), 3.01 MiB | 39.00 KiB/s, done.
    Resolving deltas: 100% (3688/3688), done.
    
    //安装webvirtmgr
    [root@kvm src]# cd webvirtmgr/
    [root@kvm webvirtmgr]# pip install -r requirements.txt
    Collecting django==1.5.5 (from -r requirements.txt (line 1))
      Downloading https://files.pythonhosted.org/packages/38/49/93511c5d3367b6b21fc2995a0e53399721afc15e4cd6eb57be879ae13ad4/Django-1.5.5.tar.gz (8.1MB)
        57% |██████████████████▌             | 4.7MB 38kB/s eta 0:01:28 
    .....此处省略安装步骤
    
    //检查sqlite3是否安装
    [root@kvm webvirtmgr]# python
    Python 2.7.5 (default, May  3 2017, 07:55:04)
    [GCC 4.8.5 20150623 (Red Hat 4.8.5-14)] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sqlite3
    >>> exit()
    
    //初始化帐号信息
    [root@kvm webvirtmgr]# python manage.py syncdb
    WARNING:root:No local_settings file found.
    Creating tables ...
    Creating table auth_permission
    Creating table auth_group_permissions
    Creating table auth_group
    Creating table auth_user_groups
    Creating table auth_user_user_permissions
    Creating table auth_user
    Creating table django_content_type
    Creating table django_session
    Creating table django_site
    Creating table servers_compute
    Creating table instance_instance
    Creating table create_flavor
    
    You just installed Django's auth system, which means you don't have any superusers defined.
    Would you like to create one now? (yes/no): yes     //问你是否创建超级管理员帐号
    Username (leave blank to use 'root'):   //指定超级管理员帐号用户名,默认留空为root
    Email address: sean1002@126.com     //设置超级管理员邮箱
    Password:       //设置超级管理员密码
    Password (again):       //再次输入超级管理员密码
    Superuser created successfully.
    Installing custom SQL ...
    Installing indexes ...
    Installed 6 object(s) from 1 fixture(s)
    
    
    //拷贝web网页至指定目录
    [root@kvm webvirtmgr]# mkdir /var/www
    [root@kvm webvirtmgr]# cp -r /usr/local/src/webvirtmgr /var/www/
    [root@kvm webvirtmgr]# chown -R nginx.nginx /var/www/webvirtmgr/
    
    //生成密钥
    [root@kvm ~]# ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Created directory '/root/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:CQoZtso2M5Uo39lKvjZboncqakQ69iJt5wnjiJKZNhw root@kvm
    The key's randomart image is:
    +---[RSA 2048]----+
    |  o              |
    | ..+.            |
    |..+o  .          |
    |o+.o + . .       |
    |+*. = . S        |
    |+E+o .           |
    |+*= + .          |
    |BO+===.          |
    |Oo=**=           |
    +----[SHA256]-----+
    //由于这里webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,那么这个是它的ip
    [root@kvm ~]# ssh-copy-id 192.168.160.109
    /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    The authenticity of host '192.168.160.109 (192.168.160.109)' can't be established.
    ECDSA key fingerprint is SHA256:UszC1ZeHM7xw/uefVkJoXW6XgRw+Jl51tAXLjFERclE.
    ECDSA key fingerprint is MD5:b3:f1:02:b8:01:8e:53:a7:87:09:c0:75:24:4c:ad:88.
    Are you sure you want to continue connecting (yes/no)? yes
    /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    root@192.168.160.109's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh '192.168.160.109'"
    and check to make sure that only the key(s) you wanted were added.
    //配置端口转发
    [root@kvm ~]# ssh 192.168.160.109 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60
    Last login: Thu Oct 18 08:26:40 2018 from 192.168.160.36
    [root@kvm ~]# ss -antl
    State       Recv-Q Send-Q Local Address:Port               Peer Address:Port
    LISTEN      0      128              *:111                          *:*
    LISTEN      0      5      192.168.122.1:53                           *:*
    LISTEN      0      128              *:22                           *:*
    LISTEN      0      100      127.0.0.1:25                           *:*
    LISTEN      0      128      127.0.0.1:6080                         *:*
    LISTEN      0      128      127.0.0.1:8000                         *:*
    LISTEN      0      128             :::111                         :::*
    LISTEN      0      128             :::22                          :::*
    LISTEN      0      100            ::1:25                          :::*
    LISTEN      0      128            ::1:6080                        :::*
    LISTEN      0      128            ::1:8000                        :::* 
    
    
    
    
    //配置nginx
    [root@kvm ~]# vim /etc/nginx/nginx.conf
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    
    include /usr/share/nginx/modules/*.conf;
    
    events {
        worker_connections 1024;
    }
    
    http {
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile            on;
        tcp_nopush          on;
        tcp_nodelay         on;
        keepalive_timeout   65;
        types_hash_max_size 2048;
    
        include             /etc/nginx/mime.types;
        default_type        application/octet-stream;
    
        include /etc/nginx/conf.d/*.conf;
    
        server {
            listen       80;
            server_name  localhost;
    
            include /etc/nginx/default.d/*.conf;
    
            location / {
                root html;
                index index.html index.htm;
            }
    
            error_page 404 /404.html;
                location = /40x.html {
            }
    
            error_page 500 502 503 504 /50x.html;
                location = /50x.html {
            }
        }
    }
    
    
    [root@kvm ~]# vim /etc/nginx/conf.d/webvirtmgr.conf
    server {
        listen 80 default_server;
    
        server_name $hostname;
        #access_log /var/log/nginx/webvirtmgr_access_log;
    
        location /static/ {
            root /var/www/webvirtmgr/webvirtmgr;
            expires max;
        }
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-Proto $remote_addr;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
            proxy_send_timeout 600;
            client_max_body_size 1024M;
        }
    }
    
    //确保bind绑定的是本机的8000端口
    [root@kvm ~]# vim /var/www/webvirtmgr/conf/gunicorn.conf.py
    .....此处省略N行
    bind = '0.0.0.0:8000'     //确保此处绑定的是本机的8000端口,这个在nginx配置中定义了,被代理的端口
    backlog = 2048
    .....此处省略N行
    
    //重启nginx
    [root@kvm ~]# systemctl restart nginx
    [root@kvm ~]# ss -antl
    State       Recv-Q Send-Q Local Address:Port               Peer Address:Port
    LISTEN      0      128              *:111                          *:*
    LISTEN      0      128              *:80                           *:*
    LISTEN      0      5      192.168.122.1:53                           *:*
    LISTEN      0      128              *:22                           *:*
    LISTEN      0      100      127.0.0.1:25                           *:*
    LISTEN      0      128      127.0.0.1:6080                         *:*
    LISTEN      0      128      127.0.0.1:8000                         *:*
    LISTEN      0      128             :::111                         :::*
    LISTEN      0      128             :::22                          :::*
    LISTEN      0      100            ::1:25                          :::*
    LISTEN      0      128            ::1:6080                        :::*
    LISTEN      0      128            ::1:8000                        :::*
    
    
    
    //设置supervisor
    [root@kvm ~]# vim /etc/supervisord.conf
    .....此处省略上面的内容,在文件最后加上以下内容
    [program:webvirtmgr]
    command=/usr/bin/python2 /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
    directory=/var/www/webvirtmgr
    autostart=true
    autorestart=true
    logfile=/var/log/supervisor/webvirtmgr.log
    log_stderr=true
    user=nginx
    
    [program:webvirtmgr-console]
    command=/usr/bin/python2 /var/www/webvirtmgr/console/webvirtmgr-console
    directory=/var/www/webvirtmgr
    autostart=true
    autorestart=true
    stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
    redirect_stderr=true
    user=nginx
    
    
    
    //启动supervisor并设置开机自启
    [root@kvm ~]# systemctl start supervisord
    [root@kvm ~]# systemctl enable supervisord
    Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
    [root@kvm ~]# systemctl status supervisord
    ● supervisord.service - Process Monitoring and Control Daemon
       Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
       Active: active (running) since Thu 2018-10-18 11:59:33 CST; 25s ago
     Main PID: 17918 (supervisord)
       CGroup: /system.slice/supervisord.service
               └─17918 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
    
    Oct 18 11:59:33 kvm systemd[1]: Starting Process Monitoring and Control Daemon...
    Oct 18 11:59:33 kvm systemd[1]: Started Process Monitoring and Control Daemon.
    
    [root@kvm webvirtmgr]# ss -antl
    State       Recv-Q Send-Q Local Address:Port               Peer Address:Port
    LISTEN      0      128              *:111                          *:*
    LISTEN      0      128              *:80                           *:*
    LISTEN      0      5      192.168.122.1:53                           *:*
    LISTEN      0      128              *:22                           *:*
    LISTEN      0      100      127.0.0.1:25                           *:*
    LISTEN      0      128              *:8000                         *:*
    LISTEN      0      100              *:6080                         *:*
    LISTEN      0      128             :::111                         :::*
    LISTEN      0      128             :::22                          :::*
    LISTEN      0      100            ::1:25                          :::*
    
    //配置nginx用户
    [root@kvm home]# su - nginx -s /bin/bash
    -bash-4.2$ ssh-keygen -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/var/lib/nginx/.ssh/id_rsa):
    Created directory '/var/lib/nginx/.ssh'.
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /var/lib/nginx/.ssh/id_rsa.
    Your public key has been saved in /var/lib/nginx/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:rdbmW/YIXxAJBzPsd9q9eKHPjWtSZ5EQC5li3tkczYI nginx@localhost.localdomain
    The key's randomart image is:
    +---[RSA 2048]----+
    |         .=o=.+  |
    |         o.E.=.o |
    |        o.o *.+ .|
    |         o.o.+.o |
    |        S ...+ ..|
    |         o  ..o.+|
    |        o + o.+oo|
    |       . o =.*o+.|
    |          o.oo*+.|
    +----[SHA256]-----+
    
    -bash-4.2$ touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
    -bash-4.2$ chmod 0600 ~/.ssh/config
    
    -bash-4.2$ ssh-copy-id root@192.168.160.109
    /bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/nginx/.ssh/id_rsa.pub"
    /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    Warning: Permanently added '192.168.160.109' (ECDSA) to the list of known hosts.
    root@192.168.160.109's password:
    
    Number of key(s) added: 1
    
    Now try logging into the machine, with:   "ssh 'root@192.168.160.109'"
    and check to make sure that only the key(s) you wanted were added.
    
    -bash-4.2$ exit
    logout
    
    [root@kvm ~]# vim /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
    [Remote libvirt SSH access]
    Identity=unix-user:root
    Action=org.libvirt.unix.manage
    ResultAny=yes
    ResultInactive=yes
    ResultActive=yes
    
    [root@kvm ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
    [root@kvm ~]# systemctl restart nginx
    [root@kvm ~]# systemctl restart libvirtd
    

    3.3 kvm web界面管理

    通过ip地址在浏览器上访问kvm,例如我这里就是:

    http://192.168.160.109/login
    

    在这里插入图片描述

    3.3.1 kvm连接管理

    创建SSH连接:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.3.2 kvm存储管理

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    通过远程连接软件上传ISO镜像文件至存储目录/var/lib/libvirt/images/`[root@kvm ~]# cd /var/lib/libvirt/images/
    [root@kvm images]# ls
    [root@kvm images]#

    Upload SCP
    CentOS-7-x86_64-DVD-1804.iso (4263.00 MB, 8:45 min = 8.12 MB/sec)

    [root@kvm images]# ls
    CentOS-7-x86_64-DVD-1804.iso`

    在 web 界面查看ISO镜像是否存在
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3.3.4 实例管理

    实例(虚拟机)创建
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    虚拟机插入光盘在这里插入图片描述
    设置在 web 上访问虚拟机的密码
    在这里插入图片描述
    启动虚拟机
    在这里插入图片描述
    在这里插入图片描述

    4.故障案例

    4.1 案例1
    web界面配置完成后可能会出现以下错误界面
    在这里插入图片描述

    [root@localhost ~]# ll /etc/rc.local
    lrwxrwxrwx. 1 root root 13 Aug  6  2018 /etc/rc.local -> rc.d/rc.local
    [root@localhost ~]# ll /etc/rc.d/rc.local
    -rw-r--r-- 1 root root 513 Mar 11 22:35 /etc/rc.d/rc.local
    [root@localhost ~]# chmod +x /etc/rc.d/rc.local
    [root@localhost ~]# ll /etc/rc.d/rc.local
    -rwxr-xr-x 1 root root 513 Mar 11 22:35 /etc/rc.d/rc.local
    
    [root@localhost ~]# vim /etc/rc.d/rc.local
    ......此处省略N行
    # that this script will be executed during boot.
    
    touch /var/lock/subsys/local
    nohup novnc_server 172.16.12.128:5920 &
    
    [root@localhost ~]# . /etc/rc.d/rc.local
    

    做完以上操作后再次访问即可正常访问
    在这里插入图片描述

    4.2 案例2

    第一次通过web访问kvm时可能会一直访问不了,一直转圈,而命令行界面一直报错(too many open files)

    此时需要对nginx进行配置

    [root@localhost ~]# vim /etc/nginx/nginx.conf
    ....此处省略N行
    user nginx;
    worker_processes auto;
    error_log /var/log/nginx/error.log;
    pid /run/nginx.pid;
    worker_rlimit_nofile 655350;    //添加此行配置
    
    # Load dynamic modules. See /usr/share/nginx/README.dynamic.
    ....此处省略N行
    
    [root@localhost ~]# systemctl restart nginx
    

    然后对系统参数进行设置

    [root@localhost ~]# vim /etc/security/limits.conf
    ....此处省略N行
    # End of file
    * soft nofile 655350
    * hard nofile 655350
    

    到此问题即可解决

    展开全文
  • kvm虚拟化学习(一)

    千次阅读 2019-06-25 16:08:31
    一、虚拟化 1.虚拟化介绍 虚拟化是云计算的基础。虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同事运行多个逻辑计算机,每个逻辑 计算机可运行不同的操作系统,并且应用程序都可以在...

    一、虚拟化

    1.虚拟化介绍

    虚拟化是云计算的基础。虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同事运行多个逻辑计算机,每个逻辑 计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而相互不影响,从而显著提高计算机的工作效率。

    虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行业中灵活多变的应用需求。

    2.虚拟化按层次分类:

    (1)完全虚拟化:最流行的虚拟化方法使用名为 hypervisor 的一种软件,在虚拟服务器和底层硬件之间建立一个抽象层。VMware 和微软的VirtualPC 是代表该方法的两个商用产品,而基于核心的虚拟机 (KVM) 是面向 Linux 系统的开源产品hypervisor 可以捕获 CPU 指令,为指令访问硬件控制器和外设充当中介。因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。主要缺点是, hypervisor 给处理器带来开销

    (2)准虚拟化/半虚拟化:完全虚拟化是处理器密集型技术,因为它要求 hypervisor管理各个虚拟服务器,并让它们彼此独立。减轻这种负担的一种方法就是,改动客户端操作系统,让它以为自己运行在虚拟环境下,能够与hypervisor 协同工作。这种方法就叫准虚拟化 (para-virtualization)Xen 是开源准虚拟化技术的一个例子。操作系统作为虚拟服务器在 Xen hypervisor 上运行之前,它必须在核心层面进行某些改变。因此, Xen 适用于 BSD 、 Linux 、 Solaris 及其他开源操作系统,但不适合对像Windows 这些专有的操作系统进行虚拟化处理,因为它们无法改动。准虚拟化技术的优点是性能高。经过准虚拟化处理的服务器可与hypervisor 协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。准虚拟化与完全虚拟化相比优点明显,以至于微软和 VMware 都在开发这项技术,以完善各自的产品。

    (3)系统虚拟化:就操作系统层的虚拟化而言,没有独立的hypervisor 层。相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。一个明显的区别是,如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统 ( 不过每个实例有各自的应用程序和用户) 。虽然操作系统层虚拟化的灵活性比较差,但本机速度性能比较高。此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。

    (4)桌面虚拟化:服务器虚拟化主要针对服务器而言,而虚拟化最接近用户的还是要算的上桌面虚拟化了,桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。桌面虚拟化使得桌面管理变得简单,不用每台终端单独进行维护,每台终端进行更新。终端数据可以集中存储在中心机房里,安全性相对传统桌面应用要高很多。桌面虚拟化可以使得一个人拥有多个桌面环境,也可以把一个桌面环境供多人使用。

    3.完全虚拟化按架构分类

    (1)1型虚拟化
    在这里插入图片描述
    Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。

    (2)2型虚拟化
    在这里插入图片描述
    物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类

    二、kvm虚拟化

    1、kvm简介

    kvm全称是基于内核的虚拟机(Kernel-based Virtual Machine,是一个开源软件,基于内核的虚拟化技术,实际是嵌入式的一个虚拟化模块,通过优化内核来使用虚拟化技术,改内核模块使得Linux变成了一个Hypervisor,虚拟机使用Linux自身的调度器进行管理。

    KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。

    2、Linux 上的用户空间、内核空间、虚机:

    Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被 KVM 置于一种受限制的 CPU 模式下运行。

    KVM:运行在内核空间,提供CPU 和内存的虚级化,以及客户机的 I/O 拦截。Guest 的 I/O 被 KVM 拦截后,交给 QEMU 处理。

    QEMU:修改过的为 KVM 虚机使用的 QEMU 代码,运行在用户空间,提供硬件 I/O 虚拟化,通过IOCTL /dev/kvm 设备和 KVM 交互。

    3、KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。IO 的虚拟化,就交给 Linux 内核和qemu来实现。

    Kvm:负责cpu和内存的虚拟化
    Qemu:负责I/O设备的虚拟化

    4、Libvirt:是 KVM 的管理工具。Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。OpenStack 底层也使用 Libvirt。

    Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
    (1)libvirtd是服务程序,接收和处理 API 请求;
    (2)API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具,后面我们也会介绍;
    (3)virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例。作为 KVM 和 OpenStack 的实施人员,virsh 和 virt-manager 是一定要会用的。

    展开全文
  • KVM虚拟化

    万次阅读 多人点赞 2019-06-11 18:33:27
    kvm虚拟化1. 虚拟化介绍2. kvm介绍3. kvm部署3.1 kvm安装3.2 kvm web管理界面安装 1. 虚拟化介绍 虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、...

    1. 虚拟化介绍

    虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。

    物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。

    那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?
    这个主要是通过一个叫做 Hypervisor 的程序实现的。

    根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:

    • 全虚拟化
    • 半虚拟化

    全虚拟化:
    Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型

    在这里插入图片描述
    半虚拟化:

    在这里插入图片描述

    理论上讲:

    全虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比半虚拟化要高;
    半虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。

    2. kvm介绍

    kVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
    KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。

    那 IO 的虚拟化,比如存储和网络设备则是由 Linux 内核与Qemu来实现。

    作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。

    大家在网上看 KVM 相关文章的时候肯定经常会看到 Libvirt 这个东西。

    Libvirt 就是 KVM 的管理工具。

    其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。

    Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh

    • libvirtd是服务程序,接收和处理 API 请求;
    • API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具;
    • virsh 是我们经常要用的 KVM 命令行工具

    3. kvm部署

    环境说明:

    IP:192.168.157.99

    3.1 kvm安装

    部署前请确保你的CPU虚拟化功能已开启。分为两种情况:

    • 虚拟机要关机设置CPU虚拟化
    • 物理机要在BIOS里开启CPU虚拟化

    //关闭防火墙与selinux

    	[root@mp ~]# systemctl stop firewalld
    	[root@mp ~]# systemctl disable firewalld
    	Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
    	Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
    	[root@mp ~]# setenforce 0
    	[root@mp ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
    	//这一步十分重要!!!
    

    //配置网络源

    	[root@mp yum.repos.d]# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
    	[root@mp ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    	[root@mp ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
    	[root@mp ~]# yum -y install epel-release vim wget net-tools unzip zip gcc gcc-c++
    	安装过程略.....
    

    //验证CPU是否支持KVM;如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的

    	[root@mp ~]# egrep -o 'vmx|svm' /proc/cpuinfo
    	vmx
    	vmx
    	vmx
    	vmx
    

    //kvm安装

    	[root@mp ~]# yum -y install qemu-kvm qemu-kvm-tools qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer bridge-utils libguestfs-tools
    	//安装过程省略......
    

    //因为虚拟机中网络,我们一般都是和公司的其他服务器是同一个网段,所以我们需要把 KVM服务器的网卡配置成桥接模式。这样的话KVM的虚拟机就可以通过该桥接网卡和公司内部 其他服务器处于同一网段

    //此处我的网卡是ens32,所以用br0来桥接ens32网卡

    	//对应修改或者添加以下内容即可
    	[root@mp ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0 
    	TYPE=Bridge
    	DEVICE=br0
    	NM_CONTROLLED=no
    	BOOTPROTO=static
    	NAME=br0
    	ONBOOT=yes
    	IPADDR=192.168.157.99
    	NETMASK=255.255.255.0
    	GATEWAY=192.168.157.2
    	DNS1=8.8.8.8
    
    
    	//保留以下内容即可
    	[root@mp ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens32 
    	TYPE=Ethernet
    	BOOTPROTO=static
    	NAME=ens33
    	DEVICE=ens33
    	ONBOOT=yes
    	BRIDGE=br0
    	NM_CONTROLLED=no
    
    
    	[root@mp ~]# systemctl restart network
    	
    	[root@mp ~]# ip a 
    	1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    	    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    	    inet 127.0.0.1/8 scope host lo
    	       valid_lft forever preferred_lft forever
    	    inet6 ::1/128 scope host 
    	       valid_lft forever preferred_lft forever
    	2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
    	    link/ether 00:0c:29:93:a6:6c brd ff:ff:ff:ff:ff:ff
    	    inet6 fe80::20c:29ff:fe93:a66c/64 scope link 
    	       valid_lft forever preferred_lft forever
    	3: ens35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    	    link/ether 00:0c:29:93:a6:76 brd ff:ff:ff:ff:ff:ff
    	4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    	    link/ether 00:0c:29:93:a6:6c brd ff:ff:ff:ff:ff:ff
    	    inet 192.168.157.99/24 brd 192.168.157.255 scope global br0
    	       valid_lft forever preferred_lft forever
    	    inet6 fe80::20c:29ff:fe93:a66c/64 scope link 
    	       valid_lft forever preferred_lft forever
    

    //启动服务

    	[root@mp ~]# systemctl start libvirtd
    	[root@mp ~]# systemctl enable libvirtd
    

    //验证安装结果

    	[root@mp ~]# lsmod|grep kvm
    	kvm_intel             170086  0 
    	kvm                   566340  1 kvm_intel
    	irqbypass              13503  1 kvm
    
    

    //测试并验证安装结果

    	[root@mp ~]# virsh -c qemu:///system list
    	 Id    名称                         状态
    	----------------------------------------------------
    	[root@mp ~]# virsh --version
    	4.5.0
    	[root@mp ~]# virt-install --version
    	1.5.0
    	[root@mp ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
    	[root@mp ~]# ll /usr/bin/qemu-kvm 
    	lrwxrwxrwx. 1 root root 21 314 14:17 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm
    	
    	[root@mp ~]# lsmod |grep kvm
    	kvm_intel             170086  0 
    	kvm                   566340  1 kvm_intel
    	irqbypass              13503  1 kvm
    

    //查看网桥信息

    	[root@mp ~]# brctl show
    	bridge name	bridge id		STP enabled	interfaces
    	br0		8000.000c2993a66c	no		ens32
    	virbr0		8000.5254009df26a	yes		virbr0-nic
    

    3.2 kvm web管理界面安装

    kvm 的 web 管理界面是由 webvirtmgr 程序提供的。

    //安装依赖包

    	[root@mp ~]# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx python-devel
    

    //升级pip

    		
    	[root@mp ~]# pip install --upgrade pip
    	//过程省略......
    

    //从github上下载webvirtmgr代码

    	[root@mp ~]# cd /usr/local/src/
    	[root@mp src]# git clone git://github.com/retspen/webvirtmgr.git
    	正克隆到 'webvirtmgr'...
    	remote: Enumerating objects: 5614, done.
    	remote: Total 5614 (delta 0), reused 0 (delta 0), pack-reused 561
    	接收对象中: 100% (5614/5614), 2.98 MiB | 1011.00 KiB/s, done.
    	处理 delta 中: 100% (3602/3602), done.
    

    //安装webvirtmgr

    	[root@mp src]# cd webvirtmgr/
    	[root@mp webvirtmgr]# pip install -r requirements.txt
    	DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
    	//安装过程省略......
    

    //检查sqlite3是否安装

    	[root@mp webvirtmgr]# python
    	Python 2.7.5 (default, Oct 30 2018, 23:45:53) 
    	[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
    	Type "help", "copyright", "credits" or "license" for more information.
    	>>> import sqlite3
    	>>> exit()
    

    //初始化帐号信息

    	[root@kvm webvirtmgr]# python manage.py syncdb
    	WARNING:root:No local_settings file found.
    	Creating tables ...
    	Creating table auth_permission
    	Creating table auth_group_permissions
    	Creating table auth_group
    	Creating table auth_user_groups
    	Creating table auth_user_user_permissions
    	Creating table auth_user
    	Creating table django_content_type
    	Creating table django_session
    	Creating table django_site
    	Creating table servers_compute
    	Creating table instance_instance
    	Creating table create_flavor
    	
    	You just installed Django's auth system, which means you don't have any superusers defined.
    	Would you like to create one now? (yes/no): yes     //问你是否创建超级管理员帐号
    	Username (leave blank to use 'root'):   //指定超级管理员帐号用户名,默认留空为root
    	Email address: bebejo@126.com     //设置超级管理员邮箱
    	Password:1       //设置超级管理员密码
    	Password (again):1       //再次输入超级管理员密码
    	Superuser created successfully.
    	Installing custom SQL ...
    	Installing indexes ...
    	Installed 6 object(s) from 1 fixture(s)
    

    //拷贝web网页至指定目录

    	[root@mp webvirtmgr]# mkdir /var/www
    	[root@mp webvirtmgr]# cp -r /usr/local/src/webvirtmgr/ /var/www/
    	[root@mp webvirtmgr]# chown -R nginx.nginx /var/www/webvirtmgr/
    

    //生成密钥

    	//全部保持默认,回车即可
    	[root@mp ~]# ssh-keygen -t rsa
    	Generating public/private rsa key pair.
    	Enter file in which to save the key (/root/.ssh/id_rsa): 
    	Created directory '/root/.ssh'.
    	Enter passphrase (empty for no passphrase): 
    	Enter same passphrase again: 
    	Your identification has been saved in /root/.ssh/id_rsa.
    	Your public key has been saved in /root/.ssh/id_rsa.pub.
    	The key fingerprint is:
    	SHA256:3/LDSmdcrWbrJxAXtt9HJD13UKlz4lTbYrCqzUNVkWQ root@mp
    	The key's randomart image is:
    	+---[RSA 2048]----+
    	|             .E*o|
    	|            ..*+=|
    	|             =o=*|
    	|            +==+o|
    	|        S  oo+=+o|
    	|         .oo.o .+|
    	|         =+.=.+ .|
    	|        ..+=oo...|
    	|          .o.ooo |
    	+----[SHA256]-----+
    

    //由于这里webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,那么这个是它的ip

    	[root@mp ~]# ssh-copy-id 192.168.157.99
    	/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
    	The authenticity of host '192.168.157.99 (192.168.157.99)' can't be established.
    	ECDSA key fingerprint is SHA256:I20VCudXLSb+D75FPy0SjjexuAhmPkhN8hO4DZFjaT8.
    	ECDSA key fingerprint is MD5:f2:04:78:0f:b3:30:ae:12:66:05:85:97:e6:ab:80:15.
    	Are you sure you want to continue connecting (yes/no)? yes
    	/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    	/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    	root@192.168.157.99's password: 
    	
    	Number of key(s) added: 1
    	
    	Now try logging into the machine, with:   "ssh '192.168.157.99'"
    	and check to make sure that only the key(s) you wanted were added.
    
    

    //端口转发

    	[root@mp ~]# ssh 192.168.157.99 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60
    	Last login: Fri Mar 15 02:23:10 2019 from 192.168.157.1
    	[root@mp ~]# ss -antl 
    	State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    	LISTEN     0      128        *:111                    *:*                  
    	LISTEN     0      5      192.168.122.1:53                     *:*                  
    	LISTEN     0      128        *:22                     *:*                  
    	LISTEN     0      100    127.0.0.1:25                     *:*                  
    	LISTEN     0      128    127.0.0.1:6080                   *:*                  
    	LISTEN     0      128    127.0.0.1:8000                   *:*                  
    	LISTEN     0      128       :::111                   :::*                  
    	LISTEN     0      128       :::22                    :::*                  
    	LISTEN     0      100      ::1:25                    :::*                  
    	LISTEN     0      128      ::1:6080                  :::*                  
    	LISTEN     0      128      ::1:8000                  :::*        
    

    //配置nginx

    	[root@mp ~]# vim /etc/nginx/nginx.conf
    	[root@kvm ~]# vim /etc/nginx/nginx.conf
    	user nginx;
    	worker_processes auto;
    	error_log /var/log/nginx/error.log;
    	pid /run/nginx.pid;
    	
    	include /usr/share/nginx/modules/*.conf;
    	
    	events {
    	    worker_connections 1024;
    	}
    	
    	http {
    	    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    	                      '$status $body_bytes_sent "$http_referer" '
    	                      '"$http_user_agent" "$http_x_forwarded_for"';
    	
    	    access_log  /var/log/nginx/access.log  main;
    	
    	    sendfile            on;
    	    tcp_nopush          on;
    	    tcp_nodelay         on;
    	    keepalive_timeout   65;
    	    types_hash_max_size 2048;
    	
    	    include             /etc/nginx/mime.types;
    	    default_type        application/octet-stream;
    	
    	    include /etc/nginx/conf.d/*.conf;
    	
    	    server {
    	        listen       80;
    	        server_name  localhost;
    	
    	        include /etc/nginx/default.d/*.conf;
    	
    	        location / {
    	            root html;
    	            index index.html index.htm;
    	        }
    	
    	        error_page 404 /404.html;
    	            location = /40x.html {
    	        }
    	
    	        error_page 500 502 503 504 /50x.html;
    	            location = /50x.html {
    	        }
    	    }
    	}
    
    
    	[root@mp ~]# vim /etc/nginx/conf.d/webvirtmgr.conf 
    	server {
        listen 80 default_server;
    
        server_name $hostname;
        #access_log /var/log/nginx/webvirtmgr_access_log;
    
        location /static/ {
            root /var/www/webvirtmgr/webvirtmgr;
            expires max;
        }
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
            proxy_set_header Host $host:$server_port;
            proxy_set_header X-Forwarded-Proto $remote_addr;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
            proxy_send_timeout 600;
            client_max_body_size 1024M;
        }
    }
    

    //确保bind绑定的是本机的8000端口

    	[root@mp ~]# vim /var/www/webvirtmgr/conf/gunicorn.conf.py
    	.....此处省略N行
    	bind = '0.0.0.0:8000'     //确保此处绑定的是本机的8000端口,这个在nginx配置中定义了,被代理的端口
    	backlog = 2048
    	.....此处省略N

    //重启nginx

    	[root@mp ~]# systemctl start nginx 
    	[root@mp ~]# ss -antl
    	State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    	LISTEN     0      128        *:111                    *:*                  
    	LISTEN     0      128        *:80                     *:*                  
    	LISTEN     0      5      192.168.122.1:53                     *:*                  
    	LISTEN     0      128        *:22                     *:*                  
    	LISTEN     0      100    127.0.0.1:25                     *:*                  
    	LISTEN     0      128    127.0.0.1:6080                   *:*                  
    	LISTEN     0      128    127.0.0.1:8000                   *:*                  
    	LISTEN     0      128       :::111                   :::*                  
    	LISTEN     0      128       :::22                    :::*                  
    	LISTEN     0      100      ::1:25                    :::*                  
    	LISTEN     0      128      ::1:6080                  :::*                  
    	LISTEN     0      128      ::1:8000                  :::*        
    

    //设置supervisor

    	[root@mp ~]# vim /etc/supervisord.conf 
    	//.....此处省略上面的内容,在文件最后加上以下内容
    	[program:webvirtmgr]
    	command=/usr/bin/python2 /var/www/webvirtmgr/manage.py run_gunicorn -c /var/www/webvirtmgr/conf/gunicorn.conf.py
    	directory=/var/www/webvirtmgr
    	autostart=true
    	autorestart=true
    	logfile=/var/log/supervisor/webvirtmgr.log
    	log_stderr=true
    	user=nginx
    	
    	[program:webvirtmgr-console]
    	command=/usr/bin/python2 /var/www/webvirtmgr/console/webvirtmgr-console
    	directory=/var/www/webvirtmgr
    	autostart=true
    	autorestart=true
    	stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
    	redirect_stderr=true
    	user=nginx
    

    //启动supervisor并设置开机自动启动

    	[root@mp ~]# systemctl start supervisord
    	[root@mp ~]# systemctl enable supervisord
    	Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
    	[root@mp ~]# systemctl status supervisord
    	● supervisord.service - Process Monitoring and Control Daemon
    	   Loaded: loaded (/usr/lib/systemd/system/supervisord.service; enabled; vendor preset: disabled)
    	   Active: active (running) since 五 2019-03-15 03:06:19 CST; 20s ago
    	 Main PID: 3326 (supervisord)
    	   CGroup: /system.slice/supervisord.service
    	           └─3326 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor...
    	
    	315 03:06:18 mp systemd[1]: Starting Process Monitoring and Control.....
    	315 03:06:19 mp systemd[1]: Started Process Monitoring and Control ...n.
    	Hint: Some lines were ellipsized, use -l to show in full.
    
    
    
    	[root@mp ~]# ss -antl 
    	State      Recv-Q Send-Q Local Address:Port               Peer Address:Port              
    	LISTEN     0      128        *:111                    *:*                  
    	LISTEN     0      128        *:80                     *:*                  
    	LISTEN     0      5      192.168.122.1:53                     *:*                  
    	LISTEN     0      128        *:22                     *:*                  
    	LISTEN     0      100    127.0.0.1:25                     *:*                  
    	LISTEN     0      128    127.0.0.1:6080                   *:*                  
    	LISTEN     0      128    127.0.0.1:8000                   *:*                  
    	LISTEN     0      128       :::111                   :::*                  
    	LISTEN     0      128       :::22                    :::*                  
    	LISTEN     0      100      ::1:25                    :::*                  
    	LISTEN     0      128      ::1:6080                  :::*                  
    	LISTEN     0      128      ::1:8000                  :::*     
    

    //配置nginx用户

    	//未创建nginx用户,所以用su命令赋予它交互式登录的权限
    	[root@mp ~]# su - nginx -s /bin/bash
    	-bash-4.2$ ssh-keygen -t rsa
    	//全部保持默认,回车即可,密码除外。
    	Generating public/private rsa key pair.
    	Enter file in which to save the key (/var/lib/nginx/.ssh/id_rsa): 
    	Created directory '/var/lib/nginx/.ssh'.
    	
    	Enter passphrase (empty for no passphrase): 
    	
    	Enter same passphrase again: 
    	
    	Your identification has been saved in /var/lib/nginx/.ssh/id_rsa.
    	Your public key has been saved in /var/lib/nginx/.ssh/id_rsa.pub.
    	The key fingerprint is:
    	SHA256:86tvVfX2z7hqCHz/rqVUKMQPReWO26hNWlpZaZOTOgg nginx@mp
    	The key's randomart image is:
    	+---[RSA 2048]----+
    	|           .o..  |
    	|         . . .  .|
    	|          +   ...|
    	|         . o +.+o|
    	|       .E . +.@..|
    	|        o+.o.X o.|
    	|         oo+@ oo.|
    	|          o@o+. o|
    	|        .+*.==+. |
    	+----[SHA256]-----+
    	-bash-4.2$ touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
    	-bash-4.2$ chmod 0600 ~/.ssh/config
    	-bash-4.2$ ssh-copy-id root@192.168.157.99
    	/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/nginx/.ssh/id_rsa.pub"
    	/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
    	/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
    	Warning: Permanently added '192.168.157.99' (ECDSA) to the list of known hosts.
    	root@192.168.157.99's password: 
    	
    	Number of key(s) added: 1
    	
    	Now try logging into the machine, with:   "ssh 'root@192.168.157.99'"
    	and check to make sure that only the key(s) you wanted were added.
    	
    	-bash-4.2$ exit
    	登出
    
    
    
    	[root@mp ~]#  vim /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
    	[Remote libvirt SSH access]
    	Identity=unix-user:root
    	Action=org.libvirt.unix.manage
    	ResultAny=yes
    	ResultInactive=yes
    	ResultActive=yes
    
    	[root@mp ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
    	[root@mp ~]# systemctl restart nginx
    	[root@mp ~]# systemctl restart libvirtd
    

    3.3 kvm web界面管理

    通过ip地址在浏览器上访问kvm,例如我这里就是:http://192.168.157.99

    在这里插入图片描述此处的用户为:root
    密码为:执行python manage syncdb时设置的超级管理员密码


    在这里插入图片描述此处的Label要与下面的FQDN / IP一致!


    在这里插入图片描述点击上方的IP地址,不是点击Host:192.168.157.99

    3.3.2 kvm存储管理

    //创建存储

    在这里插入图片描述点击New Storage


    在这里插入图片描述****

    进入存储
    在这里插入图片描述点击default


    在这里插入图片描述池路径 /var/lib/libvirt/images:磁盘镜像ISO文件存储的位置


    //通过远程连接软件上传ISO镜像文件至存储目录/var/lib/libvirt/images/

    [root@mp ~]# cd /var/lib/libvirt/images/
    [root@mp images]# ll
    总用量 3963904
    -rw-r--r-- 1 root root 4059037696 3月  15 03:50 rhel-server-7.4-x86_64-dvd.iso
    

    //在web界面查看ISO镜像文件是否存在
    在这里插入图片描述


    //创建系统安装镜像
    在这里插入图片描述


    //添加成功如下图
    在这里插入图片描述

    3.3.3 kvm网络管理

    在这里插入图片描述点击New Network


    在这里插入图片描述


    3.3.4 实例管理

    实例(虚拟机的创建)
    在这里插入图片描述


    //虚拟机插入光盘

    在这里插入图片描述


    //设置在web上访问虚拟机的密码

    在这里插入图片描述


    //启动虚拟机

    在这里插入图片描述在这里插入图片描述


    //虚拟机安装

    在这里插入图片描述此步骤为虚拟机的安装步骤,不再阐述

    4. 所遇问题

    4.1 故障一

    第一次通过web访问kvm时可能会一直访问不了,一直转圈,而命令行界面一直报错(too many open files)

    
    	永久生效方法:
    		修改/etc/security/limits.conf,在文件底部添加:
    		* soft nofile 655360
    		* hard nofile 655360
    		星号代表全局, soft为软件,hard为硬件,nofile为这里指可打开文件数。
    	 
    	另外,要使limits.conf文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
    	查看 /etc/pam.d/login 文件中有:
    	session required /lib/security/pam_limits.so
    

    4.2 故障二

    web界面配置完成后可能会出现以下错误界面
    在这里插入图片描述
    解决方法是安装novnc并通过novnc_server启动一个vnc

    	[root@mp ~]# ll /etc/rc.local
    	lrwxrwxrwx. 1 root root 13 Aug  6  2018 /etc/rc.local -> rc.d/rc.local
    	[root@mp ~]# ll /etc/rc.d/rc.local
    	-rw-r--r-- 1 root root 513 Mar 11 22:35 /etc/rc.d/rc.local
    	[root@mp ~]# chmod +x /etc/rc.d/rc.local
    	[root@mp ~]# ll /etc/rc.d/rc.local
    	-rwxr-xr-x 1 root root 513 Mar 11 22:35 /etc/rc.d/rc.local
    	
    	[root@mp ~]# vim /etc/rc.d/rc.local
    	......此处省略N行
    	# that this script will be executed during boot.
    	
    	touch /var/lock/subsys/local
    	nohup novnc_server 172.16.12.128:5920 &
    	
    	[root@mp ~]# . /etc/rc.d/rc.local
    
    展开全文
  • KVM虚拟化技术 实战与原理解析.pdf;KVM虚拟化技术 实战与原理解析.pdf
  • KVM虚拟化技术实践

    万次阅读 2017-02-01 16:06:45
    今天分享的文章是关于云计算中的kvm虚拟化技术),通过本文你可以知道的是kvm是干什么的,如何使用kvm,如何通过java操作xml从而生成生成虚拟机。KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),...

    [版权申明:本文系作者原创,转载请注明出处]
    文章出处:http://blog.csdn.net/sdksdk0/article/details/54809159
    作者:朱培 ID:sdksdk0

    今天分享的文章是关于云计算中的kvm(虚拟化技术),通过本文你可以知道的是kvm是干什么的,如何使用kvm,如何通过java操作xml从而生成生成虚拟机。

    一、虚拟化简介

    系统虚拟化是将底层物理设备与上层操作系统、软件分离的一
    种去耦合技术,在一台物理机器上逻辑的划分出多台机器。
    • 虚拟化的目标是实现IT资源利用效率和灵活性的最大化

    在一台物理主机上虚拟出多个虚拟计算机(虚拟机,Virtual
    Machine,VM),其上能同时运行多个独立的操作系统,这
    些客户操作系统(Guest OS)通过虚拟机管理器(Virtual
    Machine Monitor,VMM,也称作Hypervisor)访问实际
    的物理资源。

    KVM 全称是 基于内核的虚拟机(Kernel-based
    Virtual Machine),它是一个 Linux 的一个内核模块,该内
    核模块使得 Linux 变成了一个 Hypervisor:
    它由 Quramnet 开发,该公司于 2008年被 Red Hat 收购。
    • 它支持 x86 (32 and 64 位), s390, Powerpc 等 CPU。
    • 它从 Linux 2.6.20 起就作为一模块被包含在 Linux 内核中。
    • 它需要支持虚拟化扩展的 CPU。
    • 它是完全开源的。

    二、使用虚拟化的原因

    为什么我们要使用虚拟化技术。当公司的服务器越来越多,我们需要充分利用资源,也需要统一运维管理。
    主要原因可以总结如下:

    1. 打破“一台服务器对应一套应用”的模
      式,将物理服务器进行整合,提升利用
    2. 服务器和相关IT硬件更少,节省了机房空
      间,也减少了散热和电力需求
    3. 具备灵活数据备份和应用迁移机制,保
      障服务永不中断
    4. 资源动态调配和模板化部署,应用系统
      快速上线,及时响应业务变化。

    这里写图片描述

    虚拟化分为3类

    1. 全虚拟化
    2. 半虚拟化
    3. 硬件辅助的虚拟化

    无虚拟化

    1. – CPU一般设为四个Ring
    2. – Kernel Mode一般跑在Ring 0上
    3. – User Mode一般跑在Ring 3上
    4. – 对于一个普通的传统的Linux系统没有问题

    • 虚拟化

    1. – 在Guest机器和Host机器中间加一层Hypervisor
    2. – Host机器看它像跑在自己上面的程序
    3. – Guest机器看它像自己所运行的硬件
    4. – 如果Host机器和Guest机器都跑相同的Linux,它们的Kernel都想运行在Ring 0。

    三、常见的虚拟化技术

    例如很常见的VMWare、VirtualBox、Citrix Xen、kvm等。桌面虚拟化 将原本在本地电脑安装的桌面系统统一在后端数据中心进
    行部署和管理; 用户可以通过任何设备,在任何地点,任何时间访问属于
    自己的桌面系统环境。还有服务器虚拟化。包括全虚拟化(Full-Virtulization):
    无需修改操作系统,VM ESXi、Linux KVM
    • 半虚拟化(Para-Virtulization):
    集成半虚拟化代码,直接运行特权指令,性能接近物理机,需要修改操作
    系统,
    MS Hyper-V、 Ctrix Xen、IBM PowerVM
    • 操作系统层虚拟化
    开发、测试环境,VM Workstation、VM Server

    四、kvm环境配置

    下面介绍的操作流程是在centos6.6系统中演示。首先把防火墙关掉:

      Service iptables stop
        Chkconfig iptables off

    如果你的是centos7关闭防火墙:

        systemctl stop firewalld.service 
        systemctl disable firewalld.service

    1、进行cpu检测,

        egrep -c '(vmx|svm)' /proc/cpuinfo

    命令结果大于0表示cpu支持虚拟化。如果是等于0,就需要手动勾选虚拟化引擎。

    这里写图片描述

    如果linux的系统是在VMware Workstation上的,需要将cpu设置为支持硬件虚拟化。需要在设置中把处理器核数里面的虚拟化引擎(虚拟化Intel VT-X/EPT…)这个选项勾上。

    这里写图片描述

    2、kvm安装

    安装命令kvm:

        yum  install qemu-kvm

    • 安装虚拟化管理工具:

      yum install virt-manager libvirt libvirt-python python-virtinst  bridge-utils

    • libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以
    由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,
    vmware,XEN,Hyper-v, LXC 等 Hypervisor。
    • Virsh:基于 libvirt 的 命令行工具 (CLI)
    • Virt-Manager:基于 libvirt 的 GUI 工具

    3、kvm内核模块

    将kvm嵌入到内核:

        modprobe kvm
        modprobe kvm-intel

    然后使用命令查看是否已经嵌入成功,

        lsmod | grep kvm

    如果显示下面的结果则代表嵌入成功。

    [root@controller ~]# lsmod | grep kvm
    kvm_intel 55496 0
    kvm 337900 1 kvm_intel
    [root@controller ~]#

    4、启动libvirt

        service libvirtd restart
        chkconfig libvirtd on

    5、资源准备

    新建kvmtest目录。我们就是这个目录下进行kvm测试。

     mkdir  /kvmtest

    然后将已经下载好的 CentOS-6.8-x86_64-minimal.iso上传到这个/kvmtest目录下。这里需要说明一下,我的系统是centos6.6的,然后对于6.6或者6.8的迷你版系统兼容更好,否则我们在后面创建电脑之后可能会发生无法启动的问题。对于其他版本开机时可能会遇到 “no filename or root path specified”的错误。

    6、创建安装盘

      qemu-img create -f qcow2 /kvmtest/centos-6.8.qcow2 
        10G

    7、创建虚拟机

     virt-install --virt-type kvm --name centos-6.8 --ram 1024 \
        --vcpus 1 \
        --cdrom=/kvmtest/CentOS-6.8-x86_64-minimal.iso \
        --disk /kvmtest/centos-6.8.qcow2,format=qcow2 \
        --network network=default \
        --graphics vnc,listen=0.0.0.0 --noautoconsole \
        --os-type=linux --os-variant=rhel6

    以下是各参数代表的意思:

    1. -n NAME
      指定虚拟机的名称
    2. -r MEMORY
      指定虚拟机的内存用量
    3. -u UUID
      指定虚拟机的唯一通用标识符
      (Universally Unique Identifier,UUID)。
      省略这个参数时,virt-install 将会自动产生
    4. –vcpus=VCPUS
      指定虚拟机的虚拟 CPU (Virtual CPU,VCPU) 数量
      -f DISKFILE
      指定虚拟磁盘的文件路径名称
      -s DISKSIZE
      用来指定虚拟磁盘的大小,这个参数需配合-f 使用。
      DISKSIZE为虚拟磁盘的大小,单位是GB
      -m MAC
      指定虚拟机的网络卡之硬件地址。
      这个参数可以省略,省略时virt-install 将自动产生
      -p 以半虚拟化的方式建立虚拟机
      -l LOCATION 指定安装来源

    8、创建完成之后我们就可以使用命令来查看虚拟机了。

        virsh  list --all

    因为我这边创建了3台,所以可以看到有3台虚拟机。

    这里写图片描述

    shut off代表的是关机中的意思。你可以参照下面的命令来查看虚拟机的信息。

    例如我这里需要开启一台,命令就是

    virsh start centos-6.8
    

    virsh list # 显示本地活动虚拟机
    • virsh start openSuse # 启动名字为ubuntu的非活动虚拟机
    • virsh create ubuntu.xml # 创建虚拟机(创建后,虚拟机立即执行,成为活
    动主机)
    • virsh suspend openSuse # 暂停虚拟机
    • virsh resume ubuntu # 启动暂停的虚拟机
    • virsh shutdown ubuntu # 正常关闭虚拟机
    • virsh destroy ubuntu # 强制关闭虚拟机
    • virsh dominfo openSuse # 显示虚拟机的基本信息
    • virsh dumpxml openSuse # 显示虚拟机的当前配置文件
    • virsh setmem ubuntu 51200 # 给不活动虚拟机设置内存大小
    • virsh setvcpus ubuntu 4 # 给不活动虚拟机设置cpu个数
    • virsh edit ubuntu # 编辑配置文件(一般用在刚定义完VM)

    9、客户端连接。
    我们可以使用命令

    netstat -natp
    

    来查看启动的进程。我们可以看到5900端口的进程是/qemu-kvm。

    这里写图片描述

    启动一台是5900,那么启动两台就是5900和5901,依次类推。
    我们可以在window系统中使用vnc-4_1_3-x86_win32_viewer.exe来连接。

    输入ip地址和端口号进行连接,例如的我的是192.168.44.146
    这里写图片描述

    然后就和平常的linux系统的安装流程来操作就行。安装好之后就可以连接进来操作即可。root 123456

    这里写图片描述

    在这里把电源模块安装好。
    电源管理:
    yum install acpid

    yum install tcpdump

    五、kvm的xml文件

    我们需要知其然也要知其所以然。那么我们是怎样做到在VMware Workstation虚拟出来的centos6.6系统中再其中虚拟化出来一台centos6.8系统。
    使用ifconfig命令可以查看IP网络配置。

    我们进入到/etc/libvirt/qemu目录下。我们可以看到有centos-6.8.xml文件。

    这里写图片描述

    在这个xml文件可以看到里面有虚拟机名字配置,磁盘大小配置等。那么这样我们就可以看出来了,原来这样一个centos6.8只需要一个xml文件就可以搞定,是不是我们可以复制一份这个xml文件就可以生成一个虚拟机了呢?答案是肯定了,激动人心的时候到了,那么我们就复制一份珍贵xml文件,然后改改名字呗。

    cp  centos-6.8.xml centos-6.8.01.xml
    

    然后vi新的这个centos-6.8.01.xml文件,将其虚拟机名字改为centos-6.8.01,这样我们就有了一台新的虚拟机了。

    那么我们如何启动我们刚才新的这台机器了。使用下面的命令:

    virsh define 模板文件路径

    例如我的是:

    virsh define  /etc/libvirt/qemu/centos-6.8.02.xml
    

    如果我们不想要了可以使用下面的命令移除虚拟机(virsh undefine 虚拟机名)

    virsh undefine centos-6.8  
    

    六、通过JAVA编程控制KVM

    在上一个章节中我们知道了一个kvm虚拟机我们可以使用xml文件来控制,那么我们自然也可以用java程序来写xml文件,从而生成虚拟机。如果你使用过阿里云或者腾讯云等云服务器的话你就知道,上面可以自定义选择cpu核数内存磁盘什么的,不就类似操作不同的参数,从而生成不同的xml文件,最后生成云服务器了。现在对于阿里腾讯等这些云服务器又增加的想法没,嘿嘿嘿!

    在Libvirt中有使用java操作kvm的API。

    我们知道在我的centos6.6中安装了qume-kvm,那么我们想要从其他地方(例如windos中)想要远程访问怎么办呢?所以我们需要对linux服务器做相应的设置,把端口打开,这样才能让其他的来访问我这个kvm,从而进行操作。

    1、启用tcp的端口。修改配置文件

    vi  /etc/sysconfig/libvirtd
    

    然后打开里面的如下内容,把“#”去掉

    LIBVIRTD_CONFIG=/etc/libvirt/libvirtd.conf
    LIBVIRTD_ARGS="--listen"
    

    然后再下面的文件中修改:

    vi /etc/libvirt/libvirtd.conf

    listen_tls = 0
    listen_tcp = 1
    tcp_port = “16509”
    listen_addr = “0.0.0.0”
    auth_tcp = “none”连接测试:
    在window中安装Libvirt,然后打开virsh-launcher.bat

     virsh -c qemu+tcp://192.168.44.146/system

    在这里我们可以看到在之前linux服务器中的虚拟机。
    这里写图片描述

    3、在eclipse中操作kvm
    新建java工程,导入libvirt-0.5.1.jar和jna-3.5.0.jar。
    然后就可以愉快的进行编码操作了:

    public class Test {
        public static void testVM() { 
            try { 
                Connect conn = new Connect("qemu+tcp://192.168.44.146/system"); 
    
                 conn.domainLookupByName("centos-6.8").shutdown();
            //    conn.domainLookupByName("centos-6.6-02").create();
            //   conn.domainLookupByName("centos-6.6").shutdown();
                 // conn.domainLookupByName("centos-6.6-02").create();
    
    
            } catch (LibvirtException e) { 
                e.printStackTrace(); 
            } 
        } 
        public static void main(String[] args) {
            testVM();
        }
        }

    在这里shutdown是可以关机,然后create是开机,而不是我们传统理解上的start。当然你有强迫症的话可以通过修改源码将create方法改为start。

    4、生成xml文件

    public class Test02 {
    
            public static void main(String[] args) {
                Connect conn = null;
                int flags = 0;
                //jdom dom4j
    
                try {
                      conn = new Connect("qemu+tcp://192.168.44.146/system");
    
    
    
    
                     String dumpxml ="<domain type='kvm'> "+
                             " <name>bjsxtvm03</name> "
                        + "  <memory unit='KiB'>1048576</memory>"
                        + " <currentMemory unit='KiB'>1048576</currentMemory>"
                        + " <vcpu placement='static'>1</vcpu>"
                        + " <os>"
                        + "   <type arch='x86_64' machine='rhel6.6.0'>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>"
                        + " <devices>"
                        + "  <emulator>/usr/libexec/qemu-kvm</emulator>"
                        + " <disk type='file' device='disk'>"
                        + "   <driver name='qemu' type='qcow2' cache='none'/>"
                        + "   <source file='/kvmtest/centos-6.6-04.qcow2'/>"
                        + "   <target dev='vda' bus='virtio'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>"
                        + "  </disk>"
                        + "  <disk type='block' device='cdrom'>"
                        + "     <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' model='ich9-ehci1'>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>"
                        + "  </controller>"
                        + "  <controller type='usb' index='0' model='ich9-uhci1'>"
                        + "    <master startport='0'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>"
                        + "  </controller>"
                        + "  <controller type='usb' index='0' model='ich9-uhci2'>"
                        + "    <master startport='2'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>"
                        + "  </controller>"
                        + "  <controller type='usb' index='0' model='ich9-uhci3'>"
                        + "    <master startport='4'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>"
                        + "  </controller>"
                        + "  <controller type='ide' index='0'>"
                        + "   <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>"
                        + "  </controller>"
                        + " <interface type='network'>"
                        + "    <source network='default'/>"
                        + "    <model type='virtio'/>"
                        + "    <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>"
                        + "  </interface>"
                        + "  <serial type='pty'>"
                        + "    <target port='0'/>"
                        + "  </serial>"
                        + "  <console type='pty'>"
                        + "    <target type='serial' port='0'/>"
                        + "  </console>"
                        + "  <input type='tablet' bus='usb'/>"
                        + "  <input type='mouse' bus='ps2'/>"
                        + "  <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>"
                        + "    <listen type='address' address='0.0.0.0'/>"
                        + "  </graphics>"
                        + "  <video>"
                        + "   <model type='cirrus' vram='9216' heads='1'/>"
                        + "   <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>"
                        + " </video>"
                        + " <memballoon model='virtio'>"
                        + "  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>"
                        + " </memballoon>" + "</devices>" + "</domain>"; 
    
                    Domain dm = null;
    
                    Domain dm1 = conn.domainDefineXML(dumpxml);
    
                    dm1.create();//start 
    
                    //Domain dm1 = conn.domainDefineXML(dumpxml); //创建一个域,但不启动
                    //dm1.undefine(); //undefind一个域,如果活动,则不停止
                    /****
                    try{
                        Domain dm1 =conn.domainLookupByName("bjsxtvm03");
                    }
                    catch (LibvirtException e) {
                        System.out.println("libvirt 错误" + e);
                        // TODO: handle exception
                    }
                    if(dm!=null)
                    {
    
                        dm.undefine();
    
                    }
                    ****/
    
                    /********
                    Domain dm2 = conn.domainDefineXML(dumpxml);
                    dm2.undefine();
                    *******/
    
                } catch (LibvirtException e) { //LibvirtException 返回错误详细信息
                    System.out.println("exception caught:" + e);
                    System.out.println("获取的错误;" + e.getError());
                }
    
                System.out.println("Clean exit");
    
            }
    
        }

    这里特别提醒一下,在window中操作kvm可能会遇到各种奇奇怪怪的问题,毕竟版本兼容比较麻烦。强烈建议在centos图形版的eclipse中连接kvm操作。

    总结:虚拟化技术为日后的云平台的架设打好基础,如果对于kvm不理解的话,那么对于openstack的学习还是会有一定的影响。平时需要对学习进行总结,找到知识互通的地方。这样对于云计算整体算是基础的认知。对于kvm在本篇文章中没有介绍到的有网络桥接,增加磁盘配置。

    展开全文
  • 一. 需求内核(rhel6以上): [root@wenmao ~]# uname -r 2.6.32-358.el6.x86_64 [root@wenmao ~]# yum install *qemu* *virt* librbd1-devel -y #记不住软件包名的情况下这样输入 ...qemu-kvm libv
  • 虚拟化KVM

    千次阅读 2018-12-07 16:06:43
    28.1 了解虚拟化 28.2 常见虚拟化软件 28.3 虚拟化架构 28.4 KVM简介 28.5 Centos7上安装KVM 28.6 配置网卡 28.7 创建虚拟机安装CentOS7 28.8 虚拟机管理 28.9 克隆虚拟机 28.10 快照管理 28.11 磁盘格式 ...
  • 虚拟化技术之KVM,搭建KVM(详细)

    万次阅读 多人点赞 2017-10-21 21:24:12
    首先说一下,KVM是基于硬件辅助的开源全虚拟化解决方案 一、KVM(基于内核的虚拟机)【刚开始是一家以色列的公司开发的,后来红帽觉得KVM很有前景,就把KVM收购了】。 二、KVM包含了一个内核加载模块,是一个.ko...
  • Welcometo KVM virtualization - Thorough introduction 参考网址:...由redhat开发,是一中开源、免费的虚拟化技术。岁企业来说,是一种可选的虚拟化解决方案。 硬
  • KVM 虚拟化架构和实现原理

    万次阅读 2016-08-15 08:42:30
    KVM虚拟化架构 devkvm QEMU KVM的虚拟化实现KVM虚拟化架构KVM是嵌入在Linux操作系统标准内核中的一个虚拟化模块,它能够将一个Linux标准内核转换成为一个VMM,嵌有KVM模块的Linux标准内核可以支持通过kvm tools来...
  • KVM和Xen是两大虚拟化技术,KVM和Xen又是免费开源的管理程序,新手站长网分享虚拟化技术KVM和Xen的区别优势对比: KVM和Xen的区别 KVMKVM是轻量级的虚拟化管理程序模块,该模块主要来自Linux内核;KVM虚拟化...
  • Qemu是一套独立的虚拟化解决方案,KVM是另一套虚拟化解决方案,不过因为这个方案实际上只实现了内核中对处理器(Intel VT, AMDSVM)虚拟化特性的支持,换言之,它缺乏设备虚拟化以及相应的用户空间管理虚拟机的工具,...
  • NVIDIA显卡虚拟化vGPU终于支持KVM

    万次阅读 2019-12-02 11:15:23
    (文章来自作者维护的社区微信公众号【虚拟化云计算】) ...2018年5月14日,NVIDIA发布NVIDIA virtual GPU software 6.1 (390.57/391.58),正式增加了对RedHat KVM虚拟化上NVIDIA virtual GPU支持。 软...
  • QEMU 与QEMU-KVM区别

    万次阅读 2014-06-06 19:59:51
    zhuriyuxiao的文章
  • 比较三种虚拟化技术kvm,xen,vmware

    万次阅读 2018-04-05 09:58:44
    目前常用的虚拟机技术主要有KVM、xen、vmware。...KVM的宿主操作系统必须是Linux,支持的客户机操作系统包括Linux、Windows、Solaris和BSD,运行在支持虚拟化扩展的x86和x86_64硬件架构上,cpu支持V...
  • KVM openstack 之间的区别与联系

    万次阅读 2017-05-12 10:00:53
    首先介绍一下虚拟化的类型 1.全虚拟化(Full Virtualization) 全虚拟化也成为原始虚拟化技术,该模型使用虚拟机协调guest操作系统和原始硬件,VMM在guest操作系统和裸硬件之间用于工作协调,一些受保护指令必须由...
  • Hypervisor, KVM, QEMU总结

    万次阅读 2017-12-07 12:39:37
    Hypervisor,KVM, QEMU总结
  • 最近想利用vmware workstation做嵌套虚拟化,配置KVM,然后利用Devstack用于搭建Openstack环境, 整套环境在自己的笔记本上构建,重启笔记本,在BIOS里开启了VT-x,然后在vmware workstation上安装了Ubuntu12.04, ...
  • 虚拟化类型 全虚拟化(Full Virtualization) 全虚拟化也成为原始虚拟化技术,该模型使用虚拟机协调guest操作系统和原始硬件,VMM在guest操作系统和裸硬件之间用于工作协调,一些受保护指令必须由Hypervisor...
  • 了解虚拟化 VMware Workstation就是虚拟化 虚拟化简单讲,就是把一台物理计算机虚拟成多台逻辑计算机,每个逻辑计算机里面可以运行不同的操作系统,相互不受影响,这样就可以充分利用硬件资源 关键词Hypervisor(VMM)...
1 2 3 4 5 ... 20
收藏数 23,768
精华内容 9,507
关键字:

kvm虚拟化