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

文章目录

  • KVM的简介
    • KVM简介
    • 2 关于virtual machine manager的介绍
  • 二、安装及环境的部署
    • 1.安装时系统要求
    • 3.安装KVM虚拟化软件
  • kvm部署
    • kvm安装
      • 启动服务
      • 验证安装结果
      • 测试并验证安装结果
      • 查看网桥信息
    • kvm web管理界面-WebVirtMgr安装
      • 安装依赖包
      • 从github上下载webvirtmgr代码
      • 安装webvirtmgr
        • 检查sqlite3是否安装
        • 初始化帐号信息
    • 设备Nninx
        • 拷贝web网页至指定目录
        • 生成密钥
        • 端口转发
        • 配置nginx
      • 设置supervisor
        • 报错 : accept() failed (24: Too many open files)
    • KVM WEB界面管理
      • kvm存储管理
        • 先创建ISO镜像系统的存储池
    • 注意:这个目录和镜像的权限都要是777,没改就没法克隆 再看看WEB界面 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3fb9b2ba6f664cd18822e5cb42eeb96c.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/bf69ab82ce7c42f9a908e1383476873d.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/3ccd950cbd164b2b9f4821e6eb520f5d.png)
      • 添加镜像
      • kvm网络管理
      • 实例管理----创建虚机
    • 在这里插入图片描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/08e93a20b72e4cfda26493c308a8666f.png)
        • 安装noVNC
          • 启动服务,新建一个VNC链接:
          • 安装noVNC
          • 运行noVNC
      • 再次回到KVM管理界面,启动镜像
      • 克隆虚机
      • 虚机磁盘扩容-新增磁盘
      • 创建虚机快照
      • 创建Win2016 实例
        • virtio-win驱动
    • 命令行管理KVM
      • 一、虚拟机的存储池
        • 定义存储池
        • 启动存储池
        • 使用 virsh pool-create-as 命令创建临时性存储池。
        • 删除存储池
        • 更多的存储池、存储卷操作
      • 二、虚拟机快照
        • 2 给指定虚拟机创建快照
        • 3 查看快照
        • 4 恢复快照
        • 5 删除快照
      • 三、虚拟机网络
        • 1 查询虚拟网桥
        • 2 查看网络接口信息
        • 3设置桥接网络
      • 安装虚拟机
        • centos7虚拟机
        • win7虚拟机
      • 虚拟机常用操作
        • 虚拟机改固定IP
        • 显示虚拟机列表
        • 开关机、删除
        • 查看某个虚拟机对应的VNC端口
        • 重命名
        • 挂起&恢复
        • 开机启动
        • 完整克隆
        • 手动克隆
        • 导出、导入虚拟机
        • 加硬盘和扩容
          • 扩容
    • KVM热迁移
      • 热迁移操作
        • 安装NFS
        • 故障问题
      • VNC连接linux进桌面进行热迁移


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虚拟机配置时 处理器这边要选上虚拟化

KVM详解-WEB管理界面及安装win2016_第1张图片
KVM详解-WEB管理界面及安装win2016_第2张图片
开启虚拟机,开始安装过程。
KVM详解-WEB管理界面及安装win2016_第3张图片
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

KVM详解-WEB管理界面及安装win2016_第4张图片

# 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 '[email protected]'"
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/

KVM详解-WEB管理界面及安装win2016_第5张图片
此处的用户为:root
密码为:执行python manage syncdb时设置的超级管理员密码
KVM详解-WEB管理界面及安装win2016_第6张图片
此处的Label要与下面的FQDN / IP一致!

KVM详解-WEB管理界面及安装win2016_第7张图片

kvm存储管理

创建存储
KVM详解-WEB管理界面及安装win2016_第8张图片
KVM详解-WEB管理界面及安装win2016_第9张图片

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

KVM详解-WEB管理界面及安装win2016_第10张图片
KVM详解-WEB管理界面及安装win2016_第11张图片

KVM详解-WEB管理界面及安装win2016_第12张图片
KVM详解-WEB管理界面及安装win2016_第13张图片

KVM详解-WEB管理界面及安装win2016_第14张图片
添加一个100G的磁盘,分区后挂截/data
KVM详解-WEB管理界面及安装win2016_第15张图片
KVM详解-WEB管理界面及安装win2016_第16张图片

如要删除可以在状态这边选停掉再删
KVM详解-WEB管理界面及安装win2016_第17张图片

池路径 /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详解-WEB管理界面及安装win2016_第18张图片
在这里插入图片描述
KVM详解-WEB管理界面及安装win2016_第19张图片

添加镜像

KVM详解-WEB管理界面及安装win2016_第20张图片
KVM详解-WEB管理界面及安装win2016_第21张图片
KVM详解-WEB管理界面及安装win2016_第22张图片

kvm网络管理

KVM详解-WEB管理界面及安装win2016_第23张图片

KVM详解-WEB管理界面及安装win2016_第24张图片
KVM详解-WEB管理界面及安装win2016_第25张图片

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

KVM详解-WEB管理界面及安装win2016_第26张图片
KVM详解-WEB管理界面及安装win2016_第27张图片
这两个进都是一样界面
KVM详解-WEB管理界面及安装win2016_第28张图片
KVM详解-WEB管理界面及安装win2016_第29张图片
虚似机 接入ISO 光盘
KVM详解-WEB管理界面及安装win2016_第30张图片
设置在Web上访问 虚拟机的密码
KVM详解-WEB管理界面及安装win2016_第31张图片
KVM详解-WEB管理界面及安装win2016_第32张图片

启动虚拟机

KVM详解-WEB管理界面及安装win2016_第33张图片

KVM详解-WEB管理界面及安装win2016_第34张图片
KVM详解-WEB管理界面及安装win2016_第35张图片

故障: 无法显示启动界面
解决方法:是安装novnc并通过novnc_server启动一个vnc
KVM详解-WEB管理界面及安装win2016_第36张图片
安装好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管理界面,启动镜像

KVM详解-WEB管理界面及安装win2016_第37张图片
可以看到正常启动了
KVM详解-WEB管理界面及安装win2016_第38张图片
安装过程这里略过

KVM详解-WEB管理界面及安装win2016_第39张图片

克隆虚机

KVM详解-WEB管理界面及安装win2016_第40张图片
或者:
KVM详解-WEB管理界面及安装win2016_第41张图片


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

虚机磁盘扩容-新增磁盘

先在存储区新建一个镜像做磁盘
KVM详解-WEB管理界面及安装win2016_第42张图片
KVM详解-WEB管理界面及安装win2016_第43张图片
对虚机的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>

KVM详解-WEB管理界面及安装win2016_第44张图片

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

创建虚机快照

这里不支持运行状态创建快照,有点不实用。
To take a snapshot, shutdown the instance.要获取快照,请关闭实例。
KVM详解-WEB管理界面及安装win2016_第45张图片
如果虚机出现问题,就可以用快照进行恢复了
KVM详解-WEB管理界面及安装win2016_第46张图片

创建Win2016 实例

KVM详解-WEB管理界面及安装win2016_第47张图片
KVM详解-WEB管理界面及安装win2016_第48张图片
KVM详解-WEB管理界面及安装win2016_第49张图片

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

这个装完后,存储池会多出一个如下:
KVM详解-WEB管理界面及安装win2016_第50张图片
安装完后,在虚拟机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详解-WEB管理界面及安装win2016_第51张图片
启动后到选硬盘时
KVM详解-WEB管理界面及安装win2016_第52张图片
KVM详解-WEB管理界面及安装win2016_第53张图片
后面就是分区格式化安装…

安装网卡驱动,进系统后 打开设备管理 器
KVM详解-WEB管理界面及安装win2016_第54张图片
KVM详解-WEB管理界面及安装win2016_第55张图片

KVM详解-WEB管理界面及安装win2016_第56张图片

命令行管理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

运行中执行了恢复命令,再看界在,显示关机了
在这里插入图片描述
KVM详解-WEB管理界面及安装win2016_第57张图片
恢复关机状态的快照很完整,OK

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

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

运行中再执行了恢复命令,再看界面,显示运行中,但是原来连接是断开了,重启了
检查下命令运行到哪
KVM详解-WEB管理界面及安装win2016_第58张图片
运行快照是在命令执行到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

KVM详解-WEB管理界面及安装win2016_第59张图片

三、虚拟机网络

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

KVM详解-WEB管理界面及安装win2016_第60张图片
KVM详解-WEB管理界面及安装win2016_第61张图片
KVM详解-WEB管理界面及安装win2016_第62张图片
之前设置过免密登陆,不需要认证
KVM详解-WEB管理界面及安装win2016_第63张图片
KVM详解-WEB管理界面及安装win2016_第64张图片
KVM详解-WEB管理界面及安装win2016_第65张图片
@_@进度界面太快了,一下就没了

KVM详解-WEB管理界面及安装win2016_第66张图片
可以看到已经迁移过去了,本端的web界面上也没了,
KVM详解-WEB管理界面及安装win2016_第67张图片
KVM详解-WEB管理界面及安装win2016_第68张图片
不再是临时迁移了,可以保存配置文件,不用特意去保存也会生成
查看配置文件默认位置 也可以看到了

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

你可能感兴趣的:(云架构,网络应用,前端,linux,运维)