码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 篇 | KVM

时间:2019-06-20 00:49:36      阅读:1670      评论:0      收藏:0      [点我收藏+]

标签:设置   tools   path   error   ons   speed   orm   toc   上传   

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之后按照往常一样安装系统即可。

可参考我的另一篇博客:

安装生产环境业务机使用的CentOS系统

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 驱动

技术图片

Linux 篇 | KVM

标签:设置   tools   path   error   ons   speed   orm   toc   上传   

原文地址:https://blog.51cto.com/13465487/2411128

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!