2019-03-14 20:17:24 weixin_43695104 阅读数 8993

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
2016-12-20 19:17:33 nirendao 阅读数 775

第7章 Linux发行版中的KVM

7.1 RHEL 和 Fedora 中的 KVM

CentOS项目收集了Redhat公司为了遵循各种软件许可证(如GNU GPL)而必须公开的关于RHEL的发行版的绝大部分源代码,然后将这些源代码重新编译后发布了自己的CentOS操作系统。一般来说,RHEL发布后的几个月内,CentOS就会发布与之对应的CentOS系统。
由于CentOS是完全免费和开源的Linux发行版,且CentOS包含了RHEL绝大部分的源代码,能获得与RHEL差不多的功能和性能,因此对于不想花钱买Red Hat许可证又想用RHEL系统的部分用户来说,CentOS是一个不错的选择。

RHEL中的KVM

在安装RHEL 6.3系统的过程中,在安装时选择“Virtualization Host”即可将该系统安装为KVM虚拟化宿主机。否则,就要自己手动用yum或rpm工具安装所需的RPM软件包。

在RHEL6.3系统中,与KVM虚拟化相关的RPM包括如下几个:
kernel-xxx.x86_64
qemu-kvm-xxx.x86_64
qemu-img-xxx.x86_64
libvirt-xxx.x86_64
libvirt-client-xxx.x86_64
libvirt-python-xxx.x86_64
virt-manager-xxx.x86_64
virt-viewer.x86_64

查看RHEL 6.3系统的内核配置文件(一般为/boot/config-2.6.32*),会发现它已经将KVM虚拟化配置到内核中了,具体配置可以参考3.3.2节的“配置KVM”中的介绍。用户空间的虚拟化工具qemu-kvm是由qemu-kvm软件包提供的,一般为/usr/libexec/qemu-kvm可执行程序。
尽管本书前面章节都是用自己编译的qemu-sytem-x86_64这个程序来使用KVM,但RHEL6.3中的qemu-kvm命令行工具的参数与qemu-system-x86_64的参数是几乎完全一样的。

Fedora中的KVM

Fedora 17中与KVM虚拟化相关的软件包比RHEL中的更多一些,更多的部分如下:
qemu-system-x86-xxx.x86_64
qemu-common-xxx.x86_64
libvirt-daemon-xxx.x86_64
virt-manager-common-xxx.fc17.noarch

SLES 和 openSUSE 中的KVM

SLES中的KVM

SLES(SUSE Linux Enterprise Server)是有Attachmate集团开发的一个企业级的Linux发行版,主要用于服务器、工作站等领域。不过也可以在桌面PC上使用SLES。SLES的大版本大约3-4年发布一次,小版本(也称“服务包”,service pack)大约18个月发布一次。

SLES中的libvirt、virt-manager、virt-viewer等工具与RHEL中的也非常类似。

openSUSE中的KVM

openSUSE与SLES的关系,就是Fedora与RHEL的关系。SLES是需要购买许可证才能使用的商业化企业级的Linux系统,而openSUSE是由社区开发和维护的完全免费和开源的项目。

Ubuntu中的KVM

Ubuntu是一个基于Debian发行版的免费和开源的Linux操作系统。Ubuntu系统的开发是由Ubuntu基金会组织一些大公司的工程师和许多个人开发者共同完成的,其背后领导Ubuntu开发的公司是一家总部位于英国伦敦的叫做Canonical的软件公司。
由于Ubuntu的自由和开发性及功能的易用性,Ubuntu是目前在台式机和笔记本上最流行的桌面级Linux发行版。Ubuntu也发布了其Server版本用于服务器领域,而且在云计算领域也有Ubuntu的一些应用。

Ubuntu基金会每6个月发布一次新版本,即每年的4月和10月。
Ubuntu每隔2年发布一次长期支持版(LTS,long-term support),对于目前的LTS版本提供支持的时间为5年。

在Ubuntu上,可以使用apt-get命令来安装KVM相关的软件包:
sudo apt-get install qemu-kvmlibvirt-bin bridge-utils
sudo apt-get install ubuntu-vm-builder
sudo apt-get install virt-managervirtinst

小结

在各个Linux发行版中的qemu-kvm工具的名称和命令参数,除了版本差异带来的少量不同之处,它们的使用方法都与前面几章中自己编译使用的qemu-system-x86_64命令行工具相同。在Linux发行版中,使用libvirt、virtsh和virt-manager等工具来管理KVM,这与第6章中介绍的使用方法完全类似。

2018-06-27 11:10:39 gjjumin 阅读数 570

环境要求:

rhel5.4 64位系统以上版本才支持。

KVM 2.6.20以上,CPU支持虚拟化指令集(Intel-VT | AMD-V)

物理主机BIOS上设置CPU支持虚拟化、虚拟机设置中勾选Intel VT-x或AMD-V/RVI(V)

一、安装RHEL6/7或CENTOS6/7 ,英文最小化安装,配置好yum源,关闭iptables和selinux;

二、安装必要的软件:

   安装kvm模块:

      #yum install qemu-kvm.x86_64

   安装kvm调试工具:

      #yum install qemu-kvm-tools.x86_64

   安装python组件,主要用来记录创建vm时的xml文件:

      #yum install python-virtinst.noarch

   安装qemu组件,使用qemu命令来创建磁盘,启动虚拟机时用到:

      #yum install qemu-img.x86_64

   安装网络支持工具:

       #yum install bridge-utils.x86_64

   安装虚拟机管理工具,使用virsh或者virt-manager来管理虚拟机

      #yum install libvirt virt-manager

三、安装以上软件之后,重新启动,检查kvm模块是否安装完成:

      #lsmod | grep kvm 会显示两个模块:

      kvm_intel/kvm_amd

      kvm

四、检查虚拟化软件的安装情况:

      #virsh list –all

Id Name          State

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

出现以上表名已经安装成功。

五、设置网络bridge模式:

    #cd /etc/sysconfig/network-scripts/

    #vim ifcfg-eth0

     在该文件中新加一行BRIDGE=br0

     新建一个桥接网卡文件:

    #vim ifcfg-br0 内容如下:

    DEVICE=br0

    TYPE=Bridge

    ONBOOT=yes

    BOOTPROTO=static

    NM_CONTROLLED=no

IPADDR=

    NETMASK=

    GATEWAY=

创建好该文件之后关闭NetworkManager服务,重启network服务;

#serviceNetworkManager stop

#service networkrestart  能正常重启表明网络设置成功。

六、创建虚拟机,有两种方法:一是通过virt-manager图形化界面创建;二是通过virt-install命令创建。

A、命令创建如下:

#virt-install–name vmtest1 –ram 4096 –vcpus=2 /

–diskpath=/data_kvm/store/test.img,size=50 ,format=raw,bus=virtio /

--networkbridge=br0,model=virtio –cdrom /data_kvm/iso/rhel-6.7-x86_64.iso /

 --vnc –accelerate –force–autostart

参数含义:

 --name 为虚拟机起个名字;

 --ram  分配给虚拟机的内存,单位MB;

 --vcpus 分配给虚拟机的cpu个数;

 --cdrom 指定安装文件的绝对路径;

 --disk   指定虚拟机img文件路径,如果虚拟机使用lvm分区,这里指向到lvm的分区;

    size  虚拟机文件大小,单位GB;

    bus  虚拟机磁盘使用的总线类型,为了使虚拟机达到好的性能,这里使用virtio;

    cache 虚拟机磁盘的cache类型;

 --network bridge 指定桥接网卡;

    model 网卡模式,这里使用性能更好的virtio;

 --graphics 图形参数;

B、图形化创建如下:

 宿主机上安装vnc-server:

   #yum installtigervnc-server

   #vim ~/.vnc/xstartup 最后一行改为:gnome-session&

   #vim/etc/sysconfig/vncservers  添加一行:VNCSERVERS=”1:root”

   #vncpasswd  设置vnc连接密码;

   #service vncserver start

   #vncserver &

   #service iptables stop

   #setenforce 0

之后在windows客户端打开vnc.exe连接即可在windows客户机上远程打开linux的图形界面。连接时填写IP:1其中IP为linux主机的IP,1表示第一个桌面;

打开宿主机的图形界面之后,打开一个terminal终端,键入命令virt-manager会打开一个虚拟机管理窗口如下:


在这个窗口中可以管理虚拟机也可以创建新的虚拟机。

七、使用KVM命令集管理虚拟机

     7.1、查看命令帮助:

       #virsh –h

    7.2、查看KVM的配置文件存放目录:

       #ls /etc/libvirt/qemu

    7.3、查看虚拟机的状态:

       #virsh list –all

    7.4、虚拟机的开机与关机:

       首先要确认acpid服务安装并运行:

       #service acpid status

       #virsh shutdown centos7.0

       #virsh start centos7.0

    7.5、强制关闭虚拟机的电源:

       #virsh destroy centos7.0

    7.6、通过配置文件启动虚拟机:

       #virsh create /etc/libvirt/qemu/centos7.0.xml

    7.7、挂起虚拟机:

       #virsh suspend centos7.0

    7.8、恢复挂起的虚拟机:

       #virsh resume centos7.0

    7.9、配置虚拟机伴随宿主机自动启动:

       #virsh autostart centos7.0

    7.10、导出虚拟机的配置:

       #virsh dumpxml centos7.0 > /etc/libvirt/qemu/centos7.0.xml

    7.11、修改虚拟机的配置信息:

       #virsh edit centos7.0

       #vim /etc/libvirt/qemu/centos7.0.xml

八、KVM的快照管理

注:

    1.  快照实际上做的是虚拟机的XML配置文件,默认快照XML文件在/var/lib/libvirt/qemu/snapshot/虚拟机名/下;

    2.  快照只支持qcow2磁盘格式的系统。

8.1、虚拟机创建快照

     [root@kvm ~]# virshsnapshot-create vm1

     或创建快照的同时,再创建一个快照别名:

     [root@kvm ~]# virsh snapshot-create-as vm1first_snap

8.2、查看虚拟机历史快照信息

     [root@kvm ~]# virshsnapshot-list vm1

8.3、查看虚拟机磁盘信息

     [root@kvm ~]# qemu-imginfo /vm-images/vm1.img

8.4、查看当前快照信息

     [root@kvm ~]#virshsnapshot-current vm1

8.5、恢复到之前快照

     [root@kvm ~]# virshsnapshot-revert vm1 first-snap

     查看当前快照信息是否恢复成功:

     [root@kvm ~]# virshsnapshot-current vm1  //查看输出的name是不是要恢复的快照name。

8.6、删除指定快照

     [root@kvm ~]#virshsnapshot-delete vm1 first-snap




2018-07-07 19:49:40 longzhizhui926 阅读数 66

虚拟化

virtualization 资源管理

x个物理资源-----> y个逻辑源
类型:
完全虚拟化
部分虚拟化
硬件辅助虚拟化(CPU支持虚拟化指令) //主流 能达到真实cpu90%效率
#lscpu | grep vmx //查看cpu 是否支持虚拟化指令。

创建模板机器

通过yum源,直接手动安装虚拟机系统。
~]#virsh
virsh# list 列出虚拟机
virsh# list --all
virsh#nodeinfo 查看节点信息
virsh# net-list (--all)
virsh# dominfo 虚拟机名称: centos7 //查看虚拟机信息

一台完整的KVM虚拟机组成:
xml 文件:/etc/libvirt/qemu

磁盘镜像文件: /var/lib/libvirt/images/

手动新建虚拟机

创建新的磁盘文件:
# cp /var/lib/libvirt/images/centos7.0.qcow2 /var/lib/libvirt/images/test1.qcow2
创建新的xml文件:
#uuidgen //生成uuid
#cp /etc/libvirt/qemu/centos7.0.xml /etc/libvirt/qemu/test1.xml
#vim /etc/libvirt/qemu/test1.xml
修改虚拟机名字 、删除uuid那行、修改i磁盘文件路径、删除mac地址行。
#virsh define /etc/libvirt/qemu/test1.xml //导入虚拟机
#virsh list --all
#virsh start test1
#virsh list --all
#virsh console 虚拟机名
退出 'ctrl'+']'

补充:
grubby --update-kernel=ALL --args="console=ttyS0"

reboot
2019-12-23 08:51:31 weixin_45409343 阅读数 1

KVM虚拟机:

1.KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM已成为学术界的主流VMM之一

2.KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization

虚拟化发展过程:

IDC数据中心设备租用 → 提出虚拟化方案,出现OpenVZ → 共享优化出现Xen,提出半虚架构,但是操作复杂 → 进入全虚KVM,不需要和内核接触,只需要安装管理工具

案例概述

1.公司部分Linux服务器利用率不高,为充分利用这些Linux服务器,可以部署KVM,在物理机上运行多个业务系统
2.例如在运行Nginx的服务器.上部署KVM,然后在虚拟机上运行Tomcat

案例前置知识点

KVM虚拟化架构

KVM模块直接整合在Linux内核中

在这里插入图片描述

KVM组成:

在这里插入图片描述

KVM Driver:

1.虚拟机创建
2.虚拟机内存分配
3.虚拟CPU寄存器读写
4.虚拟CPU运行

QEMU (经过简化与修改):

1.模拟PC硬件的用户控件组件
2.提供I/O设备模型及访问外设的途径

KVM虚拟化三种模式:

1.客户模式(虚拟机)
2.用户模式(工具)
3.内核模式

在这里插入图片描述

KVM工作原理:

在这里插入图片描述

Demo:

环境准备:

1.需要先添加一块磁盘:大小为20G

2.处理器的设置:虚拟化引擎的选项全部勾

在这里插入图片描述

[root@client ~]# cd /dev
[root@client dev]# ls
sda   sda1   sda2    sda3   sda4   sda5   sdb 
#此时有sdb硬盘

[root@client dev]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xba1e8e30 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n		  #输入n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p		#输入p
分区号 (1-4,默认 1):
起始 扇区 (2048-41943039,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039):
将使用默认值 41943039
分区 1 已设置为 Linux 类型,大小设为 20 GiB
命令(输入 m 获取帮助):w		 #输入w保存退出
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。

[root@client dev]# mkfs /dev/sdb1		#格式化
mke2fs 1.42.9 (28-Dec-2013)
文件系统标签=
OS type: Linux
块大小=4096 (log=2)
分块大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1310720 inodes, 5242624 blocks
262131 blocks (5.00%) reserved for the super user
第一个数据块=0
Maximum filesystem blocks=4294967296
160 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000
Allocating group tables: 完成
正在写入inode表: 完成
Writing superblocks and filesystem accounting information: 完成

[root@client dev]# mkdir /data		#创建挂载
[root@client dev]# mount /dev/sdb1 /data/
[root@client data]# df -hT
文件系统       类型      容量  已用  可用 已用% 挂载点
/dev/sdb1      ext2       20G   44M   19G    1% /data
#此时显示已经挂载

#电脑中有CentOS 7镜像文件的文件夹需要进行共享,设置账户Everyone可以进行读取,然后使用smbclient -L查看挂载
[root@client data]# smbclient -L //192.168.10.190/
Enter SAMBA\root's password:
OS=[Windows 10 Home China 18363] Server=[Windows 10 Home China 6.3]

        Sharename       Type      Comment
        ---------       ----      -------
        database        Disk
        F$              Disk      默认共享
        gfs             Disk
        IPC$            IPC       远程 IPC
        ISO             Disk
        rpm             Disk
#此时显示ISO文件夹被共享

[root@client data]# mount.cifs //192.168.10.190/ISO /mnt
Password for root@//192.168.10.190/ISO:
[root@client data]# df -h
文件系统              容量  已用  可用 已用% 挂载点
/dev/sdb1              20G   44M   19G    1% /data
//192.168.10.190/ISO  226G  173G   54G   77% /mnt
#此时显示文件成功挂载在mnt目录下
[root@client data]# cd /mnt/
[root@client mnt]# ls
CentOS-7-x86_64-DVD-1708.iso

安装KVM:

[root@client mnt]# yum list			#进行自检
[root@client mnt]# yum groupinstall "GNOME Desktop" -y		#桌面环境
[root@client mnt]# yum install qemu-kvm -y		#KVM模块
[root@client mnt]# yum install qemu-kvm-tools -y		#KVM调试工具
[root@client mnt]# yum install virt-install -y		#构建虚拟机的命令工具
[root@client mnt]# yum install qemu-img -y		#qemu组件,创建磁盘,启动虚拟机
[root@client mnt]# yum install bridge-utils -y		#网络支持工具
[root@client mnt]# yum install libvirt -y		#虚拟机管理工具
[root@client mnt]# yum install virt-manager -y		#图像化管理虚拟机
[root@client mnt]# egrep '(vmx|svm)' /proc/cpuinfo		#查看是否支持虚拟化

[root@client mnt]# lsmod | grep kvm		#检查KVM是否安装
kvm_intel             170086  0
kvm                   566340  1 kvm_intel
irqbypass              13503  1 kvm

[root@client mnt]# systemctl start libvirtd
[root@client mnt]# systemctl enable libvirtd		#开机自启动

配置桥接实例:

[root@client mnt]# cd /data/
[root@client data]# mkdir vdisk viso
[root@client data]# ls
lost+found  vdisk  viso
[root@client data]# cp -r /mnt/CentOS-7-x86_64-DVD-1708.iso /data/viso/
[root@client data]# ls viso/
CentOS-7-x86_64-DVD-1708.iso
[root@client data]# cd /etc/sysconfig/network-scripts/
[root@client network-scripts]# cp -p ifcfg-ens33 ifcfg-br0
[root@client network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.18.145  netmask 255.255.255.0  broadcast 192.168.18.255
        inet6 fe80::6a0c:e6a0:7978:3543  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a4:cb:c7  txqueuelen 1000  (Ethernet)
        RX packets 6559352  bytes 9624037086 (8.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 364406  bytes 30690747 (29.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
......此处省略多行
[root@client network-scripts]# vim ifcfg-ens33
#在末行按o转下行插入
BRIDGE=br0
#插入完成后按Esc退出插入模式,输入:wq保存退出
[root@client network-scripts]# vim ifcfg-br0
TYPE="bridge"				#Ethernet改为bridge
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"			#dhcp改为static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="br0"					#ens33改为br0
DEVICE="br0"				#ens33改为br0
ONBOOT="yes"
IPADDR=192.168.18.145		#输入ens33的IP地址
NETMASK=255.255.255.0		#输入子网掩码
GATEWAY=192.168.18.1		#输入网关
#修改退出插入模式,输入:wq保存退出
[root@client network-scripts]# service network restart		#重启网络服务
Restarting network (via systemctl):                        [  确定  ]

[root@client network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.18.145  netmask 255.255.255.0  broadcast 192.168.18.255
        inet6 fe80::e169:c641:eeea:50f7  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a4:cb:c7  txqueuelen 1000  (Ethernet)
        RX packets 20  bytes 1298 (1.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35  bytes 4588 (4.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:a4:cb:c7  txqueuelen 1000  (Ethernet)
        RX packets 6559967  bytes 9624087097 (8.9 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 364793  bytes 30733147 (29.3 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
......以下省略多行
#桥接之后原来ens33的网卡IP到br0上了

回到图形化界面输入:

[root@client ~]# virt-manager 

此时会跳出虚拟系统管理器界面,我们需要添加存储池

自定义池名称后点击浏览目录,选择目录为/data/vdisk,查找到我们挂载CentOS7的文件夹目录,点击完成

然后点击添加新卷

添加镜像存储池:iso,点击前进,选择路径为/data/viso

在这里插入图片描述

创建完毕后可以点击左上角的文件 → 关闭

在虚拟系统管理器左上角文件选择新建虚拟机

安装操作系统为本地安装,点击前进

在这里插入图片描述

使用ISO镜像:点击浏览,选择iso存储池,找到镜像,点击选择卷

在这里插入图片描述

再点击前进,内存输入2048,再点击前进

在这里插入图片描述

选择或创建自定义存储,点击管理,选择disk存储池,点击之前的卷,点击选择卷

在这里插入图片描述

再点击前进,再点击完成,此时会进入Centos7的安装界面:

在这里插入图片描述

此时KVM虚拟化部署试验成功!

KVM虚拟化技术

阅读数 331

没有更多推荐了,返回首页