KVM——虚拟化
在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,
并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率。
虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率,
使 IT 资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。
VMware 和微软的VirtualPC 是代表该方法的两个商用产品,而基于核心的虚拟机 (KVM) 是面向 Linux 系统的开源产品hypervisor
可以捕获 CPU 指令,为指令访问硬件控制器和外设充当中介。
因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。
主要缺点是, hypervisor 给处理器带来开销。
(2)准虚拟化 — 完全虚拟化是处理器密集型技术,因为它要求 hypervisor管理各个虚拟服务器,并让它们彼此独立。
减轻这种负担的一种方法就是,改动客户端操作系统,让它以为自己运行在虚拟环境下,能够与hypervisor 协同工作。
这种方法就叫准虚拟化 (para-virtualization)Xen 是开源准虚拟化技术的一个例子。
操作系统作为虚拟服务器在 Xen hypervisor 上运行之前,它必须在核心层面进行某些改变。
因此, Xen 适用于 BSD 、 Linux 、 Solaris 及其他开源操作系统,但不适合对像Windows 这些专有的操作系统进行虚拟化处理,因为它们无法改动。
准虚拟化技术的优点是性能高。经过准虚拟化处理的服务器可与hypervisor 协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。
准虚拟化与完全虚拟化相比优点明显,以至于微软和 VMware 都在开发这项技术,以完善各自的产品。
(3)系统虚拟化 — 就操作系统层的虚拟化而言,没有独立的hypervisor 层。
相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。
一个明显的区别是,如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统 ( 不过每个实例有各自的应用程序和用户。
账户 ) 。虽然操作系统层虚拟化的灵活性比较差,但本机速度性能比较高。
此外,由于架构在所有虚拟服务器上使用单一、标准的操作系统,管理起来比异构环境要容易。
(4)桌面虚拟化 — 服务器虚拟化主要针对服务器而言,而虚拟化最接近用户的还是要算的上桌面虚拟化了,
桌面虚拟化主要功能是将分散的桌面环境集中保存并管理起来,包括桌面环境的集中下发,集中更新,集中管理。
桌面虚拟化使得桌面管理变得简单,不用每台终端单独进行维护,每台终端进行更新。
终端数据可以集中存储在中心机房里,安全性相对传统桌面应用要高很多。
桌面虚拟化可以使得一个人拥有多个桌面环境,也可以把一个桌面环境供多人使用。
是一个开源软件,基于内核的虚拟化技术,实际是嵌入系统的一个虚拟化模块,通过优化内核来使用虚拟技术,
该内核模块使得 Linux 变成了一个Hypervisor,虚拟机使用 Linux 自身的调度器进行管理。
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。
KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。
这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,
需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。
目前这个应用程序是 QEMU。
1. 确定处理器有 VT
命令行: grep vmx /proc/cpuinfo (INTEL 芯片 )
grep svm /proc/cpuinfo (AMD 芯片 )
cat /proc/cpuinfo | grep -e vmx -e nx -e svm
不知道芯片的生产厂商则输入:egrep ‘(vmx|svm)’ /proc/cpuinfo
如果 flags: 里有 vmx 或者 svm 就说明支持 VT ;如果没有任何的输出,说明你的 cpu 不支持,将无法成功安装 KVM 虚拟机。
24
将如下选项设为Enabled
Intel(R) Virtualization Tech [Enabled]
yum install kvm virt-manager virt-install libvirt libvirt-python python-virtinst libvirt-client qemu-kvm qemu-img -y
kvm虚拟化所需组件介绍
kvm: 核心套件
virt-manager: 图形化 KVM 管理软件,也就是说你要有图形化的操作界面。
libvirt: 提供虚拟机与宿主相互通信的机制
libvirt-python: 允许使用 libvirt API
python-virtinst:CLI 下创建 KVM 的工具
libvirt-client: 提供 client 访问 kvm 服务器的机制 ,并包含 virsh 命令进行管理和控制 VMs
qemu-kvm: 提供用户级 KVM 环境
qemu-img:VMs 磁盘管理
virt-install 克隆虚拟机
modprobe kvm #kvm是内置的模块,使用时加载即可
lsmod | grep kvm
systemctl restart libvirtd
systemctl enable libvirtd
virsh list --all #启动并检测kvm
1. NAT ( 默认上网 ) :虚拟机利用 host 机器的 ip 进行上网 . 对外显示一个 ip,
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能,默认ip为192.168.122.1
2. 自带的Bridge : 将虚拟机桥接到 host 机器的网卡上 ,vm和 host 机器都通过 bridge 上网 . 对外有同网段的不同ip,此种方式host却不能和vm联通
3. Linux Bridge : 基本原理就是创建一个桥接接口 br0 ,在物理网卡和虚拟网络接口之间传递数据。此种方式host却可以和vm联通
Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。
多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备
#前提是已经安装了图形化操作系统,但如果没有图形化的操作系统,一样可以通过命令行来管理虚拟。
要升级为图形化操作系统:
yum groupinstall "X Window System" -y
yum groupinstall "GNOME Desktop" "Graphical Administration Tools" -y
#建议搭建本地yum仓库,否则受网速限制,下载耗时长。
通过命令 startx 进入图形界面,第一次进入会比较慢,请耐心等待。(可能需要重启)
创建好虚机之后,通过virsh list --all 来查看。
如果想要查看其他服务器上的虚拟机,那么也可以通过virt-manager来实现。
只需要添加进来即可:File —— Add Connection —— 通过ssh连接 —— 点击链接
可能会提示安装如下的软件在本机,在本机安装即可:
[root@centos ~]# yum install openssh-askpass -y
如果一直出现输入密码的窗口,那么你可能需要ssh免密。
vim /etc/default/libvirt-bin
start_libvirtd=”yes”
libvirtd_opts=”-d -l”
vim /etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
unix_sock_group = “libvirtd”
unix_sock_ro_perms = “0777”
unix_sock_rw_perms = “0770”
auth_unix_ro = “none”
auth_unix_rw = “none”
auth_tcp = “none”
然后重启 Libvirtd 服务就可以远程管理了。
systemctl restart libvirt-bin
如果不会使用可以--help查看帮助手册。
virsh list 列出当前宿主机上处于运行状态的虚拟机
virsh list –all 列出当前宿主机上所有的虚拟机
virsh start vm1 (虚拟机name) 开启某一台虚拟机
virsh shutdown vm1 (虚拟机name) 正常关闭一台虚拟机
virsh destroy vm1 强制关闭某一台虚拟机
virsh autostart vm1 开机自启动虚拟机vm1
virsh autostart –disable vm1 关闭开机自启动
virsh edit vm1 编辑某个虚拟机的配置文件
virsh pool-list 列出存储池
virsh pool-destroy ken #删除存储池
创建一个大小为 50G 的,格式为 qcow2 的磁盘镜像
查看磁盘信息:
qemu-img info /export/kvm/test.qcow2
Virt-install:命令行下创建虚拟机的命令,不过在它后面需要跟上很多的参数
-–name: 虚拟机的名字。
-–disk Location: 磁盘映像的位置。
-–graphics : 怎样连接 VM ,通常是 SPICE 。
-–vcpu : 虚拟 CPU 的数量。
-–ram : 以兆字节计算的已分配内存大小。
-–location : 指定安装源路径
-–network : 指定虚拟网络,通常是 virbr0 或者自己设定的 br0
例如:
virt-install –-name=test -–disk path=/export/kvm/test.qcow2 -–ram=1024 –-vcpus=1 –-graphics spice
–-location=/export/download/software/iso/CentOS-7.3-x86_64-DVD.iso -–network bridge=br0
注:以此安装操作之后,会在桌面显示一个 virtviewer ,进入到安装步骤
ssh连接下安装:
qemu-img create -f qcow2 /var/lib/libvirt/imags/ken.qcow2 10G
virt-install --name=test --disk path=/var/lib/libvirt/images/test.qcow2 --ram=1024 --vcpus=1 --nographics --location=/tmp/CentOS-7-x86_64-Minimal-1810.iso
--extra-args='console=ttyS0' --network bridge=br0
virsh help 打印帮助
virsh attach-device 从一个 XML 文件附加装置
virsh attach-disk 附加磁盘设备
virsh attach-interface 获得网络界面
virsh destroy 删除一个域
virsh detach-device 从一个 XML 文件分离设备
virsh detach-disk 分离磁盘设备
virsh detach-interface 分离网络界面
virsh define 从一个 XML 文件定义(但不开始)一个域
virsh undefine 删除一个虚机域
virt-clone -o vm2 -n vm4 -f /var/lib/libvirt/images/vm4.qcow2
#将名为vm2的样板机克隆为vm4的新虚机。
KVM 通过virsh console连入虚拟机
新安装一台虚拟机后,是无法通过virsh console 命令连入虚拟机中的,这时我们需要开启虚拟机的console功能。
1、centos7以下,及其他情况
(1)添加ttyS0的许可,允许root登陆
[root@localhost ~]# echo “ttyS0” >> /etc/securetty
(2)编辑/etc/grub.conf中加入console=ttyS0 #在kernel的最后面添加。
(3)编辑/etc/inittab,在最后一行加入内容:S0:12345:respawn:/sbin/agetty ttyS0 115200
(4)重启服务器
reboot
(5)宿主机上测试
virsh console vm-name
(6)退出console连接的虚拟机li
按 ctrl+] 组合键退出virsh console
2、对于centos7
(1)在虚机里运行
[root@localhost ~]# grubby –update-kernel=ALL –args=”console=ttyS0″
(2)重启虚机
[root@localhost ~]# reboot
(3)宿主机上测试
virsh console vm-name
(4)退出console连接的虚拟机li
按 ctrl+] 组合键退出virsh console
nested 虚拟机嵌套( kvm on kvm ):nested 技术,简单的说,就是在虚拟机上跑虚拟机。
KVM 虚拟机嵌套和 VMWare 原理不同, VMWare第一层是用的硬件虚拟化技术,第二层就是完全软件模拟出来的,所以 VMWare 只能做两层嵌套。
KVM 是将物理 CPU 的特性全部传给虚拟机,所有理论上可以嵌套 N 多层。
第一步:查看一层客户端是否支持 VT
[jerry@centos ~]$ egrep "vmx" /proc/cpuinfo | wc -l
24
查询未果,证明一层 KVM 的虚拟机,并未将宿主机处理器的 VT 功能成功透传。
所以,没有对 VT功能的支持,我们不能实现在该层虚拟机中嵌套KVM 虚拟机。
第二步:在物理服务器上为嵌套虚拟机做准备 — CPU 虚拟化透传
[root@centos ~]# cat /etc/modprobe.d/kvm-nested.conf
options kvm_intel nested=1
第三步: 在宿主机启用 kvm_intel 模块的嵌套虚拟化功能,并且使透传永久有效
重新加载 kvm 模块
[root@centos ~]# modprobe -r kvm_intel
[root@centos ~]# modprobe kvm_intel
-r参数:remove掉kvm_intel模块
加载kvm_intel模块
[root@centos ~]# cat /sys/module/kvm_intel/parameters/nested
Y
Y —“Y” 表示 cpu 虚拟化透传功能开启
第五步:编辑需要做虚拟化透传的虚拟机的配置文件
[root@centos ~]# virsh edit centos7.0 #cpu mode=“host-passthrough”
[root@localhost ~]# lsmod | grep kvm
kvm_intel 183621 0
kvm 586948 1 kvm_intel
irqbypass 13503 1 kvm
#如果出现上面的结果,说明支持透传。可以在虚拟机里创建虚拟机。
virsh edit centos7.0 实际上编辑的就是这个配置文件。
虚拟机的磁盘放在:/var/lib/libvirt/images/
我们创建虚机使用的是Linux-bridge的br0网桥,在此基础上创建出的虚拟机,br0上桥接了ens33(宿主机的网卡)和vnet0(虚机的网卡)
使得虚机和宿主机都可以通过br0来通外网。
LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机。
一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在同一个 LAN 中。
一个 LAN 表示一个广播域。 其含义是:LAN 中的所有成员都会收到任意一个成员发出的广播包。
VLAN 表示 Virtual LAN。一个带有 VLAN 功能的switch 能够将自己的端口划分出多个 LAN。
计算机发出的广播包可以被同一个 LAN 中其他计算机收到,但位于其他 LAN 的计算机则无法收到。
简单地说,VLAN 将一个交换机分成了多个交换机,限制了广播的范围,在二层将计算机隔离到不同的 VLAN 中。
比方说,有两组机器,Group A 和 B,我们想配置成 Group A 中的机器可以相互访问,Group B 中的机器也可以相互访问,
但是 A 和 B 中的机器无法互相访问。 一种方法是使用两个交换机,A 和 B 分别接到一个交换机。 另一种方法是使用一个带 VLAN 功能的交换机,将 A 和 B 的机器分别放到不同的 VLAN 中。
VLAN 的隔离是二层上的隔离,A 和 B 无法相互访问指的是二层广播包(比如 arp)无法跨越 VLAN 的边界。但在三层上(比如IP)是可以通过路由器让 A 和 B 互通的。
Access 口
这些端口被打上了 VLAN 的标签,表明该端口属于哪个 VLAN。 不同 VLAN 用 VLAN ID 来区分,VLAN ID 的 范围是 1-4096。
Access 口都是直接与计算机网卡相连的,这样从该网卡出来的数据包流入 Access 口后就被打上了所在 VLAN 的标签。 Access 口只能属于一个 VLAN。
Trunk 口
假设有两个交换机 A 和 B。 A 上有 VLAN1(红)、VLAN2(黄)、VLAN3(蓝);B 上也有 VLAN1、2、3,那如何让 AB 上相同 VLAN 之间能够通信呢?
办法是将 A 和 B 连起来,而且连接 A 和 B 的端口要允许 VLAN1、2、3 三个 VLAN 的数据都能够通过。
这样的端口就是Trunk口了。 VLAN1, 2, 3 的数据包在通过 Trunk 口到达对方交换机的过程中始终带着自己的 VLAN 标签。
1、配置文件——以.xml结尾。
2、磁盘——一般磁盘格式为qcow2
冷迁移:
将这两个文件复制到另一个宿主机上,为了方便放在同一目录之下。
更改.xml结尾的配置文件,然后将source file的路径改为当前磁盘文件所在的路径。
virsh define xxx.xml #定义即可实现迁移
实现冷迁移,在多个节点迁移,只需要将磁盘和配置文件拷贝过去即可。
VM的迁移都是围绕着配置文件和磁盘文件来做的。
那么通过做一个nfs共享文件系统,将这两个文件放到共享的目录之中,然后在要迁移的各个节点创建同名目录。挂载到这个目录之中使用即可。
然后再各个节点上添加主机域名解析。
在图形界面的虚机状态栏右击,点击迁移,然后选择你要迁移到的主机即可。
KVM——虚拟化的更多相关文章
- [原] KVM 虚拟化原理探究(1)— overview
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样 ...
- [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...
- [原] KVM 虚拟化原理探究(4)— 内存虚拟化
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Gu ...
- [原] KVM 虚拟化原理探究(3)— CPU 虚拟化
KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要 ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
- kvm虚拟化平台搭建入门
KVM虚拟化有两种网络模式:1)Bridge网桥模式2)NAT网络地址转换模式Bridge方式适用于服务器主机的虚拟化.NAT方式适用于桌面主机的虚拟化. 环境: 本次实验要开启VMWare中对应Ce ...
- centos vmware centos6.6 64位 kvm虚拟化安装配置 第四十二节课
centos vmware centos6.6 64位 kvm虚拟化安装配置 第四十二节课 上半节课 下半节课 f
- KVM虚拟化技术
KVM虚拟化技术 Qemu-kvm kvm virt-manager VNC Qemu-kvm创建和管理虚拟机 一.KVM简介 KVM(名称来自英语:Kernel-basedVirtual Machi ...
随机推荐
- JavaScript的变量提升机制
变量提升 JavaScript的变量提升有两种,用var声明的变量以及用function声明的变量. 用var声明的变量 我们先来看下面这段代码,a的值是多少 代码1 console.log(a); ...
- photoshop下载(ps)
https://pan.baidu.com/s/1bNrUod2n1VqsA7Fr9RHtsg
- acm数论之旅(转载) -- 快速幂
0和1都不是素数,也不是合数. a的b次方怎么求 pow(a, b)是数学头文件math.h里面有的函数 可是它返回值是double类型,数据有精度误差 那就自己写for循环咯 LL pow(LL a ...
- CCF认证 2019-12-3
分析 后面的数据,坐标分布太离散,不能用一个二位数组来模拟垃圾分布.因此,考虑用一个数组记录每个垃圾点的位置. 先根据x坐标.再根据y坐标进行排序. 再遍历数组中的每一处垃圾点,判断其是否能建回收站( ...
- docker运行安装mysql postgres
安装mysql [root@host1 ~]# docker images -a REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/mysql 5.7 4d ...
- C语言-断言
1 作用: 断言常做语言处理的高级形式,自动处理软件隐藏很深其且它手段不易发现的错误,快速进行异常定位.同时这也是软件单元测试必须的技术. 2 使用范围: 2.1放在函数入口对入口参数进行合法性检查( ...
- redis哨兵模式启动redis-sentinel sentinel.conf 报错
[root@node01 redis-3.2.8]# redis-sentinel sentinel.conf *** FATAL CONFIG FILE ERROR ***Reading the c ...
- 洛谷 P1886 滑动窗口(单调队列)
嗯... 题目链接:https://www.luogu.org/problem/P1886 首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题).这道题可以手写一个队列,也 ...
- 集成PHP应用和SOLR
集成 PHP 应用和 Solr 搜索引擎 您的评价: 收藏该经验 你为什么需要搜索引擎?单纯数据库不够用?如果你只是创建小网站,数据库就够了.但当你创建中性或大型应用的时 ...
- JavaScript - Array对象,数组
1. 创建数组 方式1. new关键字 var arr = new Array(1, 2, 3); 方式2. 使用字面量创建数组对象 var arr = [1, 2, 3]; 2. 检测一个对象是否是 ...