https://www.cnblogs.com/along21/p/8116509.html
目录
项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html
KVM的介绍、准备工作和qemu-kvm 命令详解
1、介绍
KVM:就是Keyboard Video Mouse的缩写。KVM 交换机通过直接连接键盘、视频和鼠标 (KVM) 端口,让您能够访问和控制计算机。KVM 技术无需目标服务器修改软件。这就意味着可以在 Windows 的 BIOS 环境下,随时访问目标计算机。KVM 提供真正的主板级别访问,并支持多平台服务器和串行设备。
KVM 技术已经从最初的基础SOHO办公型,发展成为企业 IT 基础机房设施管理系统。可以从kvm 客户端管理软件轻松的直接访问位于多个远程位置的服务器和设备。KVM over IP 解决方案具备完善的多地点故障转移功能、符合新服务器管理标准 (IPMI) 的直接界面,以及将本地存储媒体映射至远程位置的功能。
KVM 是个"怪胎",原本是类型2 的主机虚拟化;但一旦在OS 上加载了kvm.ko 模块,就会"感染"OS,使其变为hypervisor(kvm),原本的软件空间作为控制台,转化成类型1 模式的主机虚拟化
API 应用程序编程接口
qemu-KVM是一种开源虚拟器,它为KVM管理程序提供硬件仿真。
运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;
③ libvirt 虚拟化库:Libvirt是一个C工具包,可以与最近版本的Linux(以及其他操作系统)的虚拟化功能进行交互。主包包含了导出虚拟化支持的libvirtd服务器。
C/S:
Client:
libvirt-client
virt-manager
Daemon:
libvirt-daemon
内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为"Guest-Kernel"模式;
用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求;
来宾模式:GuestOS的用户模式;所有的非IO类请求
2、使用KVM 的准备
vmx:Intel VT-x
svm:AMD AMD-v
③ 在虚拟机上再虚拟化,需开启虚拟化 Intel VT-x/EPT
[[email protected] ~]# grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
vmx:Intel VT-x
svm:AMD AMD-v
[[email protected] ~]# yum install libvirt-daemon-kvm qemu-kvm virt-manager -y
[[email protected] ~]# modprobe kvm 装载kvm 模块
[[email protected] ~]# lsmod |grep kvm
[[email protected] ~]# ll /dev/kvm 字符设备
[[email protected] ~]# yum install libvirt-daemon-kvm qemu-kvm virt-manager -y
3、qemu-kvm命令语法
qemu-kvm [options] [disk_image]
选项有很多类别:标准选项、块设备相关选项、显示选项、网络选项、...
(1)标准选项: -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:当前虚拟机的名称,要惟一; (2)块设备相关的选项: -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/images/ (3)显示选项: -display type:显示的类型,sdl, curses, none和vnc; -nographic:不使用图形接口; 显卡型号 -vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号; -vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口; 让qemu进程监听一个vnc接口; display: ① HOST:N 在HOST主机的第N个桌面号输出vnc; ② unix:/PATH/TO/SOCK_FILE ③ none options: password:连接此服务所需要的密码;
-monitor stdio:在标准输出上显示monitor界面; Ctrl-a, c:在console和monitor之间切换; Ctrl-a, h (4)网络选项: -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; script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown ifname=NAME:自定义接口名称; 其它选项: -daemonize:以守护进程运行;
实战一:图形化工具virt-manager 创建虚拟机
1、创建物理桥桥接接口br0
[[email protected] ~]# systemctl start libvirtd.service
[[email protected] ~]# virsh iface-bridge eth0 br0
分析:把自己的物理网卡eth0 作为交换机,把br0 当网卡,提供IP
注意:命令可能会卡死或出错,终端被强制退出;等一会,在登录就OK 了
2、图形化工具创建虚拟机
[[email protected] ~]# virt-manager
注意:这个命令需在支持图形化界面的机器才能执行, 用其他机器 ssh -X 连接,再执行
实战二:命令行工具qemu-kvm创建使用虚拟机
1、准备桥
[[email protected] ~]# yum -y install bridge-utils 下载brctl 命令的包
[[email protected] ~]# brctl addbr br-int0 添加网桥
[[email protected] ~]# brctl show 查询所有网桥
[[email protected] ~]# ifconfig -a 每一个桥,在机器上都表现为一个网卡接口,只是没有**
[[email protected] ~]# ip link set br-int0 up **桥,会分配mac 地址
[[email protected] ~]# ip link set br-int0 down 先down掉网桥
[[email protected] ~]# brctl delbr br-int0 再删除
[[email protected] ~]# ifconfig -a 查询不到这个网卡了
[[email protected] ~]# brctl show 查询不到网桥
[[email protected] network-scripts]# pwd
/etc/sysconfig/network-scripts
[[email protected] network-scripts]# cp ifcfg-eth1 ifcfg-br0
[[email protected] network-scripts]# vim ifcfg-br0
DEVICE=br0 NAME=br0 TYPE=Bridge ONBOOT=yes IPADDR=172.16.1.7 NETMASK=255.255.0.0 GATEWAY=172.16.0.1 DNS1=172.16.0.1
注意:是要充当正常网卡使用的,所有IP、NETMASK、GATEWAY、DNS1 都要有
[[email protected] network-scripts]# vim ifcfg-eth1
DEVICE=eth1 ONBOOT=yes BRIDGE=br0
注意:主机的网卡连接网桥后,是要充当交换机的,所以不需要IP、NETMASK、GATEWAY、DNS1
[[email protected] network-scripts]# systemctl restart network
[[email protected] ~]# ifconfig
[[email protected] ~]# brctl show 也能查到
2、创建虚拟机前准备
[[email protected] ~]# yum install qemu-kvm libvirt-daemon-kvm virt-manager 安装qemu-kvm 命令行工具
[[email protected] ~]# modprobe kvm 加载模块
[[email protected] ~]# lsmod |grep kvm
[[email protected] ~]# rpm -ql qemu-kvm 因为qemu-kvm 命令路径不在PATH 路径下
[[email protected] ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
[[email protected] ~]# qemu-kvm -h 查询命令帮助
3、创建一个虚拟机
(1)创建一个虚拟机,用kubuntu 的镜像文件(用windows、linux 什么镜像文件都行)
[[email protected] ~]# qemu-kvm -cpu host -smp 2,sockets=1,cores=2,threads=1 -m 512 -drive file=/data/imgs/test.img,if=virtio,media=disk,format=qcow2 -drive file=/root/kubuntu-17.10-desktop-amd64.iso,if=ide,media=cdrom -boot order=dc,once=d -vnc 172.16.1.7:0
[[email protected] ~]# vncviewer 172.16.1.7:0
实战三:手动构建虚拟机间的虚拟通道、仅主机网桥和NAT 网桥
1、准备虚拟机镜像文件
CentOS磁盘镜像文件下载: https://cloud.centos.org/centos/7/images/
[[email protected] ~]# qemu-img info cirros-no_cloud-i386.img
[[email protected] ~]# mkdir -pv /data/imgs/
[[email protected] ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img
[[email protected] ~]# cp cirros-no_cloud-i386.img /data/imgs/c2.img
2、创建虚拟的准备
[[email protected] imgs]# brctl addbr br-c1-and-c2 创建网桥接口
[[email protected] imgs]# ifconfig br-c1-and-c2 up **网桥
[[email protected] imgs]# brctl show
① [[email protected] ~]# vim /etc/qemu-ifup-pn1
#!/bin/bash # bridge=br-c1-and-c2 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
[[email protected] ~]# chmod +x /etc/qemu-ifup-pn1
3、创建、登录两个虚拟机
[[email protected] ~]# qemu-kvm -name c1 -cpu host -smp 2 -m 64 -drive file=/data/imgs/c1.img,if=virtio,media=disk,format=qcow2 -vnc :0 -net nic,model=e1000,macaddr=52:54:00:00:01:01 -net tap,script=/etc/qemu-ifup-pn1 -daemonize [[email protected] ~]# qemu-kvm -name c2 -cpu host -smp 2 -m 64 -drive file=/data/imgs/c2.img,if=virtio,media=disk,format=qcow2 -vnc :1 -net nic,model=e1000,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup-pn1 -daemonize
注意:-vnc :0/1 是窗口号;MAC 地址52:54:00 不能改,后边随意
[[email protected] ~]# ss -nutl 开启了5900 和5901 的端口
[[email protected] ~]# vncviewer 192.168.30.107:0
[[email protected] ~]# vncviewer 192.168.30.107:1
4、建立虚拟机间的虚拟通道
# ifconfig eth0 10.1.0.1/16 up
# ifconfig eth0 10.1.0.2/16 up
5、通过仅主机网桥连通宿主机
(1)在宿主机上的br-c1-and-c2 网桥,添加虚拟机网段的地址
② [[email protected] ~]# ip addr add 10.1.0.10/16 dev br-c1-and-c2
[[email protected] ~]# ip a show br-c1-and-c2
6、通过NAT 网桥实现NAT 模式
[[email protected] ~]# sysctl -w net.ipv4.ip_forward=1
# route add default gw 10.1.0.10
# ping 172.16.1.7 发现ping 宿主机的另一块网卡能ping 通了,因为内核机制
# ping 172.16.0.1 但是外网还是ping不同,原因:宿主机上只有出包,没有进包
[[email protected] ~]# tcpdump -i eth1 -nn icmp 只有出包,没有进包
[[email protected] ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 172.16.1.7
[[email protected] ~]# iptables -vnL -t nat 查询
7、关闭虚拟机
实战四:命令行工具virt 创建虚拟机及命令管理虚拟机
1、创建前准备
[[email protected] imgs]# yum install libvirt-daemon-kvm virt-install -y
[[email protected] ~]# mkdir -pv /data/imgs/
[[email protected] ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img
[[email protected] imgs]# brctl addbr br0 创建网桥接口
[[email protected] imgs]# ifconfig br0 up **网桥
[[email protected] imgs]# brctl show
[[email protected] ~]# systemctl start libvirtd.service
[[email protected] ~]# virsh iface-bridge eth0 br0
2、创建虚拟机
[[email protected] imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img --dry-run
[[email protected] imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img
3、virsh命令详解,下有实例
(1)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') 存储池(help关键字“池”) Storage Volume (help keyword 'volume') 存储卷(帮助关键字“卷”) (2)域管理 Domain Management (help keyword 'domain') 创建虚拟机: create:从xml格式的配置文件创建并启动虚拟机; define:从xml格式的配置文件创建虚拟机; 停止: destroy:强行关机、拔电源; shutdown:关机; start:启动 reboot:重启; undefine:删除虚拟机; suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机;真正实现的效果:pause/unpause save/restore:挂起/继续;保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机; console:连接至指定domain的控制台; (3)域的设备资源管理: ① cpu cpu-stats 查看cpu 信息 vcpuinfo 查看vcpu 信息 vcpucount 看有几个cpu setvcpus 可以调整cpu数(如果是调整的是动态的,在创建虚拟机时设置,静态的不行) vcpupin 把vcpu 绑定到真正的cpu 上 ② memcache setmaxmem 修改最大内存(创建虚拟机时设置的是否可以修改) setmem 修改内存大小(没超过上限时) ③ 设备 attach-disk/detach-disk:磁盘设备的热插拔; domblklist:查询虚拟机的磁盘设备 attach-interface/detach-interface:网络接口设备的热插拔; domiflist:查询虚拟机的网卡设备
4、virsh命令演示
[[email protected] imgs]# virsh list 列出所有正在开启running 的虚拟机
[[email protected] imgs]# virsh list --all 列出所有的虚拟机,包括关机的、没运行的
[[email protected] imgs]# virsh 交互式执行命令
[[email protected] imgs]# virsh nodeinfo 查询信息
[[email protected] imgs]# virsh uri 查询uri 路径
[[email protected] imgs]# virsh console c1 连接至c1 虚拟机的控制台
# ping 172.16.0.1 因为物理桥已经连接到了网卡,所以有地址,且能ping 通外网
[[email protected] ~]# virsh destroy c1 先关掉虚拟机
[[email protected] ~]# virsh undefine c1 在删除虚拟机
[[email protected] ~]# ls /etc/libvirt/qemu/ .xml 文件被删除
[[email protected] ~]# virsh list --all 查询不到c1 虚拟机,删除成功
[[email protected] ~]# virsh suspend c1 暂停虚拟机
[[email protected] ~]# virsh resume c1 恢复暂停
[[email protected] ~]# virsh save /app/c1.bin 挂起虚拟机
[[email protected] ~]# virsh restore /app/c1.bin 恢复挂起
[[email protected] ~]# virsh cpu-stats c1 查看cpu 信息
[[email protected] ~]# virsh vcpuinfo c1 查看vcpu 信息
[[email protected] ~]# virsh vcpucount c1 看有几个cpu
5、利用已有的虚拟机配置文件,创建一个新的虚拟机
原理:利用已下好的虚拟机,用命令把创建虚拟机的过程生成一个.xml的文件,利用这个文件创建新的虚拟机
[[email protected] ~]# virsh dumpxml c1 > /app/c2.xml
[[email protected] ~]# vim /app/c2.xml 需要修改的,都在下面列出了
<domain type='kvm' id='5'> <name>c2</name> #名字 <uuid>7303d4d3-b8d2-4e22-aac8-feb881882a73</uuid> #UUID随便改,只要不相同 <source file='/data/imgs/c2.img'/> #镜像文件 <mac address='52:54:00:52:10:34'/> #mac随便改,只要不相同 <source bridge='br0'/> #桥接的网桥 <target dev='vnet1'/> #默认的后端设备
[[email protected] ~]# virsh create /app/c2.xml --console
注:--console 直接连接虚拟机,或不加;再用下边的命令连接虚拟机
[[email protected] ~]# virsh console c2
[[email protected] ~]# virsh list 已有2个虚拟机了
(4)把.xml 文件放入/etc/libvirt/qemu
[[email protected] ~]# ls /etc/libvirt/qemu
[[email protected] ~]# cp /app/c2.xml /etc/libvirt/qemu/
6、c1 虚拟机磁盘设备的热插拔
[[email protected] ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=10G /data/imgs/c1.2.img
[[email protected] ~]# qemu-img info /data/imgs/c1.2.img 查询
[[email protected] ~]# virsh domblklist c1 查看c1 已有的磁盘设备
[[email protected] ~]# virsh attach-disk c1 /data/imgs/c1.2.img vda
(3)连接至虚拟机,可以对这个磁盘做分区、文件系统格式化、挂载等操作
[[email protected] ~]# virsh console c1
7、网卡的热插拔
[[email protected] ~]# brctl addbr br-int0
[[email protected] ~]# ifconfig br-int0 up
[[email protected] ~]# ip addr add 10.1.0.254/16 dev br-int0
[[email protected] ~]# ifconfig br-int0
[[email protected] ~]# virsh attach-interface c1 bridge br-int0
[[email protected] ~]# virsh console c1
# ifconfig eth1 10.1.0.1/16 up
# ping 10.1.0.254 ping宿主机,测试是否生效
[[email protected] ~]# virsh domiflist c1 查询虚拟机的网卡设备
[[email protected] ~]# virsh detach-interface c1 bridge --mac 52:54:00:5b:d8:04
实战五:推荐几个图形化管理虚拟机的工具
kimchi:基于H5研发的web GUI;virt-king; 网上搜索kimchi kvm 有安装使用教程
OpenStack:IaaS 非常重量级,非常吃资源;至少10台以上的虚拟机才用它
oVirt:比kimchi 功能强大的多,比OpenStack轻量;但配置也较麻烦
proxmox VE
(2)kvm 官方的管理工具栈:https://www.linux-kvm.org/page/Management_Tools