一、KVM虚拟化介绍
KVM 全称 kernel-based virtual machine,由Qumranet公司发起,2008年被RedHat收购。
KVM实现主要基于Intel-V或者AMD-V提供的虚拟化平台,利用普通的Linux进程运行于虚拟态的指令集,模拟虚拟机监视器和CPU。KVM不提供硬件虚拟化操作,其IO操作等都借助QEMU来完成。
KVM有如下特点:
- guest作为一个普通进程运行于宿主机
- guest的CPU(vCPU)作为进程的线程存在,并受到宿主机内核的调度
- guest继承了宿主机内核的一些属性,比如huge pages(大页表)
- guest的磁盘IO和网络IO会受到宿主机的设置的影响
- guest通过宿主机上的虚拟网桥与外部相连
KVM整体架构
每一个虚拟机(guest)在Host上都被模拟为一个QEMU进程,即emulation进程。
我们创建一个虚拟机后,用普通的ps 命令就可以查看到。
➜ ~ virsh list --all
Id Name State
----------------------------------------------------
1 kvm-01 running ➜ ~ ps aux | grep qemu libvirt+ 20308 15.1 7.5 5023928 595884 ? Sl 17:29 0:10 /usr/bin/qemu-system-x86_64 -name kvm-01 -S -machine pc-i440fx-wily,accel=kvm,usb=off -m 2048 -realtime mlock=off -smp 2 qemu ....
可以看到,此虚拟机就是一个普通的Linux进程,他有自己的pid。并且有四个线程,线程数量不是固定的,但是至少会有三个(vCPU,IO,Signal)。其中有两个是vCPU线程,有一个IO线程还有一个信号处理线程。
➜ ~ pstree -p 20308
qemu-system-x86(20308)-+-{qemu-system-x86}(20353) |-{qemu-system-x86}(20408) |-{qemu-system-x86}(20409) |-{qemu-system-x86}(20412)
虚拟CPU
guest的所有用户级别(user)的指令集,都会直接由宿主机线程执行,此线程会调用KVM的ioctl方式提供的接口加载guest的指令并在特殊的CPU模式下运行,不需要经过CPU指令集的软件模拟转换,大大的减少了虚拟化成本,这也是KVM优于其他虚拟化方式的点之一。
KVM向外提供了一个虚拟设备/dev/kvm,通过ioctl(IO设备带外管理接口)来对KVM进行操作,包括虚拟机的初始化,分配内存,指令加载等等。
虚拟IO设备
guest作为一个进程存在,当然他的内核的所有驱动等都存在,只是硬件被QEMU所模拟(后面介绍virtio的时候特殊)。guest的所有硬件操作都会有QEMU来接管,QEMU负责与真实的宿主机硬件打交道。
虚拟内存
guest的内存在host上由emulator提供,对emulator来说,guest访问的内存就是他的虚拟地址空间,guest上需要经过一次虚拟地址到物理地址的转换,转换到guest的物理地址其实也就是emulator的虚拟地址,emulator再次经过一次转换,转换为host的物理地址。后面会有介绍各种虚拟化的优化手段,这里只是做一个overview。
二、KVM安装
1.安装centos7服务器
点击完成,后开始安装
2.虚机开启虚拟化引擎配置
3.开启网卡ONBOOT,并重启网卡
4.查看CPU是否支持虚拟化
grep -E --color=auto "(vmx|svm)" /proc/cpuinfo
5.安装KVM
virtualization #提供虚拟机的环境,主要包含qemu-kvm
virtualization-client #管理和安装虚拟机实例的客户端,主要有python-virtinst,virt-manager,virt-viewer
virtualization-platform #提供访问和控制虚拟客户端的接口,主要有libvirt,libvirt-client
virtualization-tools #管理离线虚拟机镜像的工具,主要有libguestfs
gnome-desktop #安装图形管理界面
yum -y group install gnome-desktop virtualization-tools virtualization-platform virtualization-client virtualization #yum安装包组
6.KVM远程管理
[root@localhost ~]# which virsh #查看虚拟机管理命令
/usr/bin/virsh
[root@localhost ~]# virsh list --all #查看所有虚拟机
Id 名称 状态
----------------------------------------------------
7.使用qemu-kvm管理虚拟机
参数简介
CPU、Memory、SMP、NUMA
-cpu cpu #select CPU (-cpu ? for list)
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
-m megs #set vRAM size to megs MB [default=128]
-numa node[,mem=size][,cpus=cpu][,nodeid=node]
Storage Device
-drive option[,option[,option[,...]]] #定义一个存储设备
子选项介绍:
id=name #定义硬盘设备名称
file=/path/to/somefile #硬件映像文件路径
if=interface_type #指定硬盘设备所连接的接口类型(控制器类型), 如ide, scsi, virio等
index=i #设定同一种控制器类型中不同设备的索引号
media=disk|cdrom #定义介质类型为硬盘(disk)还是光盘(cdrom)
snapshot=on|off #指定当前硬盘设备是否支持快照功能
cache=writethrough|writeback|none|unsafe #定义如何使用物理机缓存来访问块数据
format=format #指定映像文件的格式, 具体格式可参见qemu-img命令
Display options #显示选项用于定义虚拟机启动后的显示接口相关类型及属性等
-nographic #默认情况下, qemu使用SDL来显示VGA输出; 而此选项用于禁止图形接口, 此时, qemu类似一个简单的命令行程序, 其仿真串口被将被重定向到控制台
-curses #禁止图形接口, 并使用curses/ncurses作为交互接口
-alt-grab #使用Ctrl+Alt+shift组合键释放鼠标
-ctrl-grab #使用右Ctrl键释放鼠标
-sdl #启用SDL
-spice option[,option[,...]] #启用spice远程桌面协议, 具体请参照qemu-kvm帮助手册
-vga [std|cirrus|vmware|qxl|xenfb|none] #指定要仿真的VGA接口类型
-vnc display #默认情况下, qemu使用SDL显示VGA输出; 使用该选项, 可以让qemu监听在VNC上, 并将VGA输出重定向至VNC会话; 使用此选项, 必须使用-k选项指定键盘布局类型
Network options #简单介绍几种,更多可参考官方手册
NIC
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
# 创建一个新的网卡设备并连接至vlan n中;
# pc架构上默认的nic为e1000, macaddr用于为其指定MAC地址
# 使用"qemu-kvm -net nic,model=?"来获取当前平台支持的类型
# name用于指定一个在监控时显示的网卡设备名称
TAP
-net tap[,vlan=n][,name=name][,fd=h][,ifname=name][,script=file][downscript=dfile]
#通过物理机的tap网络接口连接至vlan n中,
#使用script=file指定脚本(默认为/etc/qemu-ifup)来配置当前网络接口
#使用downscript=dfile指定脚本(默认为/etc/qemu-ifdown)来撤销接口配置
#使用script=no和downscript=no可分别用来禁止执行脚本
USER
-net user[,option][,option][,...] #在用户模式配置网络栈, 其不依赖于管理权限
子选项介绍:
vlan=n #连接之vlan n, 默认n=0
name=str #指定接口的显示名称, 常用于监控模式中
net=addr[/mask] #设定GuestOS可见的IP网络, 默认为192.168.1.0/24
host=addr #指定GuestOS中看到的Host的IP地址, 默认为指定网络中的第二个, 即x.x.x.x
dhcpstart=addr #指定DHCP服务器地址池中16个地址的起始IP, 默认为第16个至第31个, 即x.x.x.x ~ x.x.x.x
dns=addr #指定GuestOS可见的dns服务器地址, 默认为GuestOS网络中第三个地址, 即x.x.x.x
7.1 安装qemu-kvm
yum -y install qemu-kvm
7.2 查看文件位置
rpm -ql qemu-kvm | grep qemu-kvm | head -2
7.3 创建软连接到/usr/bin目录下
ln -s /usr/libexec/qemu-kvm /usr/bin
7.4 安装centos6.10虚机
qemu-kvm -m 128 -smp 1 -name "test" -hda /kvm/images/CentOS-6.10.iso #内存128M CPU 1块
若此步报错,应该是主机未开启虚拟化,在bios中配置虚拟化即可
7.5 安装VNC客户端
yum -y install tigervnc
7.6 切换图形管理界面连接VNC
startx &
#打开终端命令台
vncviewer :5900
8.virt-install创建虚拟机并安装
8.1 创建磁盘
qemu-img create -f qcow2 /kvm/images/CentOS-6.10.qcow2 5G #建一个格式为qcow2的磁盘
8.2 安装系统
virt-install \
--name=centos6 \
--disk path=/kvm/images/CentOS-6.10.qcow2 \
--vcpus=1 --ram=1024 \
--cdrom=/kvm/images/CentOS-6.10.iso \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--os-type=linux \
--os-variant=rhel6
切换至图形界面可看到如下图