KVM虚拟化基本部署
1.KVM是Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM已成为学术界的主流VMM之一
2.KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。而Xen早期则是基于软件模拟的Para-Virtualization,新版本则是基于硬件支持的完全虚拟化。但Xen本身有自己的进程调度器,存储管理模块等,所以代码较为庞大。广为流传的商业系统虚拟化软件VMware ESX系列是基于软件模拟的Full-Virtualization
虚拟化发展过程:
IDC数据中心设备租用 → 提出虚拟化方案,出现OpenVZ → 共享优化出现Xen,提出半虚架构,但是操作复杂 → 进入全虚KVM,不需要和内核接触,只需要安装管理工具
案例概述
1.公司部分Linux服务器利用率不高,为充分利用这些Linux服务器,可以部署KVM,在物理机上运行多个业务系统
2.例如在运行Nginx的服务器.上部署KVM,然后在虚拟机上运行Tomcat
案例前置知识点
KVM虚拟化架构
KVM模块直接整合在Linux内核中
KVM组成:
KVM Driver:
1.虚拟机创建
2.虚拟机内存分配
3.虚拟CPU寄存器读写
4.虚拟CPU运行
QEMU (经过简化与修改):
1.模拟PC硬件的用户控件组件
2.提供I/O设备模型及访问外设的途径
KVM虚拟化三种模式:
1.客户模式(虚拟机)
2.用户模式(工具)
3.内核模式
KVM工作原理:
Demo:
环境准备:
1.需要先添加一块磁盘:大小为20G
2.处理器的设置:虚拟化引擎的选项全部勾
[ ~]# cd /dev [ dev]# ls sda sda1 sda2 sda3 sda4 sda5 sdb #此时有sdb硬盘 [ dev]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 Device does not contain a recognized partition table 使用磁盘标识符 0xba1e8e30 创建新的 DOS 磁盘标签。 命令(输入 m 获取帮助):n #输入n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p #输入p 分区号 (1-4,默认 1): 起始 扇区 (2048-41943039,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (2048-41943039,默认为 41943039): 将使用默认值 41943039 分区 1 已设置为 Linux 类型,大小设为 20 GiB 命令(输入 m 获取帮助):w #输入w保存退出 The partition table has been altered! Calling ioctl() to re-read partition table. 正在同步磁盘。 [ dev]# mkfs /dev/sdb1 #格式化 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签= OS type: Linux 块大小=4096 (log=2) 分块大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 1310720 inodes, 5242624 blocks 262131 blocks (5.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=4294967296 160 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000 Allocating group tables: 完成 正在写入inode表: 完成 Writing superblocks and filesystem accounting information: 完成 [ dev]# mkdir /data #创建挂载 [ dev]# mount /dev/sdb1 /data/ [ data]# df -hT 文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sdb1 ext2 20G 44M 19G 1% /data #此时显示已经挂载 #电脑中有CentOS 7镜像文件的文件夹需要进行共享,设置账户Everyone可以进行读取,然后使用smbclient -L查看挂载 [ data]# smbclient -L //192.168.10.190/ Enter SAMBA\root‘s password: OS=[Windows 10 Home China 18363] Server=[Windows 10 Home China 6.3] Sharename Type Comment --------- ---- ------- database Disk F$ Disk 默认共享 gfs Disk IPC$ IPC 远程 IPC ISO Disk rpm Disk #此时显示ISO文件夹被共享 [ data]# mount.cifs //192.168.10.190/ISO /mnt Password for //192.168.10.190/ISO: [ data]# df -hT 文件系统 容量 已用 可用 已用% 挂载点 /dev/sdb1 20G 44M 19G 1% /data //192.168.10.190/ISO 226G 173G 54G 77% /mnt #此时显示文件成功挂载在mnt目录下 [ data]# cd /mnt/ [ mnt]# ls CentOS-7-x86_64-DVD-1708.iso
安装KVM:
[ mnt]# yum list #进行自检 [ mnt]# yum groupinstall "GNOME Desktop" -y #桌面环境 [ mnt]# yum install qemu-kvm -y #KVM模块 [ mnt]# yum install qemu-kvm-tools -y #KVM调试工具 [ mnt]# yum install virt-install -y #构建虚拟机的命令工具 [ mnt]# yum install qemu-img -y #qemu组件,创建磁盘,启动虚拟机 [ mnt]# yum install bridge-utils -y #网络支持工具 [ mnt]# yum install libvirt -y #虚拟机管理工具 [ mnt]# yum install virt-manager -y #图像化管理虚拟机 [ mnt]# egrep ‘(vmx|svm)‘ /proc/cpuinfo #查看是否支持虚拟化 [ mnt]# lsmod | grep kvm #检查KVM是否安装 kvm_intel 170086 0 kvm 566340 1 kvm_intel irqbypass 13503 1 kvm [ mnt]# systemctl start libvirtd [ mnt]# systemctl enable libvirtd #开机自启动
配置桥接实例:
[ mnt]# cd /data/ [ data]# mkdir vdisk viso [ data]# ls lost+found vdisk viso [ data]# cp -r /mnt/CentOS-7-x86_64-DVD-1708.iso /data/viso/ [ data]# ls viso/ CentOS-7-x86_64-DVD-1708.iso [ data]# cd /etc/sysconfig/network-scripts/ [ network-scripts]# cp -p ifcfg-ens33 ifcfg-br0 [ network-scripts]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.18.145 netmask 255.255.255.0 broadcast 192.168.18.255 inet6 fe80::6a0c:e6a0:7978:3543 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a4:cb:c7 txqueuelen 1000 (Ethernet) RX packets 6559352 bytes 9624037086 (8.9 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 364406 bytes 30690747 (29.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ......此处省略多行 [ network-scripts]# vim ifcfg-ens33 #在末行按o转下行插入 BRIDGE=br0 #插入完成后按Esc退出插入模式,输入:wq保存退出 [ network-scripts]# vim ifcfg-br0 TYPE="bridge" #Ethernet改为bridge PROXY_METHOD="none" BROWSER_ONLY="no" BOOTPROTO="static" #dhcp改为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" #ens33改为br0 DEVICE="br0" #ens33改为br0 ONBOOT="yes" IPADDR=192.168.18.145 #输入ens33的IP地址 NETMASK=255.255.255.0 #输入子网掩码 GATEWAY=192.168.18.1 #输入网关 #修改退出插入模式,输入:wq保存退出 [ network-scripts]# service network restart #重启网络服务 Restarting network (via systemctl): [ 确定 ] [ network-scripts]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.18.145 netmask 255.255.255.0 broadcast 192.168.18.255 inet6 fe80::e169:c641:eeea:50f7 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a4:cb:c7 txqueuelen 1000 (Ethernet) RX packets 20 bytes 1298 (1.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 35 bytes 4588 (4.4 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:a4:cb:c7 txqueuelen 1000 (Ethernet) RX packets 6559967 bytes 9624087097 (8.9 GiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 364793 bytes 30733147 (29.3 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ......以下省略多行 #桥接之后原来ens33的网卡IP到br0上了
回到图形化界面输入:
[ ~]# virt-manager