文章目录
KVM虚拟化
1. 虚拟化介绍
虚拟化是一种计算技术,通过在物理基础设施上创建虚拟的资源层,将一个物理资源(如服务器、存储设备或网络)划分为多个虚拟资源实例,使每个实例都具有独立的操作系统和应用程序环境。虚拟化可以应用于计算、存储、网络和应用等不同层面。
在虚拟化环境中,虚拟机(VM)是最常见的实例,它是一个运行在虚拟化层之上的独立操作系统和应用程序的容器。虚拟机可以在同一台物理服务器上同时运行多个,并且彼此之间相互隔离,就像独立的物理服务器一样。虚拟化技术可以通过虚拟机监控器(Hypervisor)来实现,它是一种软件或硬件层,负责管理和分配物理资源给虚拟机。
虚拟化的主要优势包括:
- 资源利用率提高:通过共享物理资源,虚拟化可以提高服务器、存储和网络设备的利用率,减少资源浪费。
- 灵活性和可扩展性:虚拟化环境可以根据需求动态分配和调整资源,实现弹性扩展,提高系统的灵活性和可扩展性。
- 硬件抽象化:虚拟化将操作系统和应用程序与底层物理硬件隔离,提供了硬件的抽象化层,使应用程序能够独立于底层硬件进行部署和运行,简化了应用程序的开发和维护过程,从而提高应用程序的可移植性和兼容性。
- 快速部署和恢复:通过虚拟化,可以快速创建和部署虚拟机或容器,减少了应用程序的上线时间。同时,由于虚拟化环境可以进行快速备份和恢复,可以提高数据的可靠性和容灾能力。
- 管理和维护简化:虚拟化提供了集中式的管理工具,可以对虚拟机或容器进行集中管理,简化了系统管理和维护的工作量。管理员可以通过管理工具对虚拟机或容器进行监控、配置和故障排除。
- 成本节约:虚拟化可以减少物理服务器的数量,降低硬件设备的购买和维护成本。同时,通过提高资源利用率和简化管理,还可以节约能源消耗和人力资源成本。
根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:
- 全虚拟化
- 半虚拟化
全虚拟化:
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型
半虚拟化:
物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型
2. kvm介绍
KVM(Kernel-based Virtual Machine)是一种开源的虚拟化解决方案,它是基于Linux内核的虚拟化模块。
它的主要功能:
- 虚拟化技术:KVM利用Linux内核的虚拟化扩展(Intel VT或AMD-V)来实现硬件虚拟化,允许在单个物理主机上同时运行多个虚拟机。
- 性能:KVM通过直接访问物理硬件来实现高性能的虚拟化,因为虚拟机可以直接在主机硬件上运行,而无需通过额外的虚拟化层。
- 资源管理:KVM提供了强大的资源管理功能,可以分配和监控虚拟机的CPU、内存、存储和网络资源,以满足不同虚拟机的需求。
- 安全性:KVM使用硬件辅助的虚拟化技术,可以提供更好的隔离性和安全性,确保虚拟机之间的相互隔离,防止恶意软件的传播。
- 兼容性:KVM兼容多种操作系统,包括Linux、Windows和其他常见的操作系统,可以在同一主机上同时运行不同类型的虚拟机。
- 管理接口:KVM提供了多种管理接口,包括命令行工具(如virsh)、图形化管理工具(如virt-manager)和Web界面管理工具(如oVirt和Kimchi),方便用户管理和配置虚拟环境。
3. kvm部署
主机名 | ip | 系统版本 | kvm版本 |
---|---|---|---|
kiwi123 | 192.168.234.123 | CentOS-8 | 6.0.0 |
部署之前要确保CPU的虚拟化功能已经开启
3.1 部署kvm
如果kvm主机与kvmweb管理主机是两台不同的主机。则,下面操作在kvm主机上做
//关闭防火墙以及selinux
[root@kiwi123 ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@kiwi123 ~]# setenforce 0
[root@kiwi123 ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@kiwi123 ~]#
//验证cpu是否支持KVM,如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的
[root@kiwi123 ~]# egrep -o 'vmx|svm' /proc/cpuinfo
vmx
vmx
vmx
vmx
[root@kiwi123 ~]#
//安装kvm
[root@kiwi123 ~]# yum install -y qemu-kvm qemu-img virt-manager libvirt libvirt-python3 libvirt-client virt-install virt-viewer bridge-utils libguestfs-tools
//将kvm的服务器网卡设置为桥接模式
[root@kiwi123 ~]# cd /etc/sysconfig/network-scripts/
[root@kiwi123 network-scripts]# ls
ifcfg-ens160
[root@kiwi123 network-scripts]# cp ifcfg-ens160 ifcfg-br0
[root@kiwi123 network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.234.123
NETMASK=255.255.255.0
GATEWAY=192.168.234.2
DNS1=8.8.8.8
[root@kiwi123 network-scripts]# vim ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=static
NAME=ens160
BRIDGE=br0
DEVICE=ens160
ONBOOT=yes
//重启网络服务
[root@kiwi123 ~]# systemctl restart NetworkManager
//可以看到已经有br0了
[root@kiwi123 ~]# ip a
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 mq state UP group default qlen 1000
link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute ens160
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe44:e420/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 0e:24:e6:ba:d5:5d brd ff:ff:ff:ff:ff:ff
inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute br0
valid_lft forever preferred_lft forever
[root@kiwi123 ~]#
// 重启网卡
[root@kiwi123 ~]# yum install -y network-scripts
[root@kiwi123 ~]# ifdown ens160;ifup ens160、
//再[root@kiwi123 ~]# ip a
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 mq master br0 state UP group default qlen 1000
link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
altname enp3s0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe44:e420/64 scope link
valid_lft forever preferred_lft forever次查看
[root@kiwi123 ~]# ip a
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 mq master br0 state UP group default qlen 1000
link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
altname enp3s0
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 00:0c:29:44:e4:20 brd ff:ff:ff:ff:ff:ff
inet 192.168.234.123/24 brd 192.168.234.255 scope global noprefixroute br0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe44:e420/64 scope link
valid_lft forever preferred_lft forever
## 可以看见已经成功桥接
//启动服务
[root@kiwi123 ~]# systemctl enable --now libvirtd
[root@kiwi123 ~]#
//验证安装结果,如果有模块表示安装成功
[root@kiwi123 ~]# lsmod|grep kvm
kvm_intel 344064 0
kvm 962560 1 kvm_intel
irqbypass 16384 1 kvm
[root@kiwi123 ~]# virsh --version
6.0.0
[root@kiwi123 ~]# virt-install --version
2.2.1
[root@kiwi123 ~]#
//做软连接
[root@kiwi123 ~]# ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm
[root@kiwi123 ~]# which qemu-kvm
/usr/bin/qemu-kvm
[root@kiwi123 ~]#
//查看网桥信息
[root@kiwi123 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c2944e420 no ens160
virbr0 8000.525400cf230f yes virbr0-nic
3.1 安装kvm web管理界面
kvm 的 web 管理界面是由 webvirtmgr 程序提供的,可以在github搜索webvirtmgr
如果kvm主机与kvmweb管理主机是两台不同的主机。则,下面操作在kvm web管理主机上做
//安装依赖环境,python2
[root@kiwi123 ~]# yum install -y git python2-pip supervisor nginx python2-devel
[root@kiwi123 ~]# yum install -y http://mirror.ghettoforge.org/distributions/gf/el/8/plus/x86_64/python2-libxml2-2.9.7-12.1.gf.el8.x86_64.rpm
[root@kiwi123 ~]# yum install -y http://mirror.centos.org/centos/7/os/x86_64/Packages/libvirt-python-4.5.0-1.el7.x86_64.rpm
[root@kiwi123 ~]# yum install -y https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/p/python-websockify-0.6.0-5.el7.noarch.rpm
//获取web界面管理程序
[root@kiwi123 ~]# git clone https://github.com/retspen/webvirtmgr.git
[root@kiwi123 ~]# ls
anaconda-ks.cfg webvirtmgr
[root@kiwi123 ~]#
//安装webvirtmgr
[root@kiwi123 webvirtmgr]# pip2 install -r requirements.txt
//检查sqlite3是否安装
[root@kiwi123 ~]# python2
Python 2.7.18 (default, Aug 25 2021, 15:50:49)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3 ## 如果有则这里没有报错信息
>>> exit ()
[root@kiwi123 ~]#
//初始化帐号信息
[root@kiwi123 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'): admin //指定超级管理员账号用户名,默认留空为root
Email address: kiwi@123.com
Password:
Password (again):
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)
[root@kiwi123 webvirtmgr]#
//复制web到指定目录
[root@kiwi123 ~]# mkdir /var/www
[root@kiwi123 ~]# cp -a webvirtmgr/ /var/www/
[root@kiwi123 ~]# chown -R nginx.nginx /var/www/webvirtmgr/
//生成密钥做免密登录
[root@kiwi123 ~]# ssh-keygen -t rsa
## 由于这里webvirtmgr和kvm服务部署在同一台机器,所以这里本地信任。如果kvm部署在其他机器,换成别的机器ip
[root@kiwi123 ~]# ssh-copy-id 192.168.234.123
//端口转发
## 注意这里有个ssh连接上去了,这里是ssh到kvm主机上做端口转发,端口转发不用在web上做
[root@kiwi123 ~]# ssh 192.168.234.123 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:60
Last login: Wed Oct 11 04:17:06 2023 from 192.168.234.123
[root@kiwi123 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
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 [::]:111 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::1]:6080 [::]:*
LISTEN 0 128 [::1]:8000 [::]:*
[root@kiwi123 ~]#
//配置nginx
## 先把原配置文件做一个备份
[root@kiwi123 ~]# cp /etc/nginx/nginx.conf /opt/nginx.confbackup
[root@kiwi123 ~]# 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@kiwi123 ~]# vim /etc/nginx/conf.d/webvirtmgr.conf
[root@kiwi123 ~]# cat /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;
}
}
[root@kiwi123 ~]# vim /var/www/webvirtmgr/conf/gunicorn.conf.py
bind = '0.0.0.0:8000'
backlog = 2048
//重启nginx
[root@kiwi123 ~]# systemctl restart nginx
[root@kiwi123 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@kiwi123 ~]# ss -antl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
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 [::]:111 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::1]:6080 [::]:*
LISTEN 0 128 [::1]:8000 [::]:*
//设置supervisor
[root@kiwi123 ~]# 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@kiwi123 ~]# systemctl enable --now supervisord
Created symlink /etc/systemd/system/multi-user.target.wants/supervisord.service → /usr/lib/systemd/system/supervisord.service.
[root@kiwi123 ~]# systemctl restart supervisord
[root@kiwi123 ~]#
//配置nginx用户。设置免密登录
[root@kiwi123 ~]# su - nginx -s /bin/bash
[nginx@kiwi123 ~]$ ssh-keygen -t rsa
[nginx@kiwi123 ~]$ touch ~/.ssh/config && echo -e "StrictHostKeyChecking=no\nUserKnownHostsFile=/dev/null" >> ~/.ssh/config
[nginx@kiwi123 ~]$ chmod 0600 ~/.ssh/config
[nginx@kiwi123 ~]$ ssh-copy-id root@192.168.234.123
[nginx@kiwi123 ~]$ ssh root@192.168.234.123
Warning: Permanently added '192.168.234.123' (ECDSA) to the list of known hosts.
Last login: Wed Oct 11 04:18:24 2023 from 192.168.234.123
[root@kiwi123 ~]# 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@kiwi123 ~]# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
//重启服务
[root@kiwi123 ~]# systemctl restart nginx
[root@kiwi123 ~]# systemctl restart libvirtd
3.2 去web页面进行管理
访问192.168.234.123即可
//如果出现以下报错,并且web页面显示为502,重启系统可以解决
[root@kiwi123 ~]# channel 1016: open failed: connect failed: Device or resource busy
channel 1017: open failed: connect failed: Device or resource busy
channel 1017: open failed: connect failed: Device or resource busy
····································
3.2.1 KVM连接管理
添加
点击这里
3.2.2 KVM存储管理
通过远程连接上传ISO镜像文件到存储目录/var/lib/libvirt/images
//在kvm主机上上传
[root@kiwi123 ~]# cd /var/lib/libvirt/images/
[root@kiwi123 images]# ls
rhel-9.2-x86_64-dvd.iso
[root@kiwi123 images]#
## 成功上传
在web界面查看镜像
创建系统安装镜像
添加成功
3.2.3 KVM网络管理
添加桥接网络
3.2.4 实例管理
实例(虚拟机)创建
设置在web上访问虚拟机的密码
启动虚拟机
开始安装系统,后面省略安装步骤
安装成功
用shell连接看能不能用
## 这台虚拟的ip地址为192.168.234.77/24
[root@localhost ~]# ip a
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: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:f5:29:d7 brd ff:ff:ff:ff:ff:ff
inet 192.168.234.77/24 brd 192.168.234.255 scope global noprefixroute ens3
valid_lft forever preferred_lft forever
inet6 fe80::4701:96d0:b5a5:f173/64 scope link noprefixroute
valid_lft forever preferred_lft forever
[root@localhost ~]# ping -c4 www.baidu.com
PING www.a.shifen.com (14.119.104.254) 56(84) bytes of data.
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=1 ttl=128 time=29.1 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=2 ttl=128 time=47.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=3 ttl=128 time=41.7 ms
64 bytes from 14.119.104.254 (14.119.104.254): icmp_seq=4 ttl=128 time=34.5 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 7ms
rtt min/avg/max/mdev = 29.115/38.236/47.676/7.041 ms
[root@localhost ~]#
## 可以用