项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html
(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 模式的主机虚拟化
(2)KVM 的组件
① kvm.ko:模块
API 应用程序编程接口
② qemu-kvm:用户空间的工具程序;
qemu-KVM 是一种开源虚拟器,它为 KVM 管理程序提供硬件仿真。
运行中的一个 kvm 虚拟机就是一个 qemu-kvm 进程,运行 qemu-kvm 程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机;
③ libvirt 虚拟化库:Libvirt 是一个 C 工具包,可以与最近版本的 Linux(以及其他操作系统) 的虚拟化功能进行交互。主包包含了导出虚拟化支持的 libvirtd 服务器。
C/S:
Client:
libvirt-client
virt-manager
Daemon:
libvirt-daemon
(3)KVM 模块 load 进内存之后,系统的运行模式:
内核模式:GuestOS 执行 IO 类的操作时,或其它的特殊指令操作时的模式;它也被称为 "Guest-Kernel" 模式;
用户模式:Host OS 的用户空间,用于代为 GuestOS 发出 IO 请求;
来宾模式:GuestOS 的用户模式;所有的非 IO 类请求
(1)前提:
① 必须跑在 x86 系统的架构上
② 必须支持硬件级虚拟化
vmx:Intel VT-x
svm:AMD AMD-v
③ 在虚拟机上再虚拟化,需开启虚拟化 Intel VT-x/EPT
(2)判断 CPU 是否支持硬件虚拟化:
[root@master ~]# grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
注意:vmx 或 svm 必须出现一个,表示是支持的
vmx:Intel VT-x
svm:AMD AMD-v
(3)安装前准备
① 装载 KVM 模块
[root@master ~]# yum installlibvirt-daemon-kvm qemu-kvm virt-manager -y
[root@master ~]# modprobe kvm 装载 kvm 模块
② 检测 kvm 模块是否装载
[root@master ~]# lsmod |grep kvm
[root@master ~]# ll /dev/kvm 字符设备
③ 安装用户端工具 qemu-kvm
[root@master ~]# yum install libvirt-daemon-kvm qemu-kvmvirt-manager -y
qemu-kvm [options] [disk_image]
选项有很多类别:标准选项、块设备相关选项、显示选项、网络选项、...
实战一:图形化工具 virt-manager 创建虚拟机
- (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:以守护进程运行;
[root@master ~]# systemctl start libvirtd.service
[root@master ~]# virsh iface-bridge eth0 br0
分析:把自己的物理网卡 eth0 作为交换机,把 br0 当网卡,提供 IP
注意:命令可能会卡死或出错,终端被强制退出;等一会,在登录就 OK 了
(1)打开窗口
[root@master ~]# virt-manager
注意:这个命令需在支持图形化界面的机器才能执行, 用其他机器 ssh -X 连接,再执行
(2)创建虚拟机
① 创建新的虚拟机
② 选择操作系统类型和版本
③ 选择内存和 CPU 设置
④ 虚拟硬盘有多大
⑤ 网络选择
⑥ 详细配置,开始安装
⑦ 进入虚拟化图形管理窗口,选择安装系统版本
(1)命令管控虚拟网桥:brctl
[root@master ~]# yum -y install bridge-utils 下载 brctl 命令的包
[root@master ~]# brctl addbr br-int0 添加网桥
[root@master ~]# brctl show 查询所有网桥
[root@master ~]# ifconfig -a 每一个桥,在机器上都表现为一个网卡接口,只是没有激活
[root@master ~]# ip link set br-int0 up 激活桥,会分配 mac 地址
删除网桥
[root@master ~]# ip link set br-int0 down 先 down 掉网桥
[root@master ~]# brctl delbr br-int0 再删除
[root@master ~]# ifconfig -a 查询不到这个网卡了
[root@master ~]# brctl show 查询不到网桥
(2)手动创建物理网桥
① 创建网桥对应的配置文件
[root@master network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@master network-scripts]# cp ifcfg-eth1 ifcfg-br0
[root@master 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 都要有
② 把主机的网卡连接到桥上
[root@master network-scripts]# vim ifcfg-eth1
- DEVICE=eth1
- ONBOOT=yes
- BRIDGE=br0
注意:主机的网卡连接网桥后,是要充当交换机的,所以不需要 IP、NETMASK、GATEWAY、DNS1
③ 重启网络服务
[root@master network-scripts]# systemctl restart network
[root@master ~]# ifconfig
[root@master ~]# brctl show 也能查到
使用 virt-manager 管理 KVM
(1)准备 qemu-kvm 命令
[root@master ~]# yum install qemu-kvm libvirt-daemon-kvm virt-manager 安装 qemu-kvm 命令行工具
[root@master ~]# modprobe kvm 加载模块
[root@master ~]# lsmod |grep kvm
[root@master ~]# rpm -ql qemu-kvm 因为 qemu-kvm 命令路径不在 PATH 路径下
创建软连接,或者写入 PATH 变量都行
[root@master ~]# ln -sv /usr/libexec/qemu-kvm /usr/bin/
[root@master ~]# qemu-kvm -h 查询命令帮助
(1)创建一个虚拟机,用 kubuntu 的镜像文件(用 windows、linux 什么镜像文件都行)
- [root@master ~]# 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
分析:命令详解见上边
(2)vnc 登录实验虚拟机
[root@master ~]# vncviewer 172.16.1.7:0
(1)下载 cirros 镜像文件
用 cirros 来演示测试,因为它很小,不占资源
去网站下载 cirros
CentOS 磁盘镜像文件下载: https://cloud.centos.org/centos/7/images/
[root@master ~]# qemu-img info cirros-no_cloud-i386.img
(2)准备 2 分创建虚拟机的镜像文件
[root@master ~]# mkdir -pv /data/imgs/
[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img
[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c2.img
(1)准备物理网桥
[root@master imgs]# brctl addbr br-c1-and-c2 创建网桥接口
[root@master imgs]# ifconfig br-c1-and-c2 up 激活网桥
[root@master imgs]# brctl show
(2)准备激活连接网桥脚本
① [root@master ~]# 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
② 加执行权限
[root@master ~]# chmod +x /etc/qemu-ifup-pn1
(1)创建并开启虚拟机
- [root@master ~]# 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
- [root@master ~]# 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 不能改,后边随意
[root@master ~]# ss -nutl 开启了 5900 和 5901 的端口
(2)登录连接 2 个虚拟机
开 2 个终端,vnc 连接虚拟机
[root@master ~]# vncviewer 192.168.30.107:0
[root@master ~]# vncviewer 192.168.30.107:1
登录用户:cirros
登录密码:cubswin:)
$ sudo su - 切换到管理用户
# poweroff 关机
① 给 2 个虚拟机加 IP ,在同一网段
# ifconfig eth0 10.1.0.1/16 up
# ifconfig eth0 10.1.0.2/16 up
分析:一旦添加了 IP,就是仅主机模式了
② 测试虚拟通道是否连通
# ping 10.1.0.2
# ping 10.1.0.1
(1)在宿主机上的 br-c1-and-c2 网桥,添加虚拟机网段的地址
① 每创建一个虚拟主机,都会有另一半在宿主机上
② [root@master ~]# ip addr add 10.1.0.10/16 dev br-c1-and-c2
[root@master ~]# ip a show br-c1-and-c2
(2)测试仅主机网桥
# ping 10.1.0.10 在虚拟机上 ping
(1)在宿主机上开启路由转发功能
[root@master ~]# sysctl -w net.ipv4.ip_forward=1
(2)在 2 个虚拟机上添加路由
# route add default gw 10.1.0.10
# ping 172.16.1.7 发现 ping 宿主机的另一块网卡能 ping 通了,因为内核机制
# ping 172.16.0.1 但是外网还是 ping 不同,原因:宿主机上只有出包,没有进包
[root@master ~]# tcpdump -i eth1 -nn icmp 只有出包,没有进包
(3)做 SNAT 策略
[root@master ~]# iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 172.16.1.7
[root@master ~]# iptables -vnL -t nat 查询
(4)测试 NAT 网桥
① 在宿主机上 ping 外网
# ping 172.16.0.1
② 宿主机也有回包了
① 在虚拟机上 poweroff
# poweroff 关机
② 在宿主机上杀死进程
(1)准备 cirros 镜像文件
[root@master imgs]# yum install libvirt-daemon-kvm virt-install -y
[root@master ~]# mkdir -pv /data/imgs/
[root@master ~]# cp cirros-no_cloud-i386.img /data/imgs/c1.img
(2)创建物理网桥 br0
[root@master imgs]# brctl addbr br0 创建网桥接口
[root@master imgs]# ifconfig br0 up 激活网桥
[root@master imgs]# brctl show
(3)把 br0 网桥连接到 eth0 网卡上
[root@master ~]# systemctl start libvirtd.service
[root@master ~]# virsh iface-bridge eth0 br0
[root@master imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img--dry-run
[root@master imgs]# virt-install -n c1 --vcpus 2 --memory 64 -w bridge=br0 --import --disk /data/imgs/c1.img
分析:--dry-run 先干跑,测试一下
- (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:查询虚拟机的网卡设备
(1)简单查询
[root@master imgs]# virsh list 列出所有正在开启 running 的虚拟机
[root@master imgs]# virsh list --all 列出所有的虚拟机,包括关机的、没运行的
[root@master imgs]# virsh 交互式执行命令
[root@master imgs]# virsh nodeinfo 查询信息
[root@master imgs]# virsh uri 查询 uri 路径
(2)连接虚拟机
[root@master imgs]# virsh consolec1 连接至 c1 虚拟机的控制台
# ping 172.16.0.1 因为物理桥已经连接到了网卡,所以有地址,且能 ping 通外网
(3)删除虚拟机
[root@master ~]# virsh destroy c1 先关掉虚拟机
[root@master ~]# virsh undefine c1 在删除虚拟机
[root@master ~]# ls /etc/libvirt/qemu/ .xml 文件被删除
[root@master ~]# virsh list --all 查询不到 c1 虚拟机,删除成功
(4)暂停和挂起虚拟机
[root@master ~]# virsh suspend c1 暂停虚拟机
[root@master ~]# virsh resume c1 恢复暂停
[root@master ~]# virsh save /app/c1.bin 挂起虚拟机
[root@master ~]# virsh restore /app/c1.bin 恢复挂起
(5)域设备资源管理查询
[root@master ~]# virsh cpu-stats c1 查看 cpu 信息
[root@master ~]# virsh vcpuinfo c1 查看 vcpu 信息
[root@master ~]# virsh vcpucount c1 看有几个 cpu
原理:利用已下好的虚拟机,用命令把创建虚拟机的过程生成一个. xml 的文件,利用这个文件创建新的虚拟机
(1)生成. xml 的文件
[root@master ~]# virsh dumpxml c1 > /app/c2.xml
[root@master ~]# 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'/> #默认的后端设备
(2)创建新的虚拟机
[root@master ~]# virsh create /app/c2.xml --console
注:--console 直接连接虚拟机,或不加;再用下边的命令连接虚拟机
[root@master ~]# virsh console c2
(3)检查
[root@master ~]# virsh list 已有 2 个虚拟机了
(4)把. xml 文件放入 / etc/libvirt/qemu
[root@master ~]# ls /etc/libvirt/qemu
[root@master ~]# cp /app/c2.xml /etc/libvirt/qemu/
用 virsh 自动启动等各种高级设置了
(1)创建 10G 大小稀疏格式的磁盘映像文件
[root@master ~]# qemu-img create -f qcow2 -o preallocation=metadata,size=10G /data/imgs/c1.2.img
[root@master ~]# qemu-img info /data/imgs/c1.2.img 查询
(2)把磁盘设备加到 c1 上
[root@master ~]# virsh domblklist c1 查看 c1 已有的磁盘设备
[root@master ~]# virsh attach-disk c1 /data/imgs/c1.2.img vda
(3)连接至虚拟机,可以对这个磁盘做分区、文件系统格式化、挂载等操作
[root@master ~]# virsh console c1
# fdisk /dev/vda
# fdisk -l /dev/vda1
(3)把磁盘设备拔掉
(1)在宿主机上添加一个新的物理桥
[root@master ~]# brctl addbr br-int0
[root@master ~]# ifconfig br-int0 up
(2)激活网桥,给 ip
[root@master ~]# ip addr add 10.1.0.254/16 dev br-int0
[root@master ~]# ifconfig br-int0
(3)给 c1 虚拟机插上这个网卡设备 ---> "热插"
[root@master ~]# virsh attach-interface c1 bridge br-int0
(4)连接至虚拟机,激活网卡
[root@master ~]# virsh console c1
# ifconfig eth1 10.1.0.1/16 up
# ping 10.1.0.254 ping 宿主机,测试是否生效
[root@master ~]# virsh domiflist c1 查询虚拟机的网卡设备
(5)拆除网卡 ---> "热拔"
# ifconfig eth1 down
[root@master ~]# virsh detach-interface c1 bridge --mac 52:54:00:5b:d8:04
(1)图形管理工具:
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
来源: https://www.cnblogs.com/along21/p/8116509.html