物理机搭建KVM并与局域网互访
- ★KVM简介
- 1、KVM概述
- 工作原理
- 2、KVM的核心组件:
- 3、KVM运行模式
- 4、KSM机制
- 5、kvm工具集:
- ★ 安装步骤
- 虚拟机创建成功以后需要做的
★KVM简介
1、KVM概述
- 以色列qumranet公司研发,后被RedHad公司收购
(1)kvm只支持x86平台 (2)依赖于 HVM,inter VT AMD-v
- KVM是(Kernel-based Virtual Machine)的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。
- KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization。
工作原理
KVM 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。KVM 中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 KMV 能够使用 Linux 内核的已有功能。 但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
2、KVM的核心组件:
(1)、 kvm.ko内核模块 (kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能; (2)、 qemu-kvm:用户空间的工具程序 qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;用于实现一个虚拟机实例; (3)libvirt:工具箱用于与主流操作系统虚拟化进行交互工具
- libvirt是cs架构应用:
- 客户端:libvirt-client
virt-manager
- daemon:图像化工具
libvirt-deaemon
3、KVM运行模式
KVM模块load进内存之后,系统的运行模式:
- 内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式;
- 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
- 来宾模式:GuestOS的用户模式;所有的非IO类请求;
4、KSM机制
扫描物理内存,发现多个虚拟机实例有相同的内存空间,合并成为一个共享内存空间,节省内存。
5、kvm工具集:
- qemu工具
qemu-kvm:用户空间的工具程序,创建管理虚拟机
qemu-img:是 QEMU 的磁盘管理工具
- libvirt工具
GUI:virt-manager, virt-viewer:图形化管理 CLI: virsh, virt-install:创建管理虚拟机
- 集群工具:
libvirtd:管理虚拟机和其他虚拟化功能,比如存储管理,网络管理的软件集合。Libvirt是一个C工具包的虚拟化功能与最新版本的Linux(以及其他操作系统)。主包包含libvirtd服务器虚拟化支持出口。
★ 安装步骤
- 此次物理机配置
运行内存 | 磁盘空间 | 操作系统 |
---|---|---|
32G | 2块4T(RAID1阵列) | linux-centos7(桌面版) |
1.查看系统版本
代码语言:javascript复制[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
2.检查是否开启虚拟化。有VMX或者svm
代码语言:javascript复制[root@localhost ~]# cat /proc/cpuinfo | egrep 'vmx|svm'
如果返回无数据则无法搭建,虚拟机安装请参考点击 物理机的话安装系统的时候弄桌面版 虚拟机和物理机都建议弄桌面 也方便KVM工具操作
3.查看是否加载kvm
代码语言:javascript复制[root@localhost ~]# lsmod | grep kvm
kvm_intel 183621 4
kvm 586948 1 kvm_intel
irqbypass 13503 3 kvm
没有任何输出即为报错
4.安装kvm相关的软件包
代码语言:javascript复制[root@localhost ~]# yum -y install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer
5.修改配置文件 添加一些优化参数
代码语言:javascript复制vi /etc/sysctl.conf
#末尾添加
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.ipv4.ip_nonlocal_bind = 1
为了防止报错
代码语言:javascript复制net.bridge.bridge-nf-call-ip6tables = 0 找不到
net.bridge.bridge-nf-call-iptables = 0 找不到
net.bridge.bridge-nf-call-arptables = 0 找不到
临时添加模块
代码语言:javascript复制modprobe br_netfilter
modprobe ip_vs_rr
开机自动加载模块
代码语言:javascript复制cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
lsmod |grep br_netfilter
使配置文件生效
代码语言:javascript复制sysctl -p
6.修改宿主机网络为桥接 如果不设置桥接,后面创建出来的虚拟机不能与局域网内的主机互访 记得把配置文件备份一份 有的默认网卡名叫ens33,有的叫eth0,都可以无所谓
代码语言:javascript复制[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-em1 /root/ifcfg-em1_backup
再复制出来一份文件叫br0,一会作为桥接网卡
代码语言:javascript复制[root@localhost network-scripts]# cp ifcfg-em1 ifcfg-br0
修改配置文件如下:
代码语言:javascript复制vi /etc/sysconfig/network-scripts/ifcfg-em1
#文件内容如下:
TYPE=Ethernet
NAME=em1
UUID=b8730dd7-4855-401c-8ad3-5c009969089c #UUID用自己机器默认的
DEVICE=em1
ONBOOT=yes
BRIDGE=br0 #这个br0是桥接网卡
#文件内容只需要有以上几个就行,其他的都删除或者注释,否则后面会报错
修改桥接网卡
代码语言:javascript复制vi /etc/sysconfig/network-scripts/ifcfg-br0
#文件内容如下
TYPE=Bridge #桥接
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_AUTOCONF=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
BOOTPROTO=static #静态IP
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.166 #根据自己使用的网络进行设置
NETMASK=255.255.255.0 #根据自己使用的网络进行设置
GATEWAY=192.168.1.1 #根据自己使用的网络进行设置
DNS1=8.8.8.8 #设置一下DNS要不不能上网
DNS2=114.114.114.114
#文件内容只需要有以上几个就行,其他的都删除或者注释,否则后面会报错
重启网络并重启主机
代码语言:javascript复制systemctl restart network
网络重启之后建议把主机也重启一下
reboot
开机以后可以看一下自己的网络是不是配置成功
代码语言:javascript复制ip a
7.启动
代码语言:javascript复制[root@localhost ~]# systemctl start libvirtd
8.进入图形华界面
代码语言:javascript复制[root@localhost ~]# virt-manager
9.主机导入镜像 位置自定义
10.开始创建KVM虚拟机 点击文件,新建虚拟机。
本地安装介质,前进!
后面我现在没截图 有机会我会完善文章 后面都是图形化操作比较简单
- 选择镜像
- 配置运行内存,cpu
- 配置磁盘空间这个注意一下(这个是根据自己物理机磁盘空间分布情况而定) 默认的位置应该是/var/lib/libvirt,显示我只有50G可用 但是我的4T内存挂载到/home,我想从4T中分给他们用 在选择的时候自己根据目录创建一个卷就行了
- 设置网络的时候选择桥接网络 (只有使用桥接网络才可以达到与局域网其他主机互访) 应该是桥接br0主机em1
后面就可以启动虚拟机一系列进行系统设置了
虚拟机创建成功以后需要做的
设置一下网络,修改固定ip、添加DNS可以上网 修改文件
代码语言:javascript复制vi /etc/sysconfig/network-scripts/ifcfg-eth0
#我下面只写出需要修改或添加的位置:
BOOTPROTO=static #修改
ONBOOT=yes #修改
#尾部添加 根据自己网络设置
IPADDR=192.168.1.167
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=8.8.8.8
DNS2=144.144.144.144
修改好之后重启网络
systemctl restart network
验证: 在虚拟机上试试能不能上网
用同局域网内的主机是否能ping通
成功