kvm企业级虚拟化环境部署
由于公司需要不得不要搭建Linux环境,自己做的课题是ELK日志分析相关。因此要大干一场,一下子计划采用近10台机器来做试验,但由于我这里只有三台物理机,所以我就搞起了虚拟化kvm。在Linux里面要安装三台Linux系统。满足实验的要求来。本次我们讲解的环境全部都是在文本界面下安装,没有使用图形桌面和VNC工具图形展示。
1、首先是准备一台物理机,安装上去Linux操作系统,这里使用centos7.5版本。在安装kvm之前需要检测系统CPU是否支持虚拟化
[root@chaofeng ~]# grep -Ei 'vmx|svm' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf eagerfpu pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx hypervisor lahf_lm epb tpr_shadow vnmi ept vpid xsaveopt dtherm ida arat pln pts
如果有过滤出vmx或svm关键字就代表支持虚拟化,vmx是Intel的CPU,svm是AMD的CPU
2、开始安装kvm环境,此处需要epel的yum源,如果系统没有安装,可使用yum install -y epel-release来一键安装或者安装阿里云的epel源(点击)也可以。
yum install -y kvm qemu-kvm python-virtinst libvirt libvirt-python virt-manager libguestfs-tools bridge-utils virt-install
此处稍微花费点时间。
3、安装好之后,我们设置为开机启动项
#systemctl enable libvirtd
#reboot
重启过后检测是否加载kvm模块
[root@chaofeng boot]# lsmod | grep kvm kvm_intel 183705 9 kvm 615914 1 kvm_intel irqbypass 13503 7 kvm
查看kvm程序有没有真正启动。
[root@chaofeng network-scripts]# ps aux | grep libvirtd root 6242 0.0 0.7 1346152 11424 ? Ssl 06:46 0:01 /usr/sbin/libvirtd root 7910 0.0 0.0 112712 976 pts/4 S+ 07:53 0:00 grep --color=auto libvirtd
如果没有的话,我们就使用systemctl start libvirtd来启动程序。
4、配置网卡
我自己选择的是桥接模式组件网络,因为我需要连同各个不同物理机上的虚拟机才行。关于桥接模式与NAT模式的区别,大家可以自行百度查看。我这里仅仅列出实现的方法。
在桥接模式中,三台虚拟机使用的是同一个桥接网卡。
3.1、首先是复制一份物理网卡ens33的配置文件并命名为ens33
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-br0
3.2、修改ens33网卡配置文件
[root@chaofeng network-scripts]# cat ifcfg-ens33 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=ccecf4a6-b71e-43ec-bd26-78af2a3f6ba5 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.15.10 NETMASK=255.255.255.0 GATEWAY=192.168.15.2 DNS1=192.168.1.1 BRIDGE=br0
主要是增加最后一行内容
3.3、修改br0配置文件
[root@chaofeng network-scripts]# cat ifcfg-br0 TYPE=Bridge 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=br0 #UUID=ccecf4a6-b71e-43ec-bd26-78af2a3f6ba5 DEVICE=br0 ONBOOT=yes IPADDR=192.168.15.11 NETMASK=255.255.255.0 GATEWAY=192.168.15.2 DNS1=192.168.1.1
主要是修改上面的三处。我这里是配置为静态的IP,也可以配置为dhcp自动获取ip地址。
然后重启网卡。
systemctl restat network
3.4、然后查看一下网卡信息
[root@chaofeng network-scripts]# 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:ed:39:ac brd ff:ff:ff:ff:ff:ff 3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 00:0c:29:ed:39:ac brd ff:ff:ff:ff:ff:ff inet 192.168.15.11/24 brd 192.168.15.255 scope global noprefixroute br0 valid_lft forever preferred_lft forever inet6 fe80::adfd:e8a9:917c:55/64 scope link noprefixroute valid_lft forever preferred_lft forever 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:77:f5:af brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:77:f5:af brd ff:ff:ff:ff:ff:ff 6: vnet0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:30:5f:1b brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe30:5f1b/64 scope link valid_lft forever preferred_lft forever 7: vnet1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:92:a1:d8 brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe92:a1d8/64 scope link valid_lft forever preferred_lft forever 8: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:14:45:85 brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fe14:4585/64 scope link valid_lft forever preferred_lft forever
我们主要关注的是ens33网卡和br0桥接网卡。你会发现ens33原来的ip是不显示的,这是因为br0网卡占用了,并且此时物理机上的Linux系统的ip是被br0覆盖掉的,原先的ip地址不能再使用了。此时我们看到br0的ip地址就是这台物理机ip地址,这不是虚拟机的地址,这点大家要明白。况且我还没有开始创建虚拟机。
剩下的比如virbr0以及virbr0-nic则表示nat的地址,我们这次不使用这种NAT转换的网络模式,因此不做解释。
但是下面的vnet0、vnet1、vnet2确实很重要的东西,从上面我们知道br0代表是网桥,那么为什么把他叫做 “网桥” 呢?因为它在我们的物理机和虚拟机之间的网络通讯起着一个桥梁的作用,没有它,在桥接模式下我们的虚拟机将无法与物理机在同一个网络中。从我的机子来说,ens33是物理机的网卡,而br0则是网桥,那么vnet0、vnet1则是一个个的虚拟网卡,并且vnet0对应第一台物理机的网卡eth0,vnet1则是对应第二胎物理机的网卡eth0。虽然我们的虚拟机和物理机在同一个网络并且都拥有独立的IP,但是他们之间的通信却不是两台物理机之间的通信那么简单,大题是这样的:
而我们的桥接模式中的网络架构大概是这样的:
所以说br0与vnet0、vnet1发挥着巨大的作用,我们一定要搞清楚他。
3.5、查看网桥接口
请注意:你的此时可能还没有vnet0、vnet1、vnet2、vnet3这几个虚拟接口interface名称,这几个是当我们已经创建好虚拟机的时候才会有的。
4、开始安装虚拟机。
virt-install --name=elk01 --memory=2048,maxmemory=3072 --vcpus=2,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/data/CentOS-7-x86_64-DVD-1708.iso --disk path=/data/elk01.img,size=30 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
解释说明一下:
--name 指定虚拟机的名称 --memory 指定分配给虚拟机的内存资源大小 maxmemory 指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源 --vcpus 指定分配给虚拟机的CPU核心数量 maxvcpus 指定可调节的最大CPU核心数量 --os-type 指定虚拟机安装的操作系统类型 --os-variant 指定系统的发行版本 --location 指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL --disk path 指定虚拟硬盘所存放的路径及名称,size 则是指定该硬盘的可用大小,单位是G --bridge 指定使用哪一个桥接网卡,也就是说使用桥接的网络模式 --graphics 指定是否开启图形 --console 定义终端的属性,target_type 则是定义终端的类型 --extra-args 定义终端额外的参数
如果你的物理机系统是centos6,则上面的命令需要改正,如下所示:
virt-install --name=elk01 --ram=2048 --vcpus=2,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/data/CentOS-7-x86_64-DVD-1708.iso --disk path=/data/elk01.img,size=30 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"
如果你安装过程中出现错误:
[root@centos6-chaofeng2 ~]# virt-install --name=elk04 --ram=2600 --vcpus=2,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/usr/local/src/CentOS-7-x86_64-DVD-1708.iso --disk path=/data/elk04.img,size=28 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0" ERROR Guest name 'elk04' is already in use.
这说明你的虚拟机的名字冲突了,可以换个名字,如果执意要使用这个名字,需要把曾经安装过的虚拟机elk04卸载掉。方法是
[root@centos6-chaofeng2 ~]# virsh undefine elk04
Domain elk04 has been undefined
4.1、接下来要开始安装了。
只要我们看到的中括号里面的“!”号,都表示要进行设置。这些参数与我们在vmwear虚拟机里面安装都是一模一样的,只不过这里没有图形化,全部都是文本而已。当你选择好一个之后,中括号里面会变成“x”号,说明我们已经设置好这一项了。我一般都设置上图中的1、2、3、5、8这五项内容。
依次选择好之后,我们就可以按下“b”键开始安装了。当看到下图界面的时候,表示安装成功了,
此时按下回车键,重启虚拟机就可以使用了。
在虚拟机里面,我们按下 ctrl+] 组合按键表示退出当前虚拟机,但这并不是关机虚拟机。不过仅仅只有这一些命令是不够我们操作kvm虚拟机的,还需要学习其他的命令。
5、管理虚拟机的常用命令。
# virsh console study01 # 进入指定的虚拟机,进入的时候还需要按一下回车 # virsh start study01 # 启动虚拟机 # virsh shutdown study01 # 关闭虚拟机 # virsh destroy study01 # 强制停止虚拟机 # virsh undefine study01 # 彻底销毁虚拟机,会删除虚拟机配置文件,但不会删除虚拟磁盘 # virsh autostart study01 # 设置宿主机开机时该虚拟机也开机 # virsh autostart --disable study01 # 解除开机启动 # virsh suspend study01 # 挂起虚拟机 # virsh resume study01 # 恢复挂起的虚拟机
6、设置虚拟机联网。
进入到/etc/sysconfig/network-scripts目录下,找到ifcfg-eth0这个网卡配置文件,然后编辑这一行ONBOOT=yes,将no改为yes,然后重启网卡systemctl restart network即可。
此时我们就已经安装好了这样的一台虚拟机。但是如果是安装多个虚拟机的话,我们可以使用克隆来解决就行。如果还是自己手动安装的话,有一个需要注意的就是虚拟网卡的问题。就是在virt-install安装的时候,参数:--bridge仍然还是br0,即"--bridge=br0",为什么呢?因为桥接模式下,多个虚拟机使用的是同一块网卡,因此需要我们设置为br0。因为我在这里跳坑啦,所以给大家说明白。
其次,在安装第二台虚拟机的时候,主要修改的参数主要是:--name="elk02" 、--disk path="/data/elk02.img"这两个参数。这两个是必须修改项,其他的可酌情修改。
7、克隆虚拟机
[root@centos6-chaofeng2 ~]# virt-clone -o elk04 -n elk05 -f /data/elk05.img Cloning elk04.img 78% [=========================================- ] 2.8 MB/s | 22 GB 36:33 ETA
-o:后跟旧的系统的名称
-n:后跟克隆后的新系统的名称
-f:后跟克隆后的系统存放的位置