Linux 篇 | KVM
-
大多数企业中的虚拟化,成本低使用KVM,成本高建议使用VMware ESXi
-
hypervisor(虚拟设备)类型:
-
直接运行到物理机:vmware esxi、rhev hypervisor
- 需要运行到操作系统:KVM,XEN,vmware workstation
-
1.虚拟化技术之KVM
KVM 是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen(https://zhuanlan.zhihu.com/p/33324585),其核心源码很少。KVM目前已成为学术界的主流VMM之一。 KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESXI系列是Full-Virtualization,IBM文档:http://www.ibm.com/developerworks/cn/linux/l-using-kvm/
1.Guest:客户机系统,包括CPU(vCPU)、内存、驱动(Console、网卡、I/O 设备驱动等),被KVM置于一种受限制的CPU模式下运行.
2.KVM:运行在内核空间,提供 CPU 和内存的虚级化,以及客户机的 I/O拦截,Guest的部分I/O被KVM拦截后,交给 QEMU处理。
3.QEMU:修改过的被KVM虚机使用的QEMU代码,运行在用户空间,提供硬件I/O虚拟化,通过IOCTL/dev/kvm设备和KVM交互,但是,KVM本身不执行任何硬件模拟,需要用户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是QEMU。
1.1 宿主机环境准备
1.1.1 CPU开启虚拟化
KVM需要宿主机CPU必须支持虚拟化功能,因此如果是在vmware workstation上使用虚拟机做宿主机,那么必须要在虚拟机配置界面的处理器选项中开启虚拟机化功能。
1.1.2 确认CPU指令集
X86/x86_64-Intel、AMD
ARM-手机、pad、机顶盒,https://baike.baidu.com/item/ARM/5907?fr=aladdin
Power-IBM
http://tech.sina.com.cn/it/2005-06-07/0701628180.shtml
查看主机的CUP是否开启了虚拟化支持
[root@centos7 ~]# grep -E "vmx|svm" /proc/cpuinfo | wc -l
2
[root@centos7 ~]#
说明:
显示物理核心CPU的指令集:grep -E "vmx|svm" /proc/cpuinfo
1.1.3 查看Linux内核中KVM的模块
[root@centos7 ~]# lsmod | grep kvm
kvm_intel 183621 0
kvm 586948 1 kvm_intel
irqbypass 13503 1 kvm
[root@centos7 ~]#
1.1.4 安装KVM的管理命令
1.安装kvm的管理命令
[root@centos7 ~]# yum install qemu-kvm qemu-kvm-tools libvirt virt-manager virt-install
说明:
模拟器,模拟鼠标、键盘等:qemu-kvm qemu-kvm-tools
启动虚拟机的一个主程序,用来管理虚拟机:libvirt
使用WEB界面远程管理虚拟机:virt-manager
2.启动libvirtd服务
[root@centos7 ~]# systemctl start libvirtd
[root@centos7 ~]# systemctl enable libvirtd
[root@centos7 ~]#
3.生成NAT网卡“virbr0”(可以访问其他主机,但其他主机访问不了本机“virbr0”的IP地址)
[root@centos7 ~]# ifconfig virbr0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:93:29:ff txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@centos7 ~]#
4.查找“virbr0”网卡的配置文件
[root@centos7 ~]# grep 192.168.122.1 /etc/ -R
/etc/libvirt/qemu/networks/autostart/default.xml: <ip address=‘192.168.122.1‘ netmask=‘255.255.255.0‘>
/etc/libvirt/qemu/networks/default.xml: <ip address=‘192.168.122.1‘ netmask=‘255.255.255.0‘>
[root@centos7 ~]#
说明:
“/etc/libvirt/qemu/networks/autostart/default.xml”文件是“/etc/libvirt/qemu/networks/default.xml”文件的软连接
5.修改“virbr0”网卡的配置文件
[root@centos7 ~]# vim /etc/libvirt/qemu/networks/default.xml
说明:
“ip address”项可修改IP地址
“DHCP”项修改:动态分配给kvm虚拟机的IP地址
1.2 创建虚拟机
创建虚拟机的步骤:
安装kvm管理命令-->查看CPU指令、内存容量是否满足条件-->创建虚拟机使用的网卡-->创建虚拟机的磁盘(重点)-->准备虚拟机所使用的ISO镜像
注意:"KVM的NAT网络虚拟机",只能连接宿主机外的其他虚拟机,而宿主机外的其他虚拟机不能连接到这个“NAT虚拟机”。(想实现这个效果,可用KVM的桥接网络虚拟机)
1.2.1 虚拟机磁盘的格式
1.根据存储数据方式的不同可以分为两种格式,一种是稀疏模式。一种是全镜像模式,全镜像模式无法做快照,IO层面是有qemu模拟的,CPU和内存是有KVM实现的,以下是KVM的功能:
KVM 所支持的功能包括:
1. 支持CPU 和 memory 超分(Overcommit)
2. 支持半虚拟化I/O (virtio)
3. 支持热插拔 (cpu,块设备、网络设备等)
4. 支持实时迁移(Live Migration)
5. 支持 PCI 设备直接分配和 单根I/O 虚拟化 (SR-IOV)
6. 支持 内核同页合并 (KSM )
7. 支持 NUMA (Non-Uniform Memory Access,非一致存储访问结构 )
2.KVM工具集合
1. libvirt:操作和管理KVM虚机的虚拟化 API,使用 C 语言编写,可以由 Python,Ruby, Perl, PHP, Java 等语言调用。可以操作包括 KVM,vmware,XEN,Hyper-v, LXC 等 Hypervisor。
2. Virsh:基于 libvirt 的 命令行工具 (CLI)
3. Virt-Manager:基于 libvirt 的 GUI 工具
4. virt-v2v:虚机格式迁移工具
5. virt-* 工具:包括 Virt-install (创建KVM虚机的命令行工具), Virt-viewer (连接到虚机屏幕的工具),Virt-clone(虚机克隆工具),virt-top 等
6. sVirt:安全工具
3.磁盘格式
(1)raw:指定多大就创建多大,直接占用指定大小的空间
老牌的格式,用一个字来形容就是裸,你随便dd一个file就模拟了一个raw格式的镜像。由于裸的彻底,性能上来说的话还是不错的。目前来看,KVM和XEN默认的格式好像还是这个格式。因为其原始,有很多原生的特性,例如直接挂载也是一件简单的事情。裸的好处还有就是简单,支持转换成其它格式的虚拟机镜像对裸露的它来说还是很简单的(如果其它格式需要转换,有时候还是需要它做为中间格式),空间使用来看,这个很像磁盘,使用多少就是多少(du -h看到的大小就是使用大小),但如果你要把整块磁盘都拿走的话得全盘拿了(copy镜像的时候),会比较消耗网络带宽和I/O。接下来还有个有趣的问题,如果那天你的硬盘用着用着不够用了,你咋办,在买一块盘。但raw格式的就比较犀利了,可以在原来的盘上追加空间:
dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先创建4G的空间)
cat foresight.img zeros.raw > new-foresight.img(追加到原有的镜像之后)
当然,好东西是吹出来的,谁用谁知道,还是有挺多问题的。由于原生的裸格式,不支持snapshot也是很正常的。传说有朋友用版本管理软件对raw格式的文件做版本管理从而达到snapshot的能力,估计可行,但没试过,这里也不妄加评论。但如果你使用LVM的裸设备,那就另当别论。说到LVM还是十分的犀利的,当年用LVM做虚拟机的镜像,那性能杠杠的。而且现在好多兄弟用虚拟化都采用LVM来做的。在LVM上做了很多的优化,国外听说也有朋友在LVM增量备份方面做了很多的工作。目前来看LVM的snapshot、性能、可扩展性方面都还是有相当的效果的。目前来看的话,备份的话也问题不大。就是在虚拟机迁移方面还是有很大的限制。但目前虚拟化的现状来看,真正需要热迁移的情况目前需求还不是很强烈。虽然使用LVM做虚拟机镜像的相关公开资料比较少,但目前来看牺牲一点灵活性,换取性能和便于管理还是不错的选择。对于LVM相关的特性及使用可以参考如下链接:
http://www.ibm.com/developerworks/linux/library/l-lvm2/index.html
(2)cow
曾经qemu的写时拷贝的镜像格式,目前由于历史遗留原因不支持窗口模式。从某种意义上来说是个弃婴,还没得它成熟就死在腹中,后来被qcow格式所取代。
(3)qcow
一代的qemu的cow格式,刚刚出现的时候有比较好的特性,但其性能和raw格式对比还是有很大的差距,目前已经被新版本的qcow2取代。其性能可以查看如下链接:
http://www.linux-kvm.org/page/Qcow2
(4)qcow2(推荐)
是openstack默认也是比较推荐的格式,将差异保存在一个文件,文件比较小而且做快照也比较小,空间是动态增长的
现在比较主流的一种虚拟化镜像格式,经过一代的优化,目前qcow2的性能上接近raw裸格式的性能,这个也算是redhat的官方渠道了,对于qcow2的格式,几点还是比较突出的,qcow2的snapshot,可以在镜像上做N多个快照:更小的存储空间,即使是不支持holes的文件系统也可以(这下du -h和ls -lh看到的就一样了),支持多个snapshot,对历史snapshot进行管理,支持zlib的磁盘压缩,支持AES的加密
(5)vmdk
VMware的格式,这个格式说的蛋疼一点就有点牛X,原本VMware就是做虚拟化起家,自己做了一个集群的VMDK的pool,做了自己的虚拟机镜像格式。又拉着一些公司搞了一个OVF的统一封包。从性能和功能上来说,vmdk应该算最出色的,由于vmdk结合了VMware的很多能力,目前来看,KVM和XEN使用这种格式的情况不是太多。但就VMware的Esxi来看,它的稳定性和各方面的能力还是可圈可点。
(6)vdi
VirtualBox 1.1 compatible image format, for exchanging images with VirtualBox.SUN收购了VirtualBox,Oracle又收购了SUN,这么说呢,vdi也算虚拟化这方面的一朵奇葩,可惜的是入主的两家公司。SUN太专注于技术(可以说是IT技术最前端也不为过),Oracle又是开源杀手(mysql的没落)。单纯从能力上来说vdi在VirtualBox上的表现还是不错的。也是不错的workstation级别的产品。
4.磁盘格式的转换
(1)raw转换为qcow2
此步骤使用qemu-img工具实现,如果机器上没有,可以通过rpm或yum进行安装,包名为qemu-img。
qemu-img是专门虚拟磁盘映像文件的qemu命令行工具。
具体命令如下:
qemu-img convert -f raw centos.img -O qcow2 centos.qcow2
参数说明:convert 将磁盘文件转换为指定格式的文件
-f 指定需要转换文件的文件格式
-O 指定要转换的目标格式
转换完成后,将新生产一个目标映像文件,原文件仍保存。
(2)qcow2转换为raw
qemu-img convert -O qcow2 my.raw myqow.qcow
(3)VMDK转换为qcow2
qemu-img convert -f vmdk -O qcow2 xxx.vmdk xxx.img
参考链接:http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html
1.2.2 创建磁盘
-
qemu-img命令
-
一般使用“qemu-img命令”创建(create)、转换(convert)磁盘的格式
- 使用“qemu-img -h”可查看此命令的使用帮助
-
1.默认保存虚拟机磁盘的路径
[root@centos7 ~]# ll /var/lib/libvirt/images/
总用量 0
[root@centos7 ~]#
2.创建一个格式为raw大小为10G的裸磁盘文件
[root@centos7 ~]# qemu-img create -f raw /var/lib/libvirt/images/centos.raw 10G
Formatting ‘/var/lib/libvirt/images/centos.raw‘, fmt=raw size=10737418240
[root@centos7 ~]#
3.查看这个文件占多大的系统空间
[root@centos7 ~]# ll -h /var/lib/libvirt/images/centos.raw
-rw-r--r-- 1 root root 10G 6月 17 20:31 /var/lib/libvirt/images/centos.raw
[root@centos7 ~]#
4.创建一个格式为qcow2大小为10G的磁盘文件
[root@centos7 src]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos.qcow2 10G
Formatting ‘/var/lib/libvirt/images/centos.qcow2‘, fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off
[root@centos7 src]#
5.查看这个文件占多大的系统空间
[root@centos7 src]# ll -h /var/lib/libvirt/images/centos.qcow2
-rw-r--r-- 1 root root 193K 6月 17 21:31 /var/lib/libvirt/images/centos.qcow2
[root@centos7 src]#
1.2.3 准备虚拟机所使用的ISO镜像(一般用最小化的镜像)
一般放到“/usr/local/src/”目录里
[root@centos7 ~]# cd /usr/local/src/
[root@centos7 src]# ll
总用量 940032
-rw-r--r-- 1 root root 962592768 6月 17 21:17 CentOS-7-x86_64-Minimal-1810.iso
[root@centos7 src]#
1.2.4 创建虚拟机所使用的命令“virt-install”
[root@centos7 ~]# virt-install -h
usage: virt-install --name NAME --memory MB STORAGE INSTALL [options]
使用指定安装介质新建虚拟机。
optional arguments:
-h, --help show this help message and exit
--version show program‘s version number and exit
--connect URI 使用 libvirt URI 连接到 hypervisor
通用选项:
-n NAME, --name NAME 客户端事件名称
--memory MEMORY 配置虚拟机内存分配。例如:
--memory 1024 (in MiB)
--memory 512,maxmemory=1024
--vcpus VCPUS 为虚拟机配置的 vcpus 数。例如:
--vcpus 5
--vcpus 5,maxcpus=10,cpuset=1-4,6,8
--vcpus sockets=2,cores=4,threads=2,
--cpu CPU CPU 型号及功能。例如:
--cpu coreduo,+x2apic
--cpu host
--metadata METADATA 配置虚拟机元数据。例如:
--metadata name=foo,title="My pretty title",uuid=...
--metadata description="My nice long description"
安装方法选项:
--cdrom CDROM 光驱安装介质
-l LOCATION, --location LOCATION
安装源(例如:nfs:host:/path、http://host/path 或 ftp://host/path)
--pxe 使用 PXE 协议从网络引导
--import 在磁盘映像中构建虚拟机
--livecd 将光驱介质视为 Live CD
-x EXTRA_ARGS, --extra-args EXTRA_ARGS
附加到使用 --location 引导的内核的参数
--initrd-inject INITRD_INJECT
使用 --location 为 initrd 的 root 添加指定文件
--os-variant DISTRO_VARIANT
在其中安装 OS 变体的虚拟机,比如:‘fedora18‘、‘rhel6‘、‘winxp‘ 等等
--boot BOOT 配置虚拟机引导设置。例如:
--boot hd,cdrom,menu=on
--boot init=/sbin/init (for containers)
--idmap IDMAP 为 LXC 容器启用用户名称空间。例如:
--idmap uid_start=0,uid_target=1000,uid_count=10
设备选项:
--disk DISK 使用不同选项指定存储。例如:
--disk size=10 (new 10GiB image in default location)
--disk /my/existing/disk,cache=none
--disk device=cdrom,bus=scsi
--disk=?
-w NETWORK, --network NETWORK
配置虚拟机网络接口。例如:
--network bridge=mybr0
--network network=my_libvirt_virtual_net
--network network=mynet,model=virtio,mac=00:11...
--network none
--network help
--graphics GRAPHICS 配置虚拟机显示设置。例如:
--graphics vnc
--graphics spice,port=5901,tlsport=5902
--graphics none
--graphics vnc,password=foobar,port=5910,keymap=ja
--controller CONTROLLER 配置虚拟机控制程序设备。例如:
--controller type=usb,model=ich9-ehci1
--input INPUT 配置虚拟机输入设备。例如:
--input tablet
--input keyboard,bus=usb
--serial SERIAL 配置虚拟机串口设备
--parallel PARALLEL 配置虚拟机并口设备
--channel CHANNEL 配置虚拟机沟通频道
--console CONSOLE 配置虚拟机与主机之间的文本控制台连接
--hostdev HOSTDEV 将物理 USB/PCI/etc主机设备配置为与虚拟机共享
--filesystem FILESYSTEM 将主机目录传递给虚拟机。例如:
--filesystem /my/source/dir,/dir/in/guest
--filesystem template_name,/,type=template
--sound [SOUND] 配置虚拟机声音设备模拟
--watchdog WATCHDOG 配置虚拟机 watchdog 设备
--video VIDEO 配置虚拟机视频硬件。
--smartcard SMARTCARD 配置虚拟机智能卡设备。例如:
--smartcard mode=passthrough
--redirdev REDIRDEV 配置虚拟机重定向设备。例如:
--redirdev usb,type=tcp,server=192.168.1.1:4000
--memballoon MEMBALLOON 配置虚拟机 memballoon 设备。例如:
--memballoon model=virtio
--tpm TPM 配置虚拟机 TPM 设备。例如:
--tpm /dev/tpm
--rng RNG 配置虚拟机 RNG 设备。例如:
--rng /dev/random
--panic PANIC 配置虚拟机 panic 设备。例如:
--panic default
虚拟机配置选项:
--security SECURITY 设定域安全驱动器配置。
--numatune NUMATUNE 为域进程调整 NUMA 策略。
--memtune MEMTUNE 为域进程调整内粗策略。
--blkiotune BLKIOTUNE 为域进程调整 blkio 策略
--memorybacking MEMORYBACKING 为域进程设置内存后备策略。例如:
--memorybacking hugepages=on
--features FEATURES 设置域 <features> XML。例如:
--features acpi=off
--features apic=on,eoi=on
--clock CLOCK 设置域 <clock> XML。例如:
--clock offset=localtime,rtc_tickpolicy=catchup
--pm PM 配置 VM 电源管理功能
--events EVENTS 配置 VM 生命周期管理策略
--resource RESOURCE 配置 VM 资源分区(cgroups)
虚拟化平台选项:
-v, --hvm 客户端应该是一个全虚拟客户端
-p, --paravirt 这个客户端一个是一个半虚拟客户端
--container 这台虚拟机需要一个容器客户端
--virt-type HV_TYPE 要使用的管理程序名称(kvm、qemu、xen等等)
--arch ARCH 模拟的 CPU 构架
--machine MACHINE 要模拟的机器类型
其它选项:
--autostart 引导主机时自动启动域。
--wait WAIT 等待安装完成的分钟数。
--noautoconsole 不要自动尝试连接到客户端控制台
--noreboot 完成安装后不要引导虚拟机。
--print-xml [XMLONLY] 输出所生成域 XML,而不是创建虚拟机
--dry-run 完成安装步骤,但不要创建设备或者定义虚拟机。
--check CHECK 启用或禁用验证检查。例如:
--check path_in_use=off
--check all=off
-q, --quiet 禁止无错误输出
-d, --debug 输入故障排除信息
说明:
使用 ‘--option=?‘ 或者 ‘--option help‘ 查看可用子选项
有关示例及完整选项语法,请查看 man page。
1.2.5 虚拟机管理命令
[root@s1 src]# virsh list #列出当前开机的
[root@s1 src]# virsh list --all 3列出所有
[root@s1 src]# virsh shutdown CentOS-7-x86_64 #正常关机
[root@s1 src]# virsh start CentOS-7-x86_64 #正常关机
[root@s1 src]# virsh destroy centos7 #强制停止/关机
[root@s1 src]# virsh undefine Win_2008_r2-x86_64 #强制删除
[root@s1 src]# virsh autostart centos7 #设置开机自启动
2.创建默认网络(NAT)虚拟机
说明:
1.指定虚拟机名称:"--name"
2.指定虚拟机CPU多少核:"--vcpus"
3.指定内存大小:"--ram"或者“--memory”
4.指定ISO镜像在什么地方:"--cdrom="
5.指定磁盘文件:"disk path="
6.指定虚拟机网络:"--network"(企业中“桥接网络”用的最多,“NAT网络是默认网络,用‘default’表示”看情况使用;使用哪种网络需要知道它们的名称)
7.指定虚拟机图形界面:"--graphics"(通常使用“VNC”,缺点:虚拟机不能复制;桌面虚拟化使用“spice”,对配置要求很高,尤其显卡;两种方式的端口都可以自己指定)
8.指定键盘、鼠标等(一般不用指定):“--input ”
9.指定控制接口(一般不用指定):“--console”
10.指定CPU架构(看情况指定,x86、x64):“--arch”
11.指定虚拟机类型“kvm、qemu、xen”(默认是KVM):“--virt-type”
12.指定“宿主机重启后”,虚拟机是否自动开机(可选项,一般设置为自动开机):“--autostart”
创建默认网络(NAT)虚拟机
[root@centos7 src]# virt-install --virt-type kvm --name linux36 --ram 512 --vcpus 1 --autostart --cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso --disk path=/var/lib/libvirt/images/centos.qcow2 --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
说明:
“--graphics vnc,listen=0.0.0.0 --noautoconsole”表示:
指定vnc,vnc监听0.0.0.0地址,不自动连接控制台(通常是人为连接)
创建虚拟机后,要赶快连接虚拟机
2.1 连接“新建虚拟机”的方式
- 在宿主机创建好虚拟机后,会出现一个“5900”端口;如果之前创建了很多虚拟机,那选择“59”开头共四位数的端口
1.通过VNC客户端连并安装虚拟机
2.使用kvm后台管理窗口连接
1.此方式的连接前提:
(1).在“连接工具(我用的xshell5)”-->属性-->隧道-->转发X11连接到(X):"Xmanager(M)"
(2).如果使用xshell,需要是企业版
2.连接:
[root@centos7 ~]# virt-manager
2.2在新建虚拟机界面的开机界面,指定新建虚拟机的网卡是“eth0”的方式
进入开机界面后按“Tab”,在“···x64 quiet”后面输入:
net.ifnames=0 biosdevname=0
2.3之后按照往常一样安装系统即可。
可参考我的另一篇博客:
2.3安装电源管理包
安装虚拟机重启后,有时会出现启动不了的情况,那是因为没有安装“acpid”软件包
通过“acpid”,我们可以对虚拟机进行启动和关闭等操作:
1.安装电源管理包:
[root@centos7 ~]# yum -y install acpid
2.管理虚拟机:
列出当前已经开启的虚拟机:
virsh list
查看已经关闭的虚拟机:
birsh list--all
正常开启名称为“kvm1”的虚拟机
virsh start kvm1
正常关机名称为“kvm1”的虚拟机
virsh shutdown kvm1
强制关机名称为“kvm1”的虚拟机
virsh destory kvm1
注释:通常用于Java服务导致某个虚拟机僵死了。
强制删除名称为“kvm1”的虚拟机
virsh undefine kvm1
设置开机自启动
virsh autostart kvm1
3.创建桥接网络虚拟机(实现虚拟机内外网隔离)
NAT网络的虚拟机可以访问宿主机外的主机,但宿主机外的主机不可以访问NAT网络的虚拟机。
桥接网络的虚拟机,通过设置网卡绑定,可以反问宿主机外的主机,也可以让宿主机外主机或虚拟机,访问桥接网络的虚拟机。(详见下面的KVM虚拟机的高可用架构)
3.1概念
1.虚拟机实现内外网隔离的前提
-
宿主机最少四块物理网卡,每两块一组,做网卡绑定,设置br0、br1为两个网段,br0是“192.168.0.0/16”用于访问外网;br1是“10.20.0.0/16”用于内网之间的访问,这个网段需要在防火墙设置为“不能访问外网”。
- 网卡绑定可查看我的另一篇博客:安装生产环境业务机使用的CentOS系统
2.思路
-
根据虚拟机对网络的要求(内外网都访问 或 只内网之间访问),来设置虚拟机网卡添加几块。
-
如内外网都访问,就添加两块网卡,一块设置br0的网络,网关指向br0的IP地址;一块设置br1的网络,网关指向br1的IP地址。
- 如只内网之间访问,就只添加一块网卡,设置br1的网络,网关指向为br1的IP地址。
-
3.虚拟机访问外网的通讯过程
当虚拟机“kvm2”想访问外网,通过br0,br0指向bond0,把访问流量转发到宿主机的物理网卡"ethX"(eth0、eth1)。
物理网卡通过宿主机内核中的路由,把虚拟机访问外网的请求转发到互联网。
4.虚拟机内网之间访问的通讯过程
当虚拟机(kvm1、kvm3、kvm4)想访问内网的其他虚拟机(存储服务器、MySQL数据库),通过br1,br1指向bond1,把访问流量转发到宿主机的物理网卡“ethX”(eth2、eth3)。
物理网卡通过宿主机内核中的路由,把虚拟机访问内网的其他虚拟机的请求转发到其他物理网卡,
通过bond1,在到br1,然后访问到内网其他虚拟机。如“存储服务器”、“MySQL数据库服务器”等。
注意:虚拟机使用br1和bond1的网络,是不能上外网的,为了服务器的安全性。
5.brX 和 bondX
-
通过bondX决定宿主机物理网卡使用哪种模式(高可用、轮询)为虚拟机的网络“brX”提供服务
- 高可用:如果bond0是高可用模式,虚拟机(kvm1、kvm2)的网络请求,通过br0,由bond0转发到物理网卡“eth0”,在转发给宿主机内核的路由从而访问外网;当物理网卡“eth0”发生故障,由物理网卡“eth1”代替“eth0”工作。
- 轮询:如果bond0是轮询模式,虚拟机(kvm1、kvm2)的网络请求,通过br0,由bond0转发到物理网卡“eth0”和物理网卡“eth1”,在转发给宿主机内核的路由从而提升访问外网的效率。
3.2KVM虚拟机的高可用架构
说明:
两台宿主机“172.18.200.101”、“172.18.200.102”分别有四块网卡,都做了网卡绑定,且网卡绑定后的“br0”、“br1”网段都一样。
在宿主机"172.18.200.101"创建虚拟机“vm1”、“vm2”。
在宿主机"172.18.200.102"创建虚拟机“vm3”、“vm4”。
通过图片可知:
“vm1”、“vm3”都有两块网卡,网关分别指向自己宿主机的“br0”、“br1”,可以实现内外网都能访问的效果。而且,因为两台宿主机的网段相同,虚拟的bond网段也相同,所以“vm1”能访问“vm3”、“vm4”;“vm3”能访问“vm1”、“vm2”。
“vm2”、“vm4”只有一块网卡,网关都指向自己宿主机的“br1”,可以实现内网之间的访问效果。而且,因为两台宿主机的网段相同,虚拟的bond网段也相同,所以“vm2”和“vm4”可以相互访问,也可以访问同网段的其他虚拟机,但访问不了外网。
总结:
-
内外网都能访问的虚拟机,可用于负载均衡服务器
- 只能内网之间访问的虚拟机,可用于数据库、存储服务器等
3.3创建桥接(建bridge)网络虚拟机
桥接网络可以让运行在宿主机上的虚拟机使用和宿主机同网段IP,并且可以从外部直接访问到虚拟机,目前企业中大部分场景都使用桥接网络。
3.3.1创建br0桥接网卡
1.确认系统已经安装桥接组件,否则桥接不成功导致服务器远程连接不上
yum install bridge-utils
2.创建桥接网卡配置
[root@s1 network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@s1 network-scripts]# vim ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=172.18.200.101
NETMASK=255.255.0.0
GATEWAY=172.18.0.1
DNS1=172.18.0.1
3.配置物理网卡
[root@s1 network-scripts]# vim ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
4.重启网络服务使之生效
[root@s1 network-scripts]# systemctl restart network
5.查看网络
[root@s1 network-scripts]# ifconfig
3.3.2 上传镜像并安装虚拟机
1.查看镜像
[root@s1 ~]# ll /usr/local/src/CentOS-7-x86_64-Minimal-1810.iso
-rw-r--r-- 1 qemu qemu 962592768 Jan 1 13:33 /usr/local/src/CentOS-7-x86_64-Minimal1810.iso
2.#创建磁盘:
[root@s1 ~]# qemu-img create -f qcow2 /var/lib/libvirt/images/centos7-bridge.qcow2 10G
Formatting ‘/var/lib/libvirt/images/centos7-bridge.qcow2‘, fmt=qcow2 size=10737418240
encryption=off cluster_size=65536 lazy_refcounts=off
3.创建桥接网络虚拟机
[root@s1 ~]# virt-install --virt-type kvm --name centos7-bridge --ram 1024 --vcpus 2 \
--cdrom=/usr/local/src/CentOS-7-x86_64-Minimal-1810.iso --disk path=/var/lib/libvirt/images/centos7-bridge.qcow2 \
--network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole
4.使用vnc或后台管理工具连接,创建虚拟机
3.3.3 验证虚拟机网络
1.查看IP地址
[root@centos7 ~]# ifconfig
2.是否能ping通百度
[root@centos7 ~]# ping www.baidu.com
3.3.4 从外部ssh虚拟机
1.ssh远程连接虚拟机
[root@s1 src]# ssh 172.18.144.43
The authenticity of host ‘172.18.144.43 (172.18.144.43)‘ can‘t be established.
ECDSA key fingerprint is SHA256:p4bEG12bcUs/SMkbwXcfT+idshg9+6NBB+sqF77scRk.
ECDSA key fingerprint is MD5:20:08:b7:97:c0:53:f0:26:78:0a:89:ea:89:3a:9f:cb.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘172.18.144.43‘ (ECDSA) to the list of known hosts.
root@172.18.144.43‘s password:
Last login: Fri Jun 14 18:38:05 2019
2.查看PCI设备
[root@localhost ~]# yum install pciutils #查看PCI设备
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package pciutils-3.5.1-3.el7.x86_64 already installed and latest version
Nothing to do
[root@localhost ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation 82371SB PIIX3 IDE [Natoma/Triton II]
00:01.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Cirrus Logic GD 5446
00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
00:04.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller
#1 (rev 03)
00:04.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller
#2 (rev 03)
00:04.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller
#3 (rev 03)
00:04.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller
#1 (rev 03)
00:05.0 Communication controller: Red Hat, Inc. Virtio console #virtio为半虚拟化驱动
00:06.0 SCSI storage controller: Red Hat, Inc. Virtio block device
00:07.0 Unclassified device [00ff]: Red Hat, Inc. Virtio memory balloon
00:08.0 Unclassified device [00ff]: Red Hat, Inc. Virtio RNG
4.扩展:安装装windows server虚拟机
virtio 是一种 I/O 半虚拟化解决方案,是一套通用 I/O 设备虚拟化的程序,是对半虚拟化 Hypervisor 中的一组通用I/O 设备的抽象。提供了一套上层应用与各 Hypervisor 虚拟化设备(KVM,Xen,VMware等)之间的通信框架和编程接口,减少跨平台所带来的兼容性问题,大大提高驱动程序开发效率,windows 系统需要单独安装virtio驱动,linux系统自带virtio驱动。
4.1安装windows server 2008
1.查看Windows server镜像
[root@s1 src]# ll /usr/local/src/windows_server_2008_r2.iso
-rw-r--r-- 1 root root 3368962048 Jun 14 18:16 /usr/local/src/windows_server_2008_r2.iso
2.创建磁盘
[root@s1 src]# qemu-img create -f qcow2 /var/lib/libvirt/images/Windows-2008.qcow2 200G
3.创建Windows server虚拟机
[root@s1 src]# virt-install --virt-type kvm --name Win_2008_r2 --ram 1024 --vcpus=2 --os-type=windows --cdrom=windows_server_2008_r2.iso \
--disk path=/var/lib/libvirt/images/Windows-2008.qcow2,format=qcow2,bus=virtio \
--disk path=/usr/local/src/virtio-win-0.1.141_amd64.vfd,device=floppy --network \
bridge=br0,model=virtio --graphics vnc,listen=0.0.0.0 --noautoconsole
4.2安装过程
加载驱动
将网络驱动和块设备驱动都加载一遍
之后分区,安装
验证windows 驱动