KVM部署篇

2018-05-31 12:39:58 浏览数 (1)

KVM 介绍

KVM是以色列初创公司Qumranet开发,2008年9月RedHat公司收购了Qumranet

  • KVM是Linux内核的一个模块,它把Linux内核变成了一个Hypervisor
  • KVM是完全开源的,RedHat基于KVM的虚拟化解决方案叫做RHEV
  • KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能,只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样
  • QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所以的硬件,性能不强
  • KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM
  • 磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的
  • KVM和QEMU-KVM通信是通过/dev/kvm实现的
  • libvirt是用来管理KVM虚拟机的API,其命令为virsh
KVM架构图
CentOS 7.3 安装KVM
  • 关闭 iptables 或者 firewalld
  • 关闭 selinux
  • 格式化新磁盘,挂载到 /kvm_data
代码语言:javascript复制
[[email protected] ~]# fdisk -l

[[email protected] ~]# mkfs.ext4 /dev/sdb

[[email protected] ~]# blkid /dev/sdb
/dev/sdb: UUID="378895da-ded5-4312-8194-748125c795db" TYPE="ext4"

[[email protected] ~]# mount /dev/sdb /kvm_data/

[[email protected] ~]# vim /etc/fstab 
//增加如下:
/dev/sdb        /kvm_data       ext4    defaults        0 0
  • 下载一个centos7的镜像文件
  • 检查cpu参数是否支持虚拟化
代码语言:javascript复制
grep -Ei 'vmx|svm' /proc/cpuinfo
安装kvm
代码语言:javascript复制
yum install -y  virt-*  libvirt  bridge-utils qemu-img
配置网卡

增加一块虚拟网卡,目的就是为了打通宿主机和虚拟机的通信。

代码语言:javascript复制
[[email protected] ~]# cd /etc/sysconfig/network-scripts/

[[email protected] network-scripts]# cp ifcfg-ens33 br0

[[email protected] network-scripts]# vim br0 

TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.161.161
NETMASK=255.255.255.0
GATEWAY=192.168.161.2
DNS1=119.29.29.29

[[email protected] network-scripts]# vim ifcfg-ens33 

TYPE=Ethernet
BOOTPROTO=static
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0

[[email protected] ~]# ifconfig 
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.161.161  netmask 255.255.255.0  broadcast 192.168.161.255
        inet6 fe80::d80e:8ff:fe32:4775  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:26:e9:ae  txqueuelen 1000  (Ethernet)
        RX packets 46  bytes 4473 (4.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 46  bytes 5831 (5.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:26:e9:ae  txqueuelen 1000  (Ethernet)
        RX packets 153404  bytes 210172913 (200.4 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35293  bytes 4746555 (4.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
启动libvirtd
代码语言:javascript复制
[[email protected]hdya01 ~]# systemctl start libvirtd
[[email protected] ~]# ps axu |grep !$
ps axu |grep libvirtd
root      9127  5.1  0.4 615520 18384 ?        Ssl  14:28   0:00 /usr/sbin/libvirtd
root      9260  0.0  0.0 112680   976 pts/1    S    14:29   0:00 grep --color=auto libvirtd
查看桥接状态
代码语言:javascript复制
[[email protected] ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c2926e9ae	no		ens33
virbr0		8000.52540058db51	yes		virbr0-nic
创建虚拟机并安装CentOS 7

我这边测试是使用搭建的XFTP客户端直接上传的。这样快些。也就5分钟的样子。

命令行安装centos7
代码语言:javascript复制
virt-install --name=zhdya01 --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7.3-x86_64-DVD-1611.iso --disk path=/kvm_data/zhdya01.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial  --extra-args="console=tty0 console=ttyS0"
代码语言:javascript复制
virt-install :使用命令安装
--name=zhdya01 :名字为zhdya01
--memory=512,maxmemory=1024 :最小内存为512M 最大为1024M
--vcpus=1,maxvcpus=2 :最大最小CPU
--os-type=linux :系统类型
--os-variant=rhel7 :版本
--location=/tmp/CentOS-7.3-x86_64-DVD-1611.iso :镜像位置(注意你的可能和我的不一致)
--disk path=/kvm_data/zhdya01.img,size=10 :安装路径
--bridge=br0 :桥接网卡
--graphics=none :是否为图形界面(图形界面建议使用vnc软件连接)
--console=pty,target_type=serial  :终端的属性
--extra-args="console=tty0 console=ttyS0"

经过一段时间的硬件检查,然后到了如下这个操作界面:

输入对应菜单的编号回车 即可进入设置。等我们设置完每一项,在每一项的前面对应的方括号内都会变成 [X] 注意磁盘设置的时候是选择LVM还是标准分区。

等待全部设置完毕,按 b 开始安装:

等待安装的差不多之后就会自动重启(当然宿主机也会重新启动!)。

虚拟机管理
代码语言:javascript复制
[[email protected] network-scripts]# virsh list      //查看虚拟机列表,只能看到运行的虚拟机
 Id    名称                         状态
----------------------------------------------------

[[email protected] network-scripts]# virsh list --all        //查看虚拟机列表,包括未运行的虚拟机
 Id    名称                         状态
----------------------------------------------------
 -     zhdya01                        关闭

[[email protected] network-scripts]# virsh start zhdya01     //启动zhdya01这个虚拟主机
v域 zhdya01 已开始

[[email protected] network-scripts]# virsh list      
 Id    名称                         状态
----------------------------------------------------
 1     zhdya01                        running

[[email protected] network-scripts]# virsh console zhdya01       //进入主机的控制端
连接到域 zhdya01

一般第一次进入虚拟主机,需要重新获得一个新的IP地址:

代码语言:javascript复制
[[email protected] ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:02:cf:d7 brd ff:ff:ff:ff:ff:ff
    
[[email protected] ~]# dhclient eth0

[[email protected] ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:02:cf:d7 brd ff:ff:ff:ff:ff:ff
    inet 192.168.161.129/24 brd 192.168.161.255 scope global dynamic eth0

这样我就获得了一个和宿主机一个网段的IP地址(当然网络也是畅通的)

代码语言:javascript复制
[[email protected] ~]# ping www.okay686.cn
PING www.okay686.cn (122.190.3.199) 56(84) bytes of data.
64 bytes from 122.190.3.199 (122.190.3.199): icmp_seq=1 ttl=128 time=32.7 ms
64 bytes from 122.190.3.199 (122.190.3.199): icmp_seq=2 ttl=128 time=40.0 ms

//安装一个net-tools 待会测试用
[[email protected] ~]# yum install -y net-tools
已加载插件:fastestmirror
base                                                     | 3.6 kB     00:00     
extras                                                   | 3.4 kB     00:00     
updates                                                  | 3.4 kB     00:00     
(1/4): base/7/x86_64/group_gz                              | 156 kB   00:01     
(2/4): extras/7/x86_64/primary_db                          | 166 kB   00:02     
(3/4): base/7/x86_64/primary_db                            | 5.7 MB   00:15  

更多操作经常使用的指令如下:

代码语言:javascript复制
virsh shutdown zhdya01  //关闭虚拟机

virsh start zhdya01     //开启虚拟机

virsh destroy zhdya01   //类似stop,这个是强制停止

virsh undefine zhdya01  //彻底销毁虚拟机,会删除虚拟机配置文件,virsh list --all就看不到了

ls /etc/libvirt/qemu/  //可以查看虚拟机配置文件

virsh autostart zhdya01    //宿主机开机该虚拟机也开机

virsh autostart --disable zhdya01  //解除开机启动

virsh suspend zhdya01  //挂起

virsh resume zhdya01   //恢复
克隆虚拟机

克隆虚拟机举个例子就和你在Vmware上面的操作差不多,是一个原理。使用场景:当我们在一台虚拟机搭建了台LNMP服务,后期一台虚拟主机可能扛不住那么大的使用压力,我们可以再次创建一台新的虚拟机来分担。这样我们只需要克隆一台修改下配置即可,大大缩短了时间,提高了工作效率!

首先需要把克隆的机器断电

代码语言:javascript复制
[[email protected] ~]# virsh shutdown zhdya01

[[email protected] ~]# virt-clone --original zhdya01 --name zhdya02 --file /kvm_data/zhdya02
正在分配 'zhdya02'                                                                                                             |  10 GB  00:01:15     

成功克隆 'zhdya02'。

--original指定克隆源虚拟机
--name指定克隆后的虚拟机名字
--file指定目标虚拟机的虚拟磁盘文件

如果zhdya01虚拟机开机状态,则提示先关闭或者暂停虚拟机

针对刚刚克隆的机器 我们去测试下 刚刚安装的 net-tools 命令是否存在

代码语言:javascript复制
[root@zhdya01 ~]# virsh start zhdya02
域 zhdya02 已开始

[root@zhdya01 ~]# virsh console zhdya02
连接到域 zhdya02


[root@localhost ~]# ifconfig        //可以使用,但是没有IP地址
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 52:54:00:44:3b:f6  txqueuelen 1000  (Ethernet)

[root@localhost ~]# dhclient eth0

[root@localhost ~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.161.130  netmask 255.255.255.0  broadcast 192.168.161.255

这样就玩成了一个虚拟主机的克隆,且也可以成功获取一个和宿主机一样的IP地址。

但是随着工作的需要,未来我们可能需要使用咱们的宿主机(类似于跳板机...)然后搞个ansible 是不是就很方便的去管理了呢? 当然咱们的虚拟主机也可以使用 ssh 的方式去连接,没有必要使用 virsh console 这个语句了。

代码语言:javascript复制
[[email protected] ~]# ssh-copy-id -i ./.ssh/id_rsa.pub [email protected]192.168.161.130     //这样我们就成功的在虚拟主机上面配置了宿主机的公钥。

[[email protected] ~]# ssh 192.168.161.130
Last login: Sun Feb  4 17:01:00 2018
[[email protected] ~]# ip addr     //这样就成功的从宿主机登录到了虚拟主机。

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:44:3b:f6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.161.130/24 brd 192.168.161.255 scope global dynamic eth0

未来的工作当中,当然我们也是使用这样方式来管理虚拟主机的。

快照管理

快照的功能,不多说了,很方便,公司目前几乎所有的服务器均在阿里云,有时候我们的备份方式之一就是使用快照,简单_粗暴_效率!

代码语言:javascript复制
[[email protected] ~]# virsh snapshot-create zhdya01     //创建一个zhdya02的快照
已生成域快照 1517735766

[[email protected] ~]# virsh snapshot-list zhdya01       //查看快照列表
 名称               生成时间              状态
------------------------------------------------------------
 1517735766           2018-02-04 17:16:06  0800 running

[[email protected] ~]# qemu-img info /kvm_data/zhdya01.img   
image: /kvm_data/zhdya01.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.3G
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: true

file format: qcow2 //快照文件的类型。

看到了,如上的文件类型,我就需要说下这个:raw格式的虚拟磁盘不支持做快照,qcow2支持。

代码语言:javascript复制
virsh snapshot-current zhdya01  //查看当前快照版本

[[email protected] ~]# ls /var/lib/libvirt/qemu/snapshot/    //查看所有快照配置文件(创建一次,就会在zhdya目录里面生成一个快照的配置文件)
zhdya01  zhdya02

virsh snapshot-revert zhdya01 1517735766    //恢复指定快照

[[email protected] ~]# virsh snapshot-delete zhdya01 1517736361      //删除快照
已删除域快照 1517736361 

0 人点赞