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
[[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参数是否支持虚拟化
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