kvm虚拟化

1. 虚拟化介绍


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

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

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

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

  • 全虚拟化
  • 半虚拟化

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

3.1 kvm安装

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

  • 虚拟机要关机设置CPU虚拟化
  • 物理机要在BIOS里开启CPU虚拟化
    kvm虚拟化
    kvm虚拟化
//关闭防火墙和selinux
[[email protected] ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[[email protected] ~]# systemctl stop firewalld
[[email protected] ~]# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config
[[email protected] ~]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 


[[email protected] ~]# reboot
[[email protected] ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[[email protected] ~]# getenforce 
Disabled

//配置网络源
[r[email protected] ~]# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1572  100  1572    0     0   1578      0 --:--:-- --:--:-- --:--:--  1578
[[email protected] ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[[email protected] ~]# yum -y install epel-release vim wget net-tools unzip zip gcc gcc-c++

//验证CPU是否支持KVM;如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的
[[email protected] ~]# egrep -o 'vmx|svm' /proc/cpuinfo 
vmx

//kvm安装
[[email protected] ~]# 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网卡
[[email protected] ~]# cd /etc/sysconfig/network-scripts/
[[email protected] network-scripts]# ls
ifcfg-ens33  ifdown-ipv6    ifdown-TeamPort  ifup-ippp   ifup-routes       network-functions
ifcfg-lo     ifdown-isdn    ifdown-tunnel    ifup-ipv6   ifup-sit          network-functions-ipv6
ifdown       ifdown-post    ifup             ifup-isdn   ifup-Team
ifdown-bnep  ifdown-ppp     ifup-aliases     ifup-plip   ifup-TeamPort
ifdown-eth   ifdown-routes  ifup-bnep        ifup-plusb  ifup-tunnel
ifdown-ib    ifdown-sit     ifup-eth         ifup-post   ifup-wireless
ifdown-ippp  ifdown-Team    ifup-ib          ifup-ppp    init.ipv6-global
[[email protected] network-scripts]# cp ifcfg-ens33 ifcfg-br0
[[email protected] network-scripts]# vim ifcfg-br0
[[email protected] network-scripts]# cat ifcfg-br0 
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
NM_CONTROLLED=no
ONBOOT=yes
IPADDR=192.168.26.80
NETMASK=255.255.255.0
GATEWAY=192.168.26.2
DNS1=114.114.114.114
[[email protected] network-scripts]# vim ifcfg-ens33 

//重启网络
[[email protected] ~]# systemctl restart network
[[email protected] ~]# 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:c9:94:ad brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:fec9:94ad/64 scope link 
       valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether 00:0c:29:c9:94:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.26.80/24 brd 192.168.26.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec9:94ad/64 scope link 
       valid_lft forever preferred_lft forever

//启动服务
[[email protected] ~]# systemctl start libvirtd
[[email protected] ~]# systemctl enable libvirtd

//验证安装结果
[[email protected] ~]# lsmod | grep kvm
kvm_intel             170086  0 
kvm                   566340  1 kvm_intel
irqbypass              13503  1 kvm

//测试并验证安装结果
[[email protected] ~]# virsh -c qemu:///system list
 Id    名称                         状态
----------------------------------------------------

[[email protected] ~]# virsh -v
4.5.0
[[email protected] ~]# virt-install --version
1.5.0
[[email protected] ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
[[email protected] ~]# ll /usr/bin/qemu-kvm
lrwxrwxrwx 1 root root 21 3月  11 14:28 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm

//查看网桥信息
[[email protected] ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29c994ad	no		ens33
virbr0		8000.525400c120a3	yes		virbr0-nic

3.2 kvm web管理界面安装

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

//安装依赖包
[[email protected] ~]# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx python-devel

//升级pip
[[email protected] ~]# pip install --upgrade pip
Collecting pip
  Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl (1.4MB)
    100% |████████████████████████████████| 1.4MB 129kB/s 
Installing collected packages: pip
  Found existing installation: pip 8.1.2
    Uninstalling pip-8.1.2:
      Successfully uninstalled pip-8.1.2
Successfully installed pip-19.0.3

//从github上下载webvirtmgr代码
[[email protected] ~]# cd /usr/src/
[[email protected] 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 5614
接收对象中: 100% (5614/5614), 2.98 MiB | 398.00 KiB/s, done.
处理 delta 中: 100% (3602/3602), done.

//安装webvirtmgr
[[email protected] src]# cd webvirtmgr/
[[email protected] 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.
Collecting django==1.5.5 (from -r requirements.txt (line 1))
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out. (read timeout=15)",)': /packages/38/49/93511c5d3367b6b21fc2995a0e53399721afc15e4cd6eb57be879ae13ad4/Django-1.5.5.tar.gz
  Downloading https://files.pythonhosted.org/packages/38/49/93511c5d3367b6b21fc2995a0e53399721afc15e4cd6eb57be879ae13ad4/Django-1.5.5.tar.gz (8.1MB)
    100% |████████████████████████████████| 8.1MB 119kB/s 
Collecting gunicorn==19.5.0 (from -r requirements.txt (line 2))
  Downloading https://files.pythonhosted.org/packages/f9/4e/f4076a1a57fc1e75edc0828db365cfa9005f9f6b4a51b489ae39a91eb4be/gunicorn-19.5.0-py2.py3-none-any.whl (113kB)
    100% |████████████████████████████████| 122kB 159kB/s 
Collecting lockfile>=0.9 (from -r requirements.txt (line 5))
  Downloading https://files.pythonhosted.org/packages/c8/22/9460e311f340cb62d26a38c419b1381b8593b0bb6b5d1f056938b086d362/lockfile-0.12.2-py2.py3-none-any.whl
Installing collected packages: django, gunicorn, lockfile
  Running setup.py install for django ... done
Successfully installed django-1.5.5 gunicorn-19.5.0 lockfile-0.12.2

//检查sqlite3是否安装
[[email protected] 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()

//初始化帐号信息
[[email protected] 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: [email protected]		//设置超级管理员邮箱
Password: 		//设置超级管理员密码
Password (again): 			//再次输入超级管理员密码
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)

//拷贝web网页至指定目录
[[email protected] webvirtmgr]# cp -r webvirtmgr /usr/share/nginx/html/
[[email protected] webvirtmgr]# chown -R nginx.nginx /usr/share/nginx/html/webvirtmgr/

//生成**
[[email protected] ~]# ssh-****** -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:5QMi/nKBbzK29+YwEqdkK1yptWbPlp2xs++J9P65WvI [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|    . . . .      |
|   . + . +       |
|    X o S o      |
| . * O ..  .     |
|  + % Bo.+. .    |
|   = @++*o = .   |
|    .oo+=*BoE.   |
+----[SHA256]-----+

//由于这里webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,那么这个是它的ip
[[email protected] ~]# ssh-copy-id 192.168.26.80
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.26.80 (192.168.26.80)' can't be established.
ECDSA key fingerprint is SHA256:eU9X9hRerspV1bhyHQzXWo1CXBcv7zP/CBSG1iUAano.
ECDSA key fingerprint is MD5:51:4f:fb:23:4b:09:2f:e7:16:2e:b8:b6:30:6c:78:e1.
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
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.26.80'"
and check to make sure that only the key(s) you wanted were added.

//配置端口转发
[[email protected] ~]# ssh 192.168.26.80 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 8000
bind: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 6080
Could not request local forwarding.
Last login: Mon Mar 11 16:05:33 2019 from 192.168.26.1
[[email protected] ~]# 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:6010                                                 *:*                  
LISTEN     0      128                              127.0.0.1:6011                                                 *:*                  
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:6010                                                :::*                  
LISTEN     0      128                                    ::1:6011                                                :::*                  
LISTEN     0      128                                    ::1:6080                                                :::*                  
LISTEN     0      128                                    ::1:8000                                                :::*         

//配置nginx

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
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;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
        # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        server_name  localhost;
#        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        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 {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers HIGH:!aNULL:!MD5;
#        ssl_prefer_server_ciphers on;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        error_page 404 /404.html;
#            location = /40x.html {
#        }
#
#        error_page 500 502 503 504 /50x.html;
#            location = /50x.html {
#        }
#    }

}

[[email protected] ~]# 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 /usr/share/nginx/html/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端口
[[email protected] ~]# vim /usr/share/nginx/html/webvirtmgr/conf/gunicorn.conf.py 
#       Must be a positive integer. Generally set in the 64-2048
#       range.
#

bind = '0.0.0.0:8000'
backlog = 2048

#
# Worker processes
     
//重启nginx
[[email protected] ~]# systemctl restart nginx
[[email protected] ~]# 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:6010                                                 *:*                  
LISTEN     0      128                              127.0.0.1:6011                                                 *:*                  
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:6010                                                :::*                  
LISTEN     0      128                                    ::1:6011                                                :::*                  
LISTEN     0      128                                    ::1:6080                                                :::*                  
LISTEN     0      128                                    ::1:8000                                                :::*                  

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

[program:webvirtmgr-console]
command=/usr/bin/python2 /usr/share/nginx/html/webvirtmgr/console/webvirtmgr-console
directory=/usr/share/nginx/html/webvirtmgr
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/webvirtmgr-console.log
redirect_stderr=true
user=nginx

//启动supervisor并设置开机自启
[[email protected] ~]# systemctl start supervisord
[[email protected] ~]# systemctl enable supervisord
Created symlink from /etc/systemd/system/multi-user.target.wants/supervisord.service to /usr/lib/systemd/system/supervisord.service.
[[email protected] ~]# 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-11 16:30:02 CST; 19s ago
 Main PID: 21119 (supervisord)
   CGroup: /system.slice/supervisord.service
           ├─21119 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
           └─21158 /usr/bin/python2 /usr/share/nginx/html/webvirtmgr/manage.py run_gunicorn -c /usr/share/nginx/html/webvirtmgr/conf/gunicorn.co...

3月 11 16:30:02 zml systemd[1]: Starting Process Monitoring and Control Daemon...
3月 11 16:30:02 zml systemd[1]: Started Process Monitoring and Control Daemon.
[[email protected] ~]# 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:6010                                                      *:*                  
LISTEN      0      128                                   127.0.0.1:6011                                                      *:*                  
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:6010                                                     :::*                  
LISTEN      0      128                                         ::1:6011                                                     :::*                  
LISTEN      0      128                                         ::1:6080                                                     :::*                  
LISTEN      0      128                                         ::1:8000                                                     :::*          

//配置nginx用户
[[email protected] ~]# cd /home/
[[email protected] home]# mkdir nginx
[[email protected] home]# chown -R nginx.nginx nginx/
[[email protected] home]# chmod -R 700 nginx/
[[email protected] home]# su - nginx -s /bin/bash        
-bash-4.2$ ssh-****** -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:9UOeSQneDb1D9XCb3sbf/94NHvj/c76VizRkwh4pd0k [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|          . ....o|
|         . o +oo+|
|          o =E.+.|
|         ..=oo=..|
|        S. **= o+|
|          + *o .+|
|           ..oo.+|
|            .oo+B|
|             .o*/|
+----[SHA256]-----+
-bash-4.2$ 
-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 [email protected]
/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.26.80' (ECDSA) to the list of known hosts.
[email protected]'s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.
-bash-4.2$ exit
登出

[[email protected] ~]# vim /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
[[email protected] ~]# cat /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

[[email protected] ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
[[email protected] ~]# systemctl restart nginx
[[email protected] ~]# systemctl restart libvirtd

3.3 kvm web界面管理

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

3.3.1 kvm连接管理

创建SSH连接:
kvm虚拟化

3.3.2 kvm存储管理

创建存储:
kvm虚拟化
kvm虚拟化
进入存储:
kvm虚拟化
kvm虚拟化
通过远程连接软件上传ISO镜像文件至存储目录/var/lib/libvirt/images/

[[email protected] ~]# cd /var/lib/libvirt/images/
[[email protected] images]# ll
总用量 3963904
-rw-r--r-- 1 root root 4059037696 3月  11 18:42 rhel-server-7.4-x86_64-dvd.iso

在 web 界面查看ISO镜像是否存在
kvm虚拟化
创建系统安装镜像
kvm虚拟化
添加成功如下图所示
kvm虚拟化

3.3.3 kvm网络管理

添加桥接网络
kvm虚拟化
kvm虚拟化
kvm虚拟化

3.3.4 实例管理

实例(虚拟机)创建
kvm虚拟化
kvm虚拟化
kvm虚拟化
虚拟机插入光盘
kvm虚拟化
kvm虚拟化
设置在 web 上访问虚拟机的密码
kvm虚拟化
启动虚拟机
kvm虚拟化
kvm虚拟化
虚拟机安装
kvm虚拟化