kvm虚拟化
虚拟化介绍
虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 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。
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 命令行工具
常用的虚拟化产品及特点
常用的有VMware(VMware workstation(适合单台计算机使用)、VMware vsphere(VMware esxi )、VMware Fusion(Mac)) , Oracle VM VirtualBox,Xenserver;还有Microsoft Hyper-V、KVM、华为Fusion Sphere等。
特点:
目前的虚拟化应用种类繁多,如VMvare,XenServer已经较为成熟;同时,目前的虚拟化应用支持多种操作系统,有些软件专注于服务器虚拟化,如VMware ESXi,有些则侧重桌面虚拟化,如XenServer ,VMvare WorkStation,但目前大多数厂商都开始推进开发桌面虚拟化市场;虚拟化应用与虚拟化技术正与当今时代下的云计算紧密结合,提供更加灵活、自助服务式的IT基础架构。
软件特点:
VMware ESXi:侧重于服务器虚拟化,技术较成熟,功能也多,支持虚机系统多;
Xenserver重点在于桌面虚拟化,性价比高,网络性能好,适用于快速与大规模部署,支持系统也相对较多;
Hype-V 微软开发,起步相对较晚,对于MS的系统较为支持。
Oracle VM VirtualBox 开源,支持的系统种类繁多。
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 [root@kvm ~]# egrep -o 'vmx|svm' /proc/cpuinfo vmx //kvm安装 [root@kvm ~]# yum -y install qemu-kvm qemu-kvm-common qemu-img virt-manager libvirt python3-libvirt 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-ens160 [root@kvm network-scripts]# cp ifcfg-ens160 ifcfg-br0 [root@kvm network-scripts]# vim ifcfg-br0 TYPE=Bridge DEVICE=br0 BOOTPROTO=static NAME=br0 ONBOOT=yes IPADDR=192.168.30.131 PREFIX=24 GATEWAY=192.168.30.254 DNS1=114.114.114.114 [root@vmx network-scripts]# vim ifcfg-ens160 TYPE=Ethernet BOOTPROTO=static ONBOOT=yes NAME=ens160 DEVICE=ens160 BRIDGE=br0 //重启网络 [root@kvm ~]# systemctl restart NetworkManager 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether 00:0c:29:f9:ec:35 brd ff:ff:ff:ff:ff:ff 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:04:c5:dd 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 fq_codel master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:04:c5:dd brd ff:ff:ff:ff:ff:ff 5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:0c:29:f9:ec:35 brd ff:ff:ff:ff:ff:ff inet 192.168.30.131/24 brd 192.168.30.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fef9:ec35/64 scope link valid_lft forever preferred_lft forever //启动服务 [root@kvm ~]# systemctl start libvirtd //验证安装结果 [root@kvm ~]# lsmod|grep kvm kvm_intel 294912 0 kvm 786432 1 kvm_intel irqbypass 16384 1 kvm //测试并验证安装结果 [root@kvm ~]# virsh -c qemu:///system list Id Name State -------------------- [root@kvm ~]# virsh --version 6.0.0 [root@kvm ~]# virt-install --version 2.2.1 [root@kvm ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm [root@kvm ~]# ll /usr/bin/qemu-kvm lrwxrwxrwx. 1 root root 21 May 19 16:49 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm //查看网桥信息 [root@kvm ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29f9ec35 no ens160 virbr0 8000.52540004c5dd yes virbr0-nic
kvm web管理界面安装
kvm 的 web 管理界面是由 webvirtmgr 程序提供的。
//安装依赖包 [root@kvm ~]# yum -y install python2-pip python3-libvirt python3-libxml2 nginx python3-websocket-client python36-devel supervisor //升级pip [root@kvm ~]# pip3 install --upgrade pip //拉取webvirtmgr [root@kvm src]# git clone git://github.com/retspen/webvirtmgr.git [root@kvm src]# cd webvirtmgr //安装webvirmgr [root@kvm webvirtmgr]# pip install -r requirements.txt //查看sqlite3是否安装 [root@kvm webvirtmgr]# python2 Python 2.7.17 (default, Aug 31 2020, 21:02:14) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sqlite3 >>> exit() //初始化账号信息 [root@kvm webvirtmgr]# python2 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: 1@2.com #管理员邮箱 Password: #密码123456 Password (again): #再次输入 Superuser created successfully. Installing custom SQL ... Installing indexes ... Installed 6 object(s) from 1 fixture(s) [root@kvm webvirtmgr]# mkdir -p /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 webvirtmgr]# ssh-keygen -t rsa [root@kvm webvirtmgr]# ssh-copy-id 192.168.30.131 //配置端口转发 [root@kvm webvirtmgr]# ssh 192.168.30.131 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60 //nginx配置 [root@kvm ~]# vim /etc/nginx/nginx.conf ... include /etc/nginx/conf.d/*.conf; server { listen 80; server_name localhost; # 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 { } } ... //配置webvirmgr [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; } } //确保绑定8000端口 [root@kvm ~]# vim /var/www/webvirtmgr/conf/gunicorn.conf.py ... bind = '0.0.0.0:8000' backlog = 2048 ... //重启nginx [root@kvm ~]# systemctl restart nginx [root@kvm ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 32 192.168.122.1:53 0.0.0.0:* LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 127.0.0.1:6080 0.0.0.0:* LISTEN 0 128 127.0.0.1:8000 0.0.0.0:* LISTEN 0 128 0.0.0.0:111 0.0.0.0:* LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 [::]:22 [::]:* LISTEN 0 128 [::1]:6080 [::]:* LISTEN 0 128 [::1]:8000 [::]:* LISTEN 0 128 [::]:111 [::]:* //设置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 [root@kvm ~]# systemctl enable --now supervisord.service Created symlink /etc/systemd/system/multi-user.target.wants/supervisord.service → /usr/lib/systemd/system/supervisord.service. //nginx用户配置 [nginx@kvm ~]$ 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:fSvmF+whZ3g8CWFYidPNaGPkrzt2aPOENc+VTzQYo7s nginx@kvm The key's randomart image is: +---[RSA 3072]----+ | *o= o | | +.X + + | | =.+ . ..| | .... .o| | S .*=. .o| | o=%= o.| | =Eo+o .| | o*++ | | oo*. | +----[SHA256]-----+ [nginx@kvm ~]$ vim ~/.ssh/config StrictHostKeyChecking=no UserKnownHostsFile=/dev/null [nginx@kvm ~]$ chmod 0600 ~/.ssh/config [nginx@kvm ~]$ ssh-copy-id root@192.168.30.131 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/var/lib/nginx/.ssh/id_rsa.pub" /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 Warning: Permanently added '192.168.94.132' (ECDSA) to the list of known hosts. root@192.168.30.131's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.30.131'" and check to make sure that only the key(s) you wanted were added. [nginx@kvm ~]$ exit 注销 [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
KVM Web界面管理
通过ip地址在浏览器上访问kvm,例如我这里就是:http://192.168.100.5
此处的超级管理员用户、密码是初始化帐号信息的时候设置的
KVM连接管理
创建SSH连接:
kvm存储管理
创建存储:
通过远程连接软件上传ISO镜像文件至存储目录/kvmdata
在 web 界面查看ISO镜像是否存在
创建系统安装镜像
添加成功如下图所示
kvm网络管理
添加桥接网络
实例管理
实例(虚拟机)创建
虚拟机插入光盘
设置在 web 上访问虚拟机的密码
启动虚拟机
虚拟机安装






















浙公网安备 33010602011771号