项目实战13—企业级虚拟化Virtualization - KVM技术

  项目实战系列,总架构图 http://www.cnblogs.com/along21/p/8000812.html

KVM的介绍、准备工作和qemu-kvm 命令详解

1、介绍

(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类请求

 

2、使用KVM 的准备

(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 install libvirt-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-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

[root@master ~]# systemctl start libvirtd.service

[root@master ~]# virsh iface-bridge eth0 br0

分析:把自己的物理网卡eth0 作为交换机,把br0 当网卡,提供IP

注意:命令可能会卡死或出错,终端被强制退出;等一会,在登录就OK 了

 

2、图形化工具创建虚拟机

(1)打开窗口

[root@master ~]# virt-manager

注意:这个命令需在支持图形化界面的机器才能执行, 用其他机器 ssh -X 连接,再执行

 

(2)创建虚拟机

① 创建新的虚拟机

② 选择操作系统类型和版本

③ 选择内存和CPU 设置

④ 虚拟硬盘有多大

⑤ 网络选择

⑥ 详细配置,开始安装

⑦ 进入虚拟化图形管理窗口,选择安装系统版本

 

实战二:命令行工具qemu-kvm创建使用虚拟机

1、准备桥

(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 也能查到

 

2、创建虚拟机前准备

使用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 查询命令帮助

 

3、创建一个虚拟机

(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

 

实战三:手动构建虚拟机间的虚拟通道、仅主机网桥和NAT 网桥

1、准备虚拟机镜像文件

(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

 

2、创建虚拟的准备

(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

 

3、创建、登录两个虚拟机

(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 关机

 

4、建立虚拟机间的虚拟通道

① 给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

 

5、通过仅主机网桥连通宿主机

(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

 

6、通过NAT 网桥实现NAT 模式

(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

② 宿主机也有回包了

 

7、关闭虚拟机

① 在虚拟机上poweroff

# poweroff 关机

② 在宿主机上杀死进程

 

实战四:命令行工具virt 创建虚拟机及命令管理虚拟机

1、创建前准备

(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

 

2、创建虚拟机

[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 先干跑,测试一下

 

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命令演示

(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 console c1 连接至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

 

5、利用已有的虚拟机配置文件,创建一个新的虚拟机

原理:利用已下好的虚拟机,用命令把创建虚拟机的过程生成一个.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 自动启动等各种高级设置了

  

6、c1 虚拟机磁盘设备的热插拔

(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)把磁盘设备拔掉

 

7、网卡的热插拔

(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

 

posted @ 2017-12-26 10:15  alonghub  阅读(4050)  评论(0编辑  收藏  举报