KVM详解-WEB管理界面及安装win2016

2023-11-15

文章目录


KVM的简介

KVM简介

KVM(用于基于内核的虚拟机)是用于 x86 硬件上的 Linux 的完整虚拟化解决方案,包含虚拟化扩展(Intel VT 或 AMD-V)。它由一个可加载的内核模块 kvm.ko 和一个处理器特定模块 kvm-intel.ko 或 kvm-amd.ko 组成,该模块提供核心虚拟化基础设施。

使用 KVM,可以运行多个运行未修改的 Linux 或 Windows 映像的虚拟机。每个虚拟机都有私有的虚拟化硬件:网卡、磁盘、图形适配器等。

KVM 是开源软件。从 2.6.20 开始,KVM 的内核组件包含在主线 Linux 中。从 1.3 开始,KVM 的用户空间组件包含在主线 QEMU 中。

1.KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。
2.是x86架构且硬件支持虚拟化技术的Linux全虚拟化解决方案。
3.它包含一个为处理器提供底层虚拟化,可加载的核心模块kvm.ko。
4.kvm还需要一个经过修改的QEMU软件,作为虚拟机上层控制和界面。
5.kvm能在不改变Linux或Windows镜像的情况下同时运行多个虚拟机(即多个虚拟机使用同一镜像),并为每个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器等),同时kvm还能够使用KSM技术帮助宿主服务器节约内存。

2 关于virtual machine manager的介绍

红帽的virtual machine manager是一个虚拟机管理员,可以让用户管理多个虚拟机。
基于内核的虚拟机libvirt和virtual machine manager。

virtual machine manager可以让用户:

1.创建、编辑、引导或停止虚拟机
2.查看并控制每个虚拟机的控制台
3.查看每个虚拟机的性能以及使用率
4.查看每个正在运行中的虚拟机以及主控制端的即时性能及使用率信息
5.不论是在本机或远程,皆可使用kvm、Xen、QEMU

二、安装及环境的部署

1.安装时系统要求

Host system requirements
 • One core or thread for each virtualized CPU and one for the host.2 GB of RAM, plus additional RAM for virtual machines.6 GB disk space for the host, plus the required disk space for the virtual machine(s). 
 KVM hypervisor requirements # lscpu
Virtualization: VT-x 
# egrep 'svm|vmx' /proc/cpuinfo 
Intel CPU: VT-x 
AMD CPU: AMD -V 
BIOS Enable Virtualization

2、嵌套虚拟化
先用虚拟机,然后再在虚拟机里使用虚拟化,这就是嵌套虚拟化。
VMware 嵌套虚拟化
产品:Workstation、player、ESXi
支持:ESXi、Hyper-V、KVM、Xen

3.安装KVM虚拟化软件

在VM虚拟机配置时 处理器这边要选上虚拟化

在这里插入图片描述
在这里插入图片描述
开启虚拟机,开始安装过程。
在这里插入图片描述
centOS 7最小化安装

kvm部署

部署前请确保你的CPU虚拟化功能已开启。分为两种情况:
虚拟机要关机设置CPU虚拟化
物理机要在BIOS里开启CPU虚拟化

安装KVM前,还需要具备相应的条件:
验证CPU是否支持KVM;如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU的支持的

# egrep -o 'vmx|svm' /proc/cpuinfo
	vmx
	vmx
	vmx
	vmx
# lsmod | grep kvm

在这里插入图片描述

关闭防火墙与selinux

# systemctl stop firewalld
# systemctl disable firewalld
	Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
	Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
# setenforce 0
# sed -ri 's/^(SELINUX=).*/\1disabled/g' /etc/selinux/config

配置网络源

\\最小化安装可能网络还没启用,先用nmtui启用网络
# nmcli device status
# nmtui 

# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo
# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
# yum -y install epel-release vim wget net-tools unzip zip gcc gcc-c++ lrzsz

kvm安装

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

其中:
libvirt #虚拟机管理
virt #虚拟机安装克隆
qemu-kvm #管理虚拟机磁盘

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

这里网卡是ens33,所以用br0来桥接ens33网卡

//新建br0
# vim /etc/sysconfig/network-scripts/ifcfg-br0 
TYPE=Bridge
DEVICE=br0
NM_CONTROLLED=no
BOOTPROTO=static
NAME=br0
ONBOOT=yes
IPADDR=192.168.118.128
NETMASK=255.255.255.0
GATEWAY=192.168.118.2
DNS1=8.8.8.8

# vim /etc/sysconfig/network-scripts/ifcfg-ens33 
\\注释掉IPv4和IPv6、UUID等
TYPE=Ethernet
##PROXY_METHOD=none
##BROWSER_ONLY=no
BOOTPROTO=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=ens33
##UUID=c32fb339-09d4-4f69-b6f4-cb78dd1c819e
DEVICE=ens33
ONBOOT=yes

\\新增
BRIDGE=br0
NM_CONTROLLED=no
# systemctl restart network
# ip addr
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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:ab:f5:e4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:feab:f5e4/64 scope link 
       valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:ab:f5:e4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.118.128/24 brd 192.168.118.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feab:f5e4/64 scope link 
       valid_lft forever preferred_lft forever

启动服务

# systemctl start libvirtd
# systemctl enable libvirtd

验证安装结果

# lsmod | grep kvm
kvm_intel             188740  0 
kvm                   637289  1 kvm_intel
irqbypass              13503  1 kvm

测试并验证安装结果

# virsh --version
4.5.0
# virt-install --version
1.5.0
# ln -s /usr/libexec/qemu-kvm  /usr/bin/qemu-kvm         //映射文件到bin下
# ll /usr/bin/qemu-kvm
lrwxrwxrwx 1 root root 21 531 15:09 /usr/bin/qemu-kvm -> /usr/libexec/qemu-kvm

查看网桥信息

# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29abf5e4	no		ens33
virbr0		8000.5254000e4000	yes		virbr0-nic

kvm web管理界面-WebVirtMgr安装

kvm 的 web 管理界面是由 webvirtmgr 程序提供的。
安装python需求并设置Django环境

安装依赖包

# yum -y install git python-pip libvirt-python libxml2-python python-websockify supervisor nginx python-devel

//升级pip

# pip install --upgrade pip

从github上下载webvirtmgr代码

注意,Git 经常会有不好连接的情况,可以把地址前的 git 更换成 https 试下

# cd /usr/local/src/
# git clone git://github.com/retspen/webvirtmgr.git
正克隆到 'webvirtmgr'...
fatal: unable to connect to github.com:
github.com[0: 20.205.243.166]: errno=????

# git clone https://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.97 MiB | 520.00 KiB/s, done.
处理 delta 中: 100% (3606/3606), done.

安装webvirtmgr

在这里插入图片描述

# cd webvirtmgr/
# pip install -r requirements.txt 
。。。。
Successfully installed django-1.5.5 gunicorn-19.5.0 lockfile-0.12.2
You are using pip version 8.1.2, however version 22.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

检查sqlite3是否安装
# python
Python 2.7.5 (default, Nov 16 2020, 22:23:17) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3
>>> exit()
初始化帐号信息
# 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: 3683885@qq.com                       //设置超级管理员邮箱
Password:                                           //设置超级管理员密码
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 6 object(s) from 1 fixture(s)

官网上还有一步??先不设置

$ . manage.py collectstatic

设备Nninx

警告:通常 WebVirtMgr 只能从 localhost 的 8000 端口访问。此步骤将使 WebVirtMgr 对端口 80 上的每个人都可用。Web 界面也不受保护(没有 https),这意味着您和服务器之间的每个人(同一wifi、您的本地路由器、您的提供商、服务器提供商、主干网等)可以以明文形式查看您的登录凭据!

相反,您也可以完全跳过此步骤 + 卸载 nginx。只需通过 SSH 将端口 8000 重定向到本地计算机即可。这更安全,因为 WebVirtMgr 不再对公众开放,您只能通过加密连接访问它。

拷贝web网页至指定目录
# mkdir /var/www
# cp -r /usr/local/src/webvirtmgr/ /var/www
# chown -R nginx:nginx /var/www/webvirtmgr/
生成密钥
# 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:mQheT6e4vc/QPifjnhgxKsNCnl/j2DiZHC/nyakMcTg root@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|    . . . .      |
|   o o = =       |
|  E o o S        |
| o *.  + +       |
|  =.+== + .      |
|   =*Xo+ B+..    |
|    **B o+B=     |
+----[SHA256]-----+

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

# ssh-copy-id 192.168.118.128
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.118.128 (192.168.118.128)' can't be established.
ECDSA key fingerprint is SHA256:dc2pPFqmpCMJLPEWQe23RN/YafBWsDQXcDcd2JJ+4xs.
ECDSA key fingerprint is MD5:05:77:0b:d1:a0:fa:32:25:3c:c2:fa:8c:a8:bd:33:1b.
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.118.128's password: 

Number of key(s) added: 1

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

端口转发

例子:
$ ssh user@server:port -L localhost:8000:localhost:8000 -L localhost:6080:localhost:6080

# ssh 192.168.118.128 -L localhost:8000:localhost:8000 -L localhost:6080:localhost:6080
Last login: Tue May 31 11:04:35 2022 from 192.168.118.1

# ss -antl
State      Recv-Q Send-Q                 Local Address:Port                                Peer Address:Port              
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                             [::]:22                                          [::]:*                  
LISTEN     0      100                            [::1]:25                                          [::]:*                  
LISTEN     0      128                            [::1]:6080                                        [::]:*                  
LISTEN     0      128                            [::1]:8000                                        [::]:* 
配置nginx
# vim /etc/nginx/nginx.conf
对server部分进行修改
--------------
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
------------
改成
----------
    server {
        listen       80;
##        listen       [::]:80;
        server_name localhost;
##        root      /usr/share/nginx/html;
        location / {
	            root html;
	            index index.html index.htm;
	        }

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
------------
改成
----------
#    server {
#        listen       80 default_server;
#        server_name  localhost;
#        root         /usr/share/nginx/html;
#
#        #charset koi8-r;
#
#        #access_log  /var/log/nginx/host.access.log  main;
#
#        # Load configuration files for the default server block.
#        include /etc/nginx/default.d/*.conf;
#
#        location / {
#        }
#
#        # redirect server error pages to the static page /40x.html
#        #
#        error_page  404              /404.html;
#        location = /40x.html {
#        }
#
#        # redirect server error pages to the static page /50x.html
#        #
#        error_page   500 502 503 504  /50x.html;
#        location = /50x.html {
#        }
#    }

在/etc/nginx/conf.d中添加文件 webvirtmgr.conf

# 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; # or /srv instead of /var
        expires max;
    }
//官网上这段不能要,不然启动后,界面显示不正常
#    location ~ .*\.(js|css)$ {
#           proxy_pass http://127.0.0.1:8000;
#    }

    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 $scheme;
        proxy_connect_timeout 600;
        proxy_read_timeout 600;
        proxy_send_timeout 600;
        client_max_body_size 1024M; # Set higher depending on your needs 
    }
}

确保bind绑定的是本机的8000端口
基本不用改动

# vim /var/www/webvirtmgr/conf/gunicorn.conf.py
	.....
	bind = '127.0.0.1:8000'     //确保此处绑定的是本机的8000端口,这个在nginx配置中定义了,被代理的端口
	backlog = 2048
	.....

重启nginx

# systemctl restart nginx
# ss -antl
State      Recv-Q Send-Q                 Local Address:Port                                Peer Address:Port              
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                             [::]:22                                          [::]:*                  
LISTEN     0      100                            [::1]:25                                          [::]:*                  
LISTEN     0      128                            [::1]:6080                                        [::]:*                  
LISTEN     0      128                            [::1]:8000                                        [::]:*  

更新 SELinux 政策使其成为永久服务

# /usr/sbin/setsebool httpd_can_network_connect true 
# chkconfig supervisord on

设置supervisor

vim /etc/supervisord.conf
在文件最后加上以下内容

[program:webvirtmgr]
command=/usr/bin/python /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/python /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并设置开机自动启动

# systemctl start supervisord
# systemctl enable supervisord
# systemctl status supervisord

# ss -antl
State      Recv-Q Send-Q                 Local Address:Port                                Peer Address:Port              
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                             [::]:22                                          [::]:*                  
LISTEN     0      100                            [::1]:25                                          [::]:*                  
LISTEN     0      128                            [::1]:6080                                        [::]:*                  
LISTEN     0      128                            [::1]:8000                                        [::]:*     

配置nginx用户

//未创建nginx用户,所以用su命令赋予它交互式登录的权限
[root@localhost ~]# 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:z3yKKKZStQL+SBKUe4nKVBIaJEuAu/y5OC1Lrnh8Cto nginx@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|B+o              |
|=* .             |
|+.= .            |
|++ o.            |
|*+.. .  S        |
|+=o .    +       |
|++=..     + .    |
|**+=+  . . o     |
|=*E*... . .      |
+----[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.118.128
/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.118.128' (ECDSA) to the list of known hosts.
root@192.168.118.128's password: 

Number of key(s) added: 1

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

-bash-4.2$ exit
登出



[root@localhost ~]# 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
# chown -R root.root /etc/polkit-1/localauthority/50-local.d/50-libvirt-remote-access.pkla
# systemctl restart nginx
# systemctl restart libvirtd

systemctl stop nginx
systemctl stop libvirtd

systemctl status nginx
报错 : accept() failed (24: Too many open files)

使用nginx作为web服务,访问的时候报错

解决办法:

永久生效方法:
修改/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

 这样,问题就迎刃而解了!

KVM WEB界面管理

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

在这里插入图片描述
此处的用户为:root
密码为:执行python manage syncdb时设置的超级管理员密码
在这里插入图片描述
此处的Label要与下面的FQDN / IP一致!

在这里插入图片描述

kvm存储管理

创建存储
在这里插入图片描述
在这里插入图片描述

先创建ISO镜像系统的存储池

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

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

在这里插入图片描述
添加一个100G的磁盘,分区后挂截/data
在这里插入图片描述
在这里插入图片描述

如要删除可以在状态这边选停掉再删
在这里插入图片描述

池路径 /var/lib/libvirt/images:磁盘镜像ISO文件存储的位置
可以通过远程连接软件上传ISO镜像文件至存储目录/var/lib/libvirt/images/
可以用 SecureCRT中的 SFTP传输方式
上传后

[root@localhost webvirtmgr]# cd /var/lib/libvirt/images/
[root@localhost images]# ll
总用量 4167040
-rw-r--r-- 1 root root 4267048960 78 2011 ASUS_WIN7_SP1_9in1.iso
# chmod -R 777  /var/lib/libvirt/images/
# ll
总用量 4167040
-rwxrwxrwx 1 root root 4267048960 78 2011 ASUS_WIN7_SP1_9in1.iso

注意:这个目录和镜像的权限都要是777,没改就没法克隆
再看看WEB界面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

添加镜像

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

kvm网络管理

在这里插入图片描述

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

实例管理----创建虚机

在这里插入图片描述
在这里插入图片描述
这两个进都是一样界面
在这里插入图片描述
在这里插入图片描述
虚似机 接入ISO 光盘
在这里插入图片描述
设置在Web上访问 虚拟机的密码
在这里插入图片描述
在这里插入图片描述

启动虚拟机

在这里插入图片描述

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

故障: 无法显示启动界面
解决方法:是安装novnc并通过novnc_server启动一个vnc
在这里插入图片描述
安装好noVNC后,添加到系统启动时运行:

[root@localhost ~]# ll /etc/rc.local 
lrwxrwxrwx. 1 root root 13 531 17:16 /etc/rc.local -> rc.d/rc.local
//这里可以看到是2个链接的文件,随便改一个就可以
[root@localhost ~]# vim /etc/rc.local
//最后面添加如下信息
/root/utils/novnc_proxy --vnc localhost:5901

--------
安装noVNC

安装依赖软件包

# yum install -y epel*
# yum install -y git
# yum install -y tigervnc-server

使用前请确认关闭防火墙了

setenforce 0
systemctl stop firewalld
systemctl disable firewalld
启动服务,新建一个VNC链接:
# vncserver :1
或

You will require a password to access your desktops.需要密码才能访问桌面。

Password:
Verify:
Would you like to enter a view-only password (y/n)? y
Password:
Verify:

New 'localhost.localdomain:1 (root)' desktop is localhost.localdomain:1

Creating default startup script /root/.vnc/xstartup
Creating default config /root/.vnc/config
Starting applications specified in /root/.vnc/xstartup
Log file is /root/.vnc/localhost.localdomain:1.log

或 vncserver :n
这里的n就是sessionnumber,不指定的话默认为1,第一次启动时会提示输入密码,以后也可以使用vncpasswd命令修改密码。VNC的默认端口号是5900,而远程桌面连接端口号则是5900+n。如果使用“vncserver :1”命令启动VNC Server,那么端口应该是5901。
查看vncserver的配置文件:

# rpm -qc tigervnc-server
/etc/sysconfig/vncservers
# vi /etc/sysconfig/vncservers
安装noVNC
git clone git://github.com/kanaka/noVNC
//这里同样的,git下载不了就换成https

创建安全连接(一路回车下去…)

# cd ./noVNC/utils/

# openssl req -new -x509 -days 365 -nodes -out self.pem -keyout self.pem
Generating a 2048 bit RSA private key
.............................+++
.......................................+++
writing new private key to 'self.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:
# ls
。。。。  self.pem 

注: VNC的默认会话不是安全的,需要创建一个安全的VNC连接。创建完毕的证书 self.pem 需要放置到 noVNC/utils 目录下,当启动 noVNC 时,websockify将自动装载证书。

运行noVNC

在noVNC目录下,执行

./utils/novnc_proxy --vnc localhost:5901

注意: noVNC会有版本更新,有可能到时就不是这个文件启动,如果不对,请查看官网信息

有连接后查看VNC连接:

# vncserver -list

TigerVNC server sessions:

X DISPLAY #	PROCESS ID
:1		2163

//如果想要删除连接,使用:
vncserver -kill :n

再次回到KVM管理界面,启动镜像

在这里插入图片描述
可以看到正常启动了
在这里插入图片描述
安装过程这里略过

在这里插入图片描述

克隆虚机

在这里插入图片描述
或者:
在这里插入图片描述


注意: 克隆是对存储池的存储卷-镜像做克隆,还要在实例那边新建实例并把存储卷指向刚克隆的镜像才可以使用。
Web界面没法跨存储池克隆,要在命令行下复制过去。

虚机磁盘扩容-新增磁盘

先在存储区新建一个镜像做磁盘
在这里插入图片描述
在这里插入图片描述
对虚机的xml文件的disk域添加如下代码:

//场景:新增一块磁盘

找到这部分:
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>                          //添加改行代码找到新增磁盘格式
      <source file='/var/lib/libvirt/images/centos7-1.img'/>      //指定新增磁盘路径
      <target dev='vda' bus='virtio'/>                            //指定磁盘设备名称,新增的不能和前面的相同
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> //传输总线-插槽位不能和其他相同
    </disk>
    ------新增下面的
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/centos7-1-02.img'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

在这里插入图片描述

启动虚机,然后在虚机系统内部对磁盘进行格式化,分区等操作

创建虚机快照

这里不支持运行状态创建快照,有点不实用。
To take a snapshot, shutdown the instance.要获取快照,请关闭实例。
在这里插入图片描述
如果虚机出现问题,就可以用快照进行恢复了
在这里插入图片描述

创建Win2016 实例

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

virtio-win驱动

由于KVM管理虚拟机的硬盘和网卡需要virtio驱动,linux系统默认支持virtio驱动,所以安装linux系统虚拟机的时候只需要加载iso镜像即可。

但是windows系统默认不支持virtio驱动,需要另外下载virtio驱动,在安装windowss虚拟机过程中,需要选择virtio驱动路径,继而加载驱动,最后才可以识别到驱动

# wget https://fedorapeople.org/groups/virt/virtio-win/virtio-win.repo -O /etc/yum.repos.d/virtio-win.repo

# yum install virtio-win -y

# rpm -ql virtio-win | grep iso      //查看virtio-win提供的驱动
/usr/share/virtio-win/virtio-win-0.1.217.iso
/usr/share/virtio-win/virtio-win.iso

这个装完后,存储池会多出一个如下:
在这里插入图片描述
安装完后,在虚拟机2016的设置-XML里面添加如下内容,添加一个光驱,指定virtio-win驱动位置

    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw'/>
      <source file='/usr/share/virtio-win/virtio-win-0.1.217.iso'/>
      <target dev='hdb' bus='ide'/>
      <readonly/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>

注意:unit 取值原来的那个要不一样,不是0就是1
在这里插入图片描述
启动后到选硬盘时
在这里插入图片描述
在这里插入图片描述
后面就是分区格式化安装…

安装网卡驱动,进系统后 打开设备管理 器
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

命令行管理KVM

一、虚拟机的存储池

默认位置
kvm默认存储池的位置 : /var/lib/libvirt/images/

定义存储池

使用 virsh pool-define-as 命令创建持久性存储池。

# mkdir -p /vm-pool/

# virsh pool-define-as --name centos-pool --type dir --target "/vm-pool/"

使用 virsh pool-list --all 命令列出所有现有的存储池。

# virsh pool-list --all
 名称               状态     自动开始
-------------------------------------------
 centos-pool               不活跃  否       
 Data                 活动     是       
 default              活动     否       
 iso                  活动     是 
启动存储池
# virsh pool-autostart centos-pool
池 centos-poo1 标记为自动启动

# virsh pool-list --all
 名称               状态     自动开始
-------------------------------------------
 centos-pool          活跃     是       
 Data                 活动     是       
 default              活动     否       
 iso                  活动     是

打开自动启动(可选)
默认情况下,virsh 使用自定义的存储池未设置为每次 libvirtd 启动时自动启动。
可以使用 virsh pool-autostart 命令将存储池配置为自动启动。


使用 virsh pool-create-as 命令创建临时性存储池。

临时性的不可以打开自动启动

# mkdir -p /vm-pool/centos7/vm2
# virsh pool-create-as --name centos7-pool2 --type dir --target "/vm-pool/centos7/vm2/"
创建池 centos7-pool-2
# virsh pool-list
 名称               状态     自动开始
-------------------------------------------
 centos7-pool2         活动     否       
 default              活动     是 
删除存储池
# virsh pool-destroy centos7-poo2
销毁池 centos7-poo2

更多的存储池、存储卷操作
# virsh --help | grep pool
    allocpages                     Manipulate pages pool size
 Storage Pool (help keyword 'pool')
    find-storage-pool-sources-as   找到潜在存储池源
    find-storage-pool-sources      发现潜在存储池源
    pool-autostart                 自动启动某个池
    pool-build                     建立池
    pool-create-as                 从一组变量中创建一个池
    pool-create                    从一个 XML 文件中创建一个池
    pool-define-as                 在一组变量中定义池
    pool-define                    定义非活动持久性存储池或从XML文件修改现有的持久性存储池
    pool-delete                    删除池
    pool-destroy                   销毁(删除)池
    pool-dumpxml                   XML 中的池信息
    pool-edit                      为存储池编辑 XML 配置
    pool-info                      存储池信息
    pool-list                      列出池
    pool-name                      将池 UUID 转换为池名称
    pool-refresh                   刷新池
    pool-start                     启动一个(以前定义的)非活跃的池
    pool-undefine                  取消定义一个不活跃的池
    pool-uuid                      把一个池名称转换为池 UUID
    pool-event                     存储池事件

 Storage Volume (help keyword 'volume')
    vol-clone                      克隆卷。
    vol-create-as                  从一组变量中创建卷
    vol-create                     从一个 XML 文件创建一个卷
    vol-create-from                生成卷,使用另一个卷作为输入。
    vol-delete                     删除卷
    vol-download                   将卷内容下载到文件中
    vol-dumpxml                    XML 中的卷信息
    vol-info                       存储卷信息
    vol-key                        为给定密钥或者路径返回卷密钥
    vol-list                       列出卷
    vol-name                       为给定密钥或者路径返回卷名
    vol-path                       为给定密钥或者路径返回卷路径
    vol-pool                       为给定密钥或者路径返回存储池
    vol-resize                     创新定义卷大小
    vol-upload                     将文件内容上传到卷中
    vol-wipe                       擦除卷

二、虚拟机快照

1 查询

# qemu-img info /home/kvm/virtual-img/vm1.qcow2
 

2 给指定虚拟机创建快照

在这里插入图片描述

//运行状态建个快递照
# virsh snapshot-create-as centos7 --name centos7.snap1
已生成域快照 centos7.snap1

//关机状态建个快递照
# virsh snapshot-create-as centos7 --name centos7.snap2
已生成域快照 centos7.snap2

3 查看快照
# virsh snapshot-list centos7
 名称               生成时间              状态
------------------------------------------------------------
 centos7.snap1        2023-08-05 15:19:52 +0800 running      //命令执行到287
 centos7.snap2        2023-08-05 15:23:33 +0800 shutoff      //命令执行到290

可以看到运行状态和关机状态的快照都有显示出来

4 恢复快照
# virsh snapshot-revert centos7 --snapshotname centos7.snap2

运行中执行了恢复命令,再看界在,显示关机了
在这里插入图片描述
在这里插入图片描述
恢复关机状态的快照很完整,OK

再试试恢复运行状态的快 照

# virsh snapshot-revert centos7 --snapshotname centos7.snap1

运行中再执行了恢复命令,再看界面,显示运行中,但是原来连接是断开了,重启了
检查下命令运行到哪
在这里插入图片描述
运行快照是在命令执行到287个时生成的,现在看来,只是恢复到上次重启的时候,并没有实时快照生成。

# ls /var/lib/libvirt/qemu/snapshot/
centos7  ELK00  ELK01  mysql00  mysql01  mysql02
# ls /var/lib/libvirt/qemu/snapshot/centos7/
centos7.snap1.xml  centos7.snap2.xml
# ll /var/lib/libvirt/qemu/snapshot/centos7/
总用量 12
-rw------- 1 root root 5128 85 15:34 centos7.snap1.xml
-rw------- 1 root root 3436 85 15:34 centos7.snap2.xml

运行中的快照5m多,关机的才3M多,运行的的快照真是照了个寂寞。

5 删除快照
# virsh snapshot-delete centos7 --snapshotname centos7.snap1
已删除域快照 centos7.snap1

在这里插入图片描述

三、虚拟机网络

1 查询虚拟网桥
# brctl show
bridge name	  bridge id		STP enabled	   interfaces
br0		8000.000c29abf5e4	   no		       ens33
virbr0		8000.5254000e4000	yes		       virbr0-nic

libvirt 会依赖 ip_forward 参数, 并添加响应的 iptables(防火墙)规则,允许去往和来自虚拟机的数据。有些程序可能会关闭 ip_forward 参数,因此最好的选择是将以下内容添加到 /etc/sysctl.conf。
net.ipv4.ip_forward = 1

2 查看网络接口信息
# ip addr show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:ab:f5:e4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:feab:f5e4/64 scope link 
       valid_lft forever preferred_lft forever
       
# ip addr

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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 00:0c:29:ab:f5:e4 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::20c:29ff:feab:f5e4/64 scope link 
       valid_lft forever preferred_lft forever
3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:ab:f5:e4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.118.128/24 brd 192.168.118.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feab:f5e4/64 scope link 
       valid_lft forever preferred_lft forever

3设置桥接网络

web界面没建过的话可以建下

# vim /etc/sysconfig/network-scripts/ifcfg-br0
# cat /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT="yes"
BOOTPROTO=static
IPADDR=192.168.118.129   #要和宿主机在一个网络,这里我用的是宿主机的ip
GATEWAY=192.168.118.2    #宿主的网关,nat的是.2,桥接是.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8

安装虚拟机

centos7虚拟机
virt-install \
--name=centos-1 \
--ram 2048 --vcpus=1 \
--disk path=/home/kvmos/images/centos7-1.qcow2,size=20,format=qcow2,bus=virtio \
--location=/home/kvmos/iso/CentOS-7-x86_64-Minimal-1908.iso \
--network bridge=virbr0,model=virtio \
--vnc --vnclisten=0.0.0.0 --vncport=5900,password=123456 \
--autostart \
-d

name 是虚拟机名称
size 是系统盘大小G
bridge是桥接网卡名字
-d是debug输出信息
autostart 开机启动

win7虚拟机
virt-install \
--accelerate \
--name windows7 \
--ram 4096 \
--vcpus=2 \
--controller type=scsi,model=virtio-scsi \
--disk path=/data/win7/windows7.qcow2,size=60,format=qcow2,bus=virtio \
--disk device=cdrom,path=/iso/ASUS_WIN7_SP1_9in1.iso \
--disk device=cdrom,path=/usr/share/virtio-win/virtio-win-0.1.217.iso \
--graphics vnc,listen=0.0.0.0,port=5900,password=123456 --noautoconsole \
--network bridge=br0,model=virtio \
--os-type=windows \
--os-variant=win7 \
--autostart \
-d

驱动加载问题看前面部分.

虚拟机常用操作

虚拟机改固定IP

由于桥接的是默认动态IP的,有时会方便管理 要改固定
vim /etc/sysconfig/network-scripts/ifcfg-eth0

TYPE="Ethernet"
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="eth0"
UUID="a801346b-de37-4154-96a2-de9fc3b125fb"
DEVICE="eth0"
ONBOOT="yes"                 // 开机启用网络配置
//增加以下IP信息
IPADDR=192.168.118.30
NETMASK=255.255.255.0
GATEWAY=192.168.118.2
DNS1=8.8.8.8

//改完重启服务
systemctl restart network

显示虚拟机列表
# virsh list                 //不加--all只能看正在运行的虚拟机
 Id    Name                           State
----------------------------------------------------
 2     centos7-01                     running

 
# virsh list --all           //加上-all查看所有的虚拟机状态
 Id    Name                           State
----------------------------------------------------
 2     centos7-01                     running
 -     centos7                        关闭
 -     centos7-02                     关闭
 -     win2016A                       关闭

开关机、删除
//开机
# virsh start centos7-01
域 centos7-01 已开始

//"温柔"关机
# virsh shutdown centos7-01
域 centos7-01 被关闭

//强制关机
# virsh destroy centos7
域 centos7-02 被删除         //这个显示真是无语,还好实际上只是关机

# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭
 -     centos7-01                     关闭
 -     centos7-02                     关闭
 -     win2016A                       关闭
 - 
//删除虚拟机
# virsh destroy win2016A 
# virsh vol-delete 
查看某个虚拟机对应的VNC端口
[root@kvm01 ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 6     centos7-02                     running
 8     centos7-01                     running

[root@kvm01 ~]# virsh vncdisplay centos7-01
:1

[root@kvm01 ~]# virsh vncdisplay centos7-02
:0

//:0代表5900,如果是:1就代表是5901端口.
重命名
[root@kvm01 ~]# virsh domrename centos7-01 centos7-01A
Domain successfully renamed

[root@kvm01 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     centos7-02                     running
 -     centos7                        关闭
 -     centos7-01A                    关闭
 -     win2016A                       关闭

挂起&恢复
[root@kvm01 ~]# virsh suspend centos7-02
域 centos7-02 被挂起

[root@kvm01 ~]# virsh resume centos7-02
域 centos7-02 被重新恢复
开机启动
[root@kvm01 ~]# virsh autostart centos7-01A
域 centos7-01A标记为自动开始

[root@kvm01 ~]# virsh autostart --disable centos7-01A
域 centos7-01A取消标记为自动开始
完整克隆

//克隆cenots7-01A ,-o后面是旧名字,-n后面是新的虚拟机的名字

# virt-clone --auto-clone -o centos7-01A -n centos7-03
正在分配 'centos7-01-clone.img'                                                                                    |  20 GB  00:00:29     

成功克隆 'centos7-03'
手动克隆
复制虚拟磁盘文件
备份源虚拟机的配置文件,默认在/etc/libvirt/qemu/,另存为 centos-001
修改 centos-001的配置文件
修改name
删除uuid
删除mac
修改虚拟机磁盘路径
导入 centos-001
检查是否正常启动
导出、导入虚拟机

kvm虚拟化与vmware workstation虚拟化有些不同,vmware虚拟出来的虚拟机通常会有多个文件,而kvm的虚拟机只有两个文件:配置文件和磁盘文件,我们怎样才能找到某个虚拟机对应的文件呢?
其实很简单,先列出所有的虚拟机,然后再通过virsh edit 虚拟机名,然后过滤“source file”就会把磁盘的路径过滤出来,而虚拟机的配置文件都会存放在/etc/libvirt/qemu/这个目录里面,以虚拟机名字命名的的.xml文件。实际上virsh edit 虚拟机名打开的就是该虚拟机的配置文件,配置文件里面记录了磁盘文件的路径。通过edit命令打开配置文件有语法检测,直接通过vim打开没有语法检查,如下所示:

# ls /etc/libvirt/qemu
autostart  centos7-01A.xml  centos7-02.xml  centos7-03.xml  centos7.xml  networks  win2016A.xml
//导出备份配置文件
# virsh dumpxml centos7-03 > /data/centos7-03A.xml

# ls /data
centos7-03A.xml 

# virsh undefine centos7-03
域 centos7-03 已经被取消定义

# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     centos7-02                     running
 -     centos7                        关闭
 -     centos7-01A                    关闭
 -     win2016A                       关闭

//导入
# virsh define /data/centos7-03A.xml
定义域 centos7-03(从 /data/centos7-03A.xml)
# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     centos7-02                     running
 -     centos7                        关闭
 -     centos7-01A                    关闭
 -     centos7-03                     关闭
 -     win2016A                       关闭

加硬盘和扩容

在线加硬盘
vda 可以看到就20G

# lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                    11:0    1  4.4G  0 rom  
vda                   252:0    0   20G  0 disk 
├─vda1                252:1    0    1G  0 part /boot
└─vda2                252:2    0   19G  0 part 
  ├─centos_kvm00-root 253:0    0   17G  0 lvm  /
  └─centos_kvm00-swap 253:1    0    2G  0 lvm  [SWAP]
# fdisk -l
。。。。
   设备 Boot      Start         End      Blocks   Id  System
/dev/vda1   *        2048     2099199     1048576   83  Linux
/dev/vda2         2099200    41943039    19921920   8e  Linux LVM

回到物理机

//在指定目录下创建一块硬盘,其实在哪里创建都可以,指定磁盘类型,指定名字,指定大小5G即可。
# qemu-img create -f qcow2 /data/centos7-add01.qcow2 5G
Formatting '/data/centos7-add01.qcow2', fmt=qcow2 size=5368709120 encryption=off cluster_size=65536 lazy_refcounts=off 

//给centos7这台主机增加上这块盘,vdb是指明盘符,--live是在线增加,不加缓存,指定驱动
# virsh attach-disk centos7 /data/centos7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
成功附加磁盘

再到虚拟机查看

# lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                    11:0    1  4.4G  0 rom  
vda                   252:0    0   20G  0 disk 
├─vda1                252:1    0    1G  0 part /boot
└─vda2                252:2    0   19G  0 part 
  ├─centos_kvm00-root 253:0    0   17G  0 lvm  /
  └─centos_kvm00-swap 253:1    0    2G  0 lvm  [SWAP]
vdb                   252:16   0    5G  0 disk 
# fdisk -l    //也可以看到最后面多了一个

web界面新增镜像 格式是.img,再到命令行下加是这样的

# virsh attach-disk ceph00 /data/ceph00-1.img vdb --live --cache=none --subdriver=qcow2
成功附加磁盘
扩容

如果觉得新加的这块硬盘容量还是太小,想要扩容这块盘,就要先卸载这块盘
先在物理机上操作

//卸载新增加的这块硬盘
# virsh detach-disk centos7 vdb
成功分离磁盘
//扩容,加5G,注意,原磁盘不能有快照
# qemu-img resize /data/centos7-add01.qcow2 +5G
Image resized.

//再次添加上
# virsh attach-disk centos7 /data/centos7-add01.qcow2 vdb --live --cache=none --subdriver=qcow2
成功附加磁盘

到虚机上到

# lsblk
NAME                  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0                    11:0    1  4.4G  0 rom  
vda                   252:0    0   20G  0 disk 
├─vda1                252:1    0    1G  0 part /boot
└─vda2                252:2    0   19G  0 part 
  ├─centos_kvm00-root 253:0    0   17G  0 lvm  /
  └─centos_kvm00-swap 253:1    0    2G  0 lvm  [SWAP]
vdb                   252:16   0   10G  0 disk 


注意:一旦在虚拟上使用了这块磁盘,比如已经格式化并且已经在里面创建了文件之后,再加扩容量,再挂载之后,会发现容量还是保持在原来的大小,是因为格式化之后,文件系统已经固定了,新加的空间没有格式化,如果想用的话,就得执行xfs_growfs /dev/vdb,用来更新文件系统,这仅是针对xfs的分区, 新的空间就会被添加上了,如果文件系统是ext系列的话,就得使用resizefs /dev/vdb

KVM热迁移

所谓的热迁移就是在不停机或极短暂(几秒)即可恢复的手段。

我们在做冷迁移时,其实迁移的都是两个文件:配置文件和磁盘文件,但是热迁移时就不只这两个文件,服务器运行中时,内存中还会有数据的,大多数情况下,运行中的服务器也不会随便让停止的。

默认配置文件位置: /etc/libvirt/qemu/
默认磁盘镜像文件位置:/var/lib/libvirt/images/

热迁移操作

要求:
***VM 映像可在源主机和目标主机上访问(位于共享存储上,例如使用 nfs)。—必须条件,不能迁移时才放到NFS上
建议在两台主机上的同一路径上找到图像目录(用于写入时复制图像的迁移——使用“qemu-image create -b … .")
src 和 dst 主机必须在同一个子网上(使用 tap 时保持 guest 的网络)。
不要使用 -snapshot qemu 命令行选项。
对于 tcp:迁移协议
目标上的来宾必须以与源上相同的方式启动。

环境描述:
按理说是需要三台机器的,一台是需要迁移的服务器A,另一台是用来承载的的服务器B,还有一台是nfs用来共享存储的服务器C。但是考虑到我的电脑只有8G的内存,我们可以这样,A服务器“兼职"做NFS.
kvm00 192.168.118.128 目标
kvm01 192.168.118.50 源
nfs 192.168.118.128 共享存储 /data/nfs

准备工作:

两边都得安装kvm,别忘记启动kvm。kvm00要有虚拟机,kvm01上并不要求有虚拟机。
两边都必须是桥接,桥接完成之后别忘记重启网卡。

虚拟机最好是静态地址

安装NFS

kvm00

# yum install nfs-utils
# mkdir -p /data/nfs
# vim /etc/exports 
/data/nfs 192.168.118.0/24(rw,async,no_root_squash,no_all_squash) 
# chown -R nfsnobody.nfsnobody /data/nfs/
# systemctl status nfs

两边都要挂载

[root@kvm01 /]# mkdir /data-mv
[root@kvm01 /]# mount -t nfs 192.168.118.128:/data/nfs /datamv

[root@kvm00 ~]# mkdir /data-mv
[root@kvm00 ~]# mount -t nfs 192.168.118.128:/data/nfs /datamv

\\永久挂载
# vim /etc/fstab
192.168.118.128:/data/nfs        /data-mv       nfs     defaults        0 0  

对两台主机域名都设置下

# vim /etc/hosts
//添加如下
192.168.118.128 kvm00
192.168.118.50  kvm01

SSH免密
正常nfs服务器和两个KVM主机都要

[root@kvm01 ~]# ssh-keygen -t rsa
[root@kvm01 ~]# ssh-copy-id kvm00

新建一个镜像位于NFS上的虚拟机,这是可迁移的前提条件

[root@kvm01 ~]# virt-install --virt-type kvm --os-type=linux --name centos7-05 --memory 1024 --vcpus 1 --cdrom=/iso/CentOS-7-x86_64-DVD-2009.iso --disk /data-mv/centos7-05.img --network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --check disk_size=off

由源主机向 目标主机迁移

[root@kvm01 ~]# virsh migrate --live --verbose centos7-05 qemu+ssh://192.168.118.128/system --unsafe  --persistent 

[root@kvm01 ~]# virsh list
 Id    名称                         状态
----------------------------------------------------

[root@kvm01 ~]# 

-------查看目标主机
[root@kvm00 ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 1     centos7-05                     running

[root@kvm00 ~]# ls /etc/libvirt/qemu
。。。。。。  centos7-05.xml

–live 热迁移
–unsafe 即使不安全也要强制迁移、这个参数一定要加,不然会报错,不让迁移
–verbose 显示迁移进程
–persistent 持久迁移,不加这个为临时性的,不过加了这个本端也会保留一份配置-系统关闭状态的
–persistent-xml /etc/libvirt/qemu/centos7-05.xml,测试加这个迁移xml还是同上,本端还是留了一份,加不加没啥用
qemu+ssh://192.168.118.128/system qemu+ssh认证,IP为目标的IP

故障问题

错误:无法在 ‘kvm00.localdomain :49152’ 连接到服务器: 拒绝连接
原因:目标主机没有设置好静态域名解析,需要目标主机hostname和源主机hosts文件里面需一致
解决:在目标主机配置文件/etc/hostname中设置好域名解析

其他可能的问题:
….lookupByName……
原因:两台主机没有建立连接
解决:在virtual-manager上建立连接

点击迁移后闪退
主机不识别,重新定义主机名

找不到文件:/sharefile/vm2.qcow2
原因:两台主机的共享目录文件名不一致
解决:两台主机的共享目录文件名要保持相同

VNC连接linux进桌面进行热迁移

win系统下载VNC

https://www.tightvnc.com/download.php

在kvm01安装图形界面,不装图形界面连接会是一片灰屏。。。

[root@kvm01 ~]# yum groupinstall "GNOME Desktop" -y

如果Win系统连接时提示拒绝,就 再执行一次

vncserver :1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
之前设置过免密登陆,不需要认证
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
@_@进度界面太快了,一下就没了

在这里插入图片描述
可以看到已经迁移过去了,本端的web界面上也没了,
在这里插入图片描述
在这里插入图片描述
不再是临时迁移了,可以保存配置文件,不用特意去保存也会生成
查看配置文件默认位置 也可以看到了

[root@kvm00 ~]# ls /etc/libvirt/qemu
。。。。。。  centos7-05.xml 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KVM详解-WEB管理界面及安装win2016 的相关文章

  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • 为arm构建WebRTC

    我想为我的带有arm926ej s处理器的小机器构建webrtc 安装 depot tools 后 我执行了以下步骤 gclient config http webrtc googlecode com svn trunk gclient s
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?

    我的问题 1 书中现代操作系统 它说线程和进程可以处于内核模式或用户模式 但没有明确说明它们之间有什么区别 2 为什么内核态线程和进程的切换比用户态线程和进程的切换花费更多 3 现在 我正在学习Linux 我想知道如何在LINUX系统中分别
  • Gtk-ERROR **:检测到 GTK+ 2.x 符号

    我正在使用 gcc 编译我的 c 应用程序 并使用以下标志 gcc evis c pkg config cflags libs gtk 2 0 libs clutter gtk 1 0 libs gthread 2 0 Wall o evi
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost

随机推荐

  • AI编程时代,开发者路在何方?

    AI 正颠覆人们的想象 重塑各行各业 AI 技术改变编程范式 有效提升开发者效率 可能人人有机会成为 10倍程序员 在此发展趋势下 开发者不禁担心未来会不会被AI取代 随着 AI 编程时代来临 开发者需要掌握哪些能力来更好地成长 6月28日
  • MAVEN 的下载与配置(详细图解)

    一 maven的下载 二 解压压缩包与变量设置 1 创建本地仓库 创建文件夹如箭头所指 2 配置maven repo为本地仓库 点击conf文件夹 点击setting xml 在文档如图位置补充本地仓库的地址即maven repo文件夹的地
  • 如何快速掌握代币经济学

    如何研究加密世界里的Token 先看一组数据 截至2022年 市面上大约有6000种加密货币 或者更多 这对投资者来说当然是一个很大的机会 然而 在2021年 投资者在Crypto项目遇到欺诈 损失的金额120亿美元 因此 到底如何去表及里
  • Vue工程利用HBuild X打包APP打开一片空白的解决方式

    Vue工程利用HBuild X打包成APP时有时会出现一片空白的情况 这是由于Vue工程打包出来的静态文件路径出现问题造成的 解决方式 在工程下创建vue config js文件 在文件中写入 module exports publicPa
  • CUB200-2011鸟类细粒度数据集训练集和测试集划分python代码

    CUB200 2011数据集介绍 该数据集由加州理工学院再2010年提出的细粒度数据集 也是目前细粒度分类识别研究的基准图像数据集 该数据集共有11788张鸟类图像 包含200类鸟类子类 其中训练数据集有5994张图像 测试集有5794张图
  • Steam账号查询VAC封禁信息

    可以通过SteamID 账号名称来查询 VAC封禁信息 相关网址 1 SteamCN信誉平台 2
  • 一般游戏的反外挂保护方案

    所谓知己知彼方能百战不殆 要想减少或避免外挂对游戏的侵害 必须从根本上知晓外挂的原理 及其常用的技术手段 从而在技术手段上对其进行封堵 一 外挂的分类 外挂一般的分为2类 脱机式 和 内挂式 脱机式外挂的定义 完全脱离官方发布的客户端程序
  • SonarQube使用笔记

    SonarQube使用笔记 简介 SonarQube是一个用于管理代码质量的开放平台 可以快速的定位代码中潜在的或者明显的错误 目前支持java C C C Python PL SQL Cobol JavaScrip Groovy等二十几种
  • 在Linux上搭建sqli-labs

    1 先进入root权限 sudo su 然后输入账号密码 2 开启mysql mysql uroot p 3 改密码 MariaDB none gt SET password for root localhost password root
  • Python实战小游戏飞机大战详解

    大家还记得微信版 经典飞机大战 嘛 今天做的这款 打飞机 小游戏 画面诙谐 精致 完全复刻经典微信飞机大战哦 完全复刻 怎么 大家不信嘛 那跟着小编一起来看看吧 正文 一 环境安装 本文是写的游戏代码 基于Pygame的源码项目 这里是自己
  • Windows环境下Redis安装与配置的两种方式

    安装和配置Redis Redis的安装有两种安装形式 一种是安装包式 另一种是压缩包 注意 windows没有32位的 所以32位机器的朋友考虑换一下机器 一 安装包式 1 windows环境下的redis需要去github上获取 http
  • CSWin Transformer: A General Vision Transformer Backbone with Cross-Shaped Windows

    CSWin Transformer A General Vision Transformer Backbone with Cross Shaped Windows 一 引言 二 方法实现 一 CSWin Transformer 二 体系结构
  • 检测SOTA!DEYO:YOLOv5+DETR成就地表最强目标检测器

    点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 后台回复 2D检测综述 获取鱼眼检测 实时检测 通用2D检测等近5年内所有综述 目标检测是计算机视觉中的一个重要课题 后处理
  • Python中的矩阵操作

    Numpy 通过观察Python的自有数据类型 我们可以发现Python原生并不提供多维数组的操作 那么为了处理矩阵 就需要使用第三方提供的相关的包 NumPy 是一个非常优秀的提供矩阵操作的包 NumPy的主要目标 就是提供多维数组 从而
  • html页面跳转的方法

    html页面跳转的方法 1 html中使用meta中跳转 通过meta可以设置跳转时间和页面 2 a标签直接跳转 a href http baidu com 百度一下 a 3 通过javascript中实现跳转 直接跳转window loc
  • python之微信公众号内容爬取一(亲测可用)

    import requests from lxml import etree headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWebKit 537 36 KHTML
  • 微信小程序实现数值监听(页面和组件属性)

    简介 目前文章主要介绍对页面属性值的监听以及组件属性值的监听 需要异页面监听数据 请跳转至另一个文章介绍 为什么需要监听属性值 当需要通过一个属性变化时候 需要计算相应的方法等 pc网站经常需要监听属性 那么小程序应该怎么去实现 实现方法
  • elementui的表格排序的组件之问题---条件改变样式消失

    这两天写了一个需求 就是当我改变时间的时候 排序功能消失 这我就想不是很简单吗 但是是我太单纯了 这个是一个后台 肯定会用到element的组件 然后果不其然用的就是element里面的表格排序组件 elementUI table 首先熟悉
  • 移动端适配方案

    总共的方法 1 通过媒体查询的方式 2 以天猫首页为代表的 flex 弹性布局 3 以淘宝首页为代表的 rem viewport缩放 4 rem 方式 1 基本知识点 物理像素 硬件上屏幕上横向和纵向有多少个像素点 逻辑像素dp 程序认为屏
  • KVM详解-WEB管理界面及安装win2016

    文章目录 KVM的简介 KVM简介 2 关于virtual machine manager的介绍 二 安装及环境的部署 1 安装时系统要求 3 安装KVM虚拟化软件 kvm部署 kvm安装 启动服务 验证安装结果 测试并验证安装结果 查看网