KVM
kvm: Kernel-based Virtual Machine
Qumranet公司 --> RedHat
(1) X86_64
(2) HVM:
Intel VT
AMD AMD-v
KVM的组件:
两类组件:
(kvm.ko)/dev/kvm:工作为hypervisor,在用户空间可通过系统调用ioctl()与内核中的kvm模块交互
从而完成虚拟机的创建、启动、停止、删除等各种管理功能;
qemu-kvm进程:工作于用户空间,用于实现IO设备模拟;用于实现一个虚拟机实例;
KVM模块load进内存之后,系统的运行模式:
内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式;
用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
来宾模式:GuestOS的用户模式;所有的非IO类请求;
安装使用KVM:
判断CPU是否支持硬件虚拟化:
grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v
[root@L~]#grep -i -E '(vmx|svm|lm)' /proc/cpuinfo #lm—>long mode 只能支持64位的 [root@L~]#modinfo kvm
KVM运行逻辑,虚拟机运行需要虚拟出CPU的核心数,即vcpu0、vcpu1、vcpuN,CPU和内存的虚拟是由kvm kernel module来管理,vcpu是当做一个线程进行管理的。
IO设备用Qemu进行虚拟,并且进行管理。
运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;
kvm工具栈:
qemu:
qemu-kvm(命令的管理界面、仅能用在本机上运行)
Qemu-img (虚拟机硬盘管理)
libvirt:
GUI:virt-manager, virt-viewer(virt-manager 能做虚拟机的全生命周期管理)
CLI: virsh, virt-install (virsh 只能管理,但不能安装,virt-install负责安装虚拟机的工具)
虚拟机能使用很多种格式的硬盘
Raw格式的(dd命令,kvm可以使用)
vmdk(VMware格式的)
vdi(virtualbox格式的)
Qcow、Qcow2(Qemu-kvm格式的,qemu copy on write 写时复制技术)
C/S:
libvirtd
安装:
(1) 装载内核模块
kvm:核心模块
kvm-intel|kvm-amd
使用virt-manager管理KVM
# yum install qemu-kvm libvirt-daemon-kvm virt-manager
# modprobe kvm
# systemctl start libvirtd.service
# virt-manager &
安装kvm相关包
[root@L~]#yum install qemu-kvm libvirt-daemon-kvm virt-manager libvirt #centos6 没有daemon包,装libvirt [root@Lapp]#lsmod | grep kvm kvm_intel 166504 0 kvm 515469 1 kvm_intel [root@Lapp]#ls /dev/ | grep kvm kvm 加载kvm模块 [root@L~]#modprobe kvm 启动libvirtd [root@L~]#systemctl start libvirtd.service [root@L~]#service libvirtd start Starting libvirtd daemon: [ OK ] [root@L~]#ssh -X root@192.168.1.9 [root@Llibvirt]#ll 总用量 48 -rw-r--r--. 1 root root 518 1月 5 03:20 libvirt.conf -rw-r--r--. 1 root root 13204 1月 5 03:20 libvirtd.conf #守护进程的文件 -rw-r--r--. 1 root root 1176 1月 5 03:20 lxc.conf drwx------. 2 root root 4096 4月 27 16:25 nwfilter drwx------. 3 root root 4096 4月 27 16:25 qemu -rw-r--r--. 1 root root 15340 1月 5 03:20 qemu.conf [root@L~]#virsh iface-bridge wlan0 br0 #一定要注意,附加失败就远程断开了,最好设置个自动重启服务 Created bridge br0 with attached device wlan0 [root@L~]#brctl delbr br0 #删除桥
网络虚拟化:
二层的虚拟网络设备:
kernel net bridge/brctl
openvswitch
CentOS 7创建物理桥,使用内核自带的桥接模块实现:
桥接口配置文件保留地址信息;
TYPE=Bridge
Device=BRIDGE_NAME
物理网卡配置文件:
删除地址、掩码和网关等相关的配置,添加
BRIDGE=BRIDGE_NAME
重启网络服务即可:
使用qemu-kvm管理vms:
Qemu命令:
处理器模拟器
仿真各种IO设备
将仿真设备连接至主机的物理设备
提供用户接口
qemu-kvm命令语法:
qemu-kvm [options] [disk_image]
选项有很多类别:
标准选项、块设备相关选项、显示选项、网络选项、...
标准选项:定义虚拟机的基本属性
-machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型(平台);
-cpu cpu:-cpu help来获取列表;用于指定要模拟的CPU型号;
-smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:指明虚拟机上vcpu的数量及拓扑;
-boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off] #引导设备选项
order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备;-boot order=dc,once=d
-m megs:虚拟机的内存大小;
-name NAME:当前虚拟机的名称,要惟一;
块设备相关的选项:磁盘镜像文件
-hda/-hdb file:指明IDE总线类型的磁盘映射文件路径;第0和第1个;
-hdc/-hdd file:第2和第3个;
-cdrom file:指定要使用光盘映像文件;
-drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径;(指明磁盘镜像文件)
if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio,...
media=TYPE:介质类型,cdrom和disk;
index=i:设定同一类型设备多个设备的编号;
cache=writethrough|writeback|none|directsync|unsafe:缓存方式;
format=f:磁盘映像文件的格式;
CentOS磁盘镜像文件下载: https://cloud.centos.org/centos/7/imag es/
显示选项:提供显示接口
-display type:显示的类型,sdl, curses, none和vnc;
-nographic:不使用图形接口;
-vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号;
-vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口;
display:
(1) HOST:N
在HOST主机的第N个桌面号输出vnc;
5900+N
(2) unix:/PATH/TO/SOCK_FILE
(3) none
options:
password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面;
Ctrl-a, c:在console和monitor之间切换;
Ctrl-a, h
网络选项:
两种网络设备形式
用户空间模拟网络(比较安全,普通用户就可以运行)
内核空间模拟网络
-net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
为虚拟机创建一个网络接口,并将其添加至指定的VLAN;
model=type:指明模拟出的网卡的型号,ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio;
-net nic,model=?
macaddr=mac:指明mac地址;52:54:00:
-net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
通过物理的TAP网络接口连接至vlan n;
script=file: 启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
downscript=dfile: 关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
ifname=NAME: 自定义接口名称;
/etc/qemu-ifup #!/bin/bash # bridge=br0 if [ -n "$1" ];then ip link set $1 up sleep 1 brctl addif $bridge $1 [ $? -eq 0 ] && exit 0 || exit 1 else echo "Error: no interface specified." exit 2 fi
其它选项:
-daemonize:以守护进程运行;
#试验:生成虚拟机并完成网络转发模型
[root@L~]#ln -sv /usr/libexec/qemu-kvm /usr/bin/ #想使用,需要添加变量 "/usr/bin/qemu-kvm" -> "/usr/libexec/qemu-kvm” [root@L~]#vim /etc/qemu-ifup [root@L~]#bash -n /etc/qemu-ifup [root@L~]#chmod u+x /etc/qemu-ifup [root@L~]#qemu-kvm -name Cos7 -m 512 -cpu qemu64 -smp 2 -drive file=/app/centos-src/CentOS-7-x86_64-GenericCloud-1802.qcow2,if=virtio,media=disk,format=qcow2 -net nic,macaddr=52:54:00:00:00:00,model=virtio -net tap,script=/etc/qemu-ifup -vnc :0 #上面的就是仅主机模式,如果想与互联网通讯,就打开核心转发功能,添加规则即可 [root@L~]echo 1 > /etc/sys/net/ipv4/ip_forward #虚拟机内部添加默认网关 #route add default gw 192.168.122.1 #添加 IPtables 规则,构建NAT模型,也可以使用-j —to-source [root@L~]iptables -t net -A PSOTROUTING -s 192.168.122.0/24 -j MASQUERADE 示例1:(硬盘直接启动) [root@L~]#qemu-kvm -name c2 -smp 2,maxcpus=4,sockets=2,cores=2 -m 128 -drive file=/images/kvm/cos-i386.qcow2,if=virtio -vnc :1 -daemonize -net nic,model=e1000,macaddr=52:54:00:00:00:11 -net tap,script=/etc/qemu-ifup 示例2:(通过光盘安装) [root@L~]#qemu-kvm -name winxp -smp 1,maxcpus=2,sockets=1,cores=2 -m 1024 -drive file=/data/vms/winxp.qcow2,media=disk,cache=writeback,format=qcow2 file=/tmp/winxp.iso,media=cdrom -boot order=dc,once=d -vnc :1 -net nic,model=rtl8139,macaddr=52:54:00:00:aa:11 -net tap,ifname=tap1,script=/etc/qemu-ifup -daemonize
半虚拟化:virtio
建议:Network IO, Disk IO使用virtio,性能会有显著提升;
dnsmasq:
有两个功能,1、dns forwarder转发器 2、dns server 服务器
Dnsmasq是轻量级的,易于配置DNS转发器和DHCP服务器。它旨在为小型网络提供DNS和(可选)DHCP。 它可以提供不在全球DNS中的本地机器的名称。 DHCP服务器与DNS服务器集成,并允许具有DHCP分配地址的计算机出现在DNS中,并在每个主机或中央配置文件中配置名称。 Dnsmasq支持无盘机器的静态和动态DHCP租赁和BOOTP网络引导。
listen-address=192.168.1.132,127.0.0.1 #指定的是要绑定的桥的地址段
dhcp-range=192.168.1.50,192.168.1.150,48h #dns地址池及租约期限
dhcp-option=3,192.168.0.1 #3是选项,指定网关地址
#试验:完成dns设置,IP地址自动获取
[root@L~]#yum install dnsmasq [root@L~]#man dnsmasq [root@L~]#dnsmasq —-listen-address=10.1.0.1,127.0.0.1 —dhcp-range=10.1.0.100,10.1.0.150,24h —-dhcp-option=3,10.1.0.1
#试验:手动创建物理桥
[root@L~]#cd /etc/sysconfig/network-scripts/ [root@L~]#cp ifcfg-ens33 ifcfg-mybr0 [root@L~]#vim ifcfg-ens33 #把ip地址及网关等信息删除,添加一条 BRIDGE=mybr0 [root@L~]#vim ifcfg-mybr0 NAME=mybr0 DEVICE=mybr0 TYPE=Bridge #其余的地址信息保留即可 [root@L~]#service network restart #后续再启动的虚拟机,把网络关联到物理桥上,即可完成物理桥连接
作业:使用kvm搭建LNMP,Nginx连接两个桥,一个物理桥与外部通讯,一个内网桥实现内网通讯,php-fpm及mariadb连接内网桥,最好写成脚本,一键搞定(一个虚拟机加两块网卡只需要-net多几次即可实现,脚本先搞定网络实现及虚拟机启动起来,在使用固定的ip地址,使用ansible往上一推)
virsh命令:
虚拟机的生成需要依赖于预定义的xml格式的配置文件;其生成工具有两个:virt-manager, virt-install;
virsh [OPTION]... COMMAND [ARG]..
子命令的分类:
Domain Management (help keyword 'domain')
Domain Monitoring (help keyword 'monitor')
Host and Hypervisor (help keyword 'host')
Interface (help keyword 'interface')
Networking (help keyword 'network')
Network Filter (help keyword 'filter')
Snapshot (help keyword 'snapshot')
Storage Pool (help keyword 'pool')
Storage Volume (help keyword 'volume')
Domain Management (help keyword 'domain')
创建虚拟机:
create:从xml格式的配置文件创建并启动虚拟机;(基于虚拟机镜像文件创建虚拟机配置的CPU、内存、用什么IO等)
define:从xml格式的配置文件创建虚拟机;(可以定义一个模板,用交互式的形式填写,创建但不启动虚拟机)
停止:
destroy:强行关机;(相当于拔电源)
shutdown:关机; (正常的关机)
[root@Lqemu]#pwd /etc/libvirt/qemu [root@Lqemu]#ls #xml文件在这个目录下,就是能被直接识别为虚拟机的 C1.xml Centos7.xml networks #可以直接cp相关文件进行修改,就可以创建新的虚拟机 [root@Lqemu]#virsh create —-console c2.xml #用create创建的,直接启动,并且连接到控制台 Starting dropbear sshd: OK ____ ____ ____ / __/ __ ____ ____ / __ \/ __/ / /__ / // __// __// /_/ /\ \ \___//_//_/ /_/ \____/___/ http://launchpad.net/cirros login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root. cirros login:
启动:
start:启动
reboot:重启;
undefine:删除虚拟机;
Suspend(挂起)/resume(继续):暂停于内存中,或继续运行暂停状态的虚拟机;
真正实现的效果:pause/unpause
[root@L~]#virsh suspend C2 域 C2 被挂起 [root@L~]#virsh list Id 名称 状态 ---------------------------------------------------- 2 Centos7 running 3 C1 running 4 C2 暂停 [root@L~]#virsh resume C2 域 C2 被重新恢复
save/restore:保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机;
[root@L~]#virsh save C2 /app/C2.snap Domain C2 saved to /app/C2.snap [root@L~]#virsh list Id 名称 状态 ---------------------------------------------------- 2 Centos7 running 3 C1 running [root@L~]#ll /app/C2.snap -rw-------. 1 root root 40291928 4月 28 14:48 /app/C2.snap [root@L~]#virsh restore /app/C2.snap --paused 从 /app/C2.snap 恢复域 [root@L~]#virsh list Id 名称 状态 ---------------------------------------------------- 2 Centos7 running 3 C1 running 5 C2 暂停
console:连接至指定domain的控制台;
域的设备资源管理:
cpu-stats
vcpuinfo
vcpucount
setvcpus
vcpupin
setmaxmem #修改最大能修改的内存上线
setmem #修改内存大小,修改后会触发重启服务
磁盘设备的热插拔;
attach-disk #插入新的硬盘
detach-disk #拔出硬盘
domblklist #查看当前硬盘列表
试验:磁盘创建及热插拔
Quem-img create [-f fmt] [-o options] filename [size] 创建磁盘 -f 指定磁盘的格式 -o 指定一些选项 文件路径及大小 支持的格式有下列: Supported formats: raw cow qcow vdi vmdk cloop dmg bochs vpc vvfat qcow2 qed vhdx parallels nbd blkdebug null host_cdrom host_floppy host_device file gluster [root@Lc1]#qemu-img create -f qcow2 -o ? ./second.img Supported options: size Virtual disk size #可以直接指定磁盘大小 Compat compatibility level (0.10 or 1.1) #是否使用紧致格式 backing_file File name of a base image #可以基于摸个镜像做的二级镜像,类似快照 backing_fmt Image format of the base image encryption Encrypt the image cluster_size qcow2 cluster size preallocation Preallocation mode (allowed values: off, metadata, falloc, full) Preallocation 是指创建完磁盘后,立即创建出那些文件,off就是不创建,metadate就是磁盘的元数据直接以对象格式存到当前磁盘,falloc先预分配文件,full直接分配真实的存储(性能好),一般使用metadata。 [root@Lc1]#qemu-img create -f qcow2 -o size=20G,preallocation=metadata ./second.img Formatting './second.img', fmt=qcow2 size=21474836480 encryption=off cluster_size=65536 preallocation='metadata' [root@Lc1]#qemu-img info second.img image: second.img file format: qcow2 virtual size: 20G (21474836480 bytes) disk size: 3.3M cluster_size: 65536 [root@Lc1]#virsh help attach-disk attach-disk <domain>哪个虚拟机<source>哪个磁盘镜像文件<target>添加为哪个磁盘设备 [root@Lc1]#virsh attach-disk C1 /home/VMs/c1/second.img vdb 成功附加磁盘 [root@Lc1]#virsh domblklist C1 Target Source ------------------------------------------------ hda /home/VMs/c1/c1.img vdb /home/VMs/c1/second.img 后续直接分区格式化即可使用 拆除的时候一定要注意没有挂载使用,否则容易导致数据损坏 [root@Lc1]#virsh detach-disk C1 vdb 成功分离磁盘
网络接口设备的热插拔:
attach-interface #插入新的网络接口
type:bridge
source:BRIDGE_NAME
detach-interface #拔出网络接口,注意拆除的时候,一定要指明MAC,否则将拆除这个接口上的所有的网卡
domiflist #网络接口列表
注意 :无须事先创建网络接口设备;
[root@Lc1]#virsh attach-interface C1 bridge virbr0 成功附加接口 [root@Lc1]#brctl show bridge name bridge id STP enabled interfaces pan0 8000.000000000000 no virbr0 8000.5254002ebf66 yes virbr0-nic vnet0 vnet1 vnet2 vnet3 [root@Lc1]#virsh detach-interface C1 bridge --mac 52:54:00:F4:C5:84 成功分离接口
Domain Monitoring (help keyword 'monitor')
domiflist
domblklist
...
图形管理工具:
kimchi(泡菜):基于H5研发web GUI; virt-king;
OpenStack: IaaS
OpenStack Dashboard 就是一个web GUI
nova 是核心组件,Horizon接收到用户的情况,转发给nova,nova-compute通过调度群调到某一台物理机上
cider-api 提供块级别存储的服务,sahara-all 数据处理,swift分布式文件系统对象存储
OpenStack Database Service 就是DBaas数据库存储服务,glance-api存放镜像文件的系统
Neutron-server 是管理虚拟网络的,ceilometer-collector 计量服务(各种计量方式及计算方式)
ironic-api 可以管理虚拟机及物理服务器的服务,heat-api是OpenStack Orchestration的虚拟机编排服务
keystone-api 认证服务
oVirt:红帽主推的服务,虚拟化管理工具,也是一个web GUI工具
proxmox:不单单是个管理工具,就是一个Linux的发行版。
管理工具栈:https://www.linux-kvm.org/page/Management_Tools
cirros测试镜像
https://download.cirros-cloud.net/ 下载地址
qemu-img info cirros-0.3.0-i386-disk.img 查看cirros镜像信息
mkdir -pv /data/VMs/cirros 创建一个存放镜像的目录
说明: CirrOS(测试镜像)是专门从事云计算的Tiny OS,CirrOS是一个最小的Linux发行版,专为在OpenStack Compute之类的云上用作测试映像而设计。 您可以从CirrOS下载页面以各种格式下载CirrOS映像。 如果您的部署使用QEMU或KVM,我们建议使用qcow2格式的图像。
图形工具安装
vir-manager 打开图形工具
[root@L~]#mkdir /home/VMs/c1 -pv mkdir: 已创建目录 "/home/VMs" mkdir: 已创建目录 "/home/VMs/c1" [root@Lc1]#qemu-img info c1.img image: c1.img file format: qcow2 virtual size: 39M (41126400 bytes) disk size: 11M cluster_size: 65536 virsh # list Id 名称 状态 ---------------------------------------------------- 2 Centos7 running 3 C1 running virsh # console C1 连接到域 C1 Escape character is ^] login as 'mageedu' user. default password: 'mageedu.com'. use 'sudo' for root. cirros login: mageedu Password: Ctrl + 】就可以切换回来 然后如果在console C1 直接切回去,不需要再登录 virsh # domstate C1 #查看虚拟机C1的状态 virsh # domstats C1 #查看虚拟机C1使用的资源情况
磁盘设置
Writethrough 同写,写到内存的时候同时写到磁盘上
Writeback 回写,后续由缓存自动同步到磁盘上 ,建议使用的模式
Directsync 直接同步,属于缓存没有用
Unsafe 不安全模式,只要提交就认为写完成了 ,性能最好的
转载于:https://blog.51cto.com/exia00linux/2109144