KVM虚拟化技术的-Libvirt

Libvirt
    libvirt是一套免费、开源的支持Linux下主流虚拟化管理程序的C函数库,其旨在为包括KVM在内的各种虚拟化管理程序提供一套方便、可靠的编程接口。
当前主流Linux平台上默认的虚拟化管理工具virt-manager,virsh等都是基于libvirt开发。
    高级 libvirt API 可划分为 5 个 API 部分:虚拟机监控程序连接 API、域 API、网络 API、存储卷 API 以及存储池 API。
KVM虚拟化技术的-Libvirt_第1张图片
图 1. libvirt 比较和用例模型
      libvirt 通过相同的方式管理不同的虚拟化引擎,支持虚拟机的创建、启动、关闭、暂停、睡眠、迁移、删除,以及对虚拟机 CPU、内存、磁盘、网卡等多种设备的热添加。libvirt 还支持通过远程连接的方式管理虚拟机。
KVM虚拟化技术的-Libvirt_第2张图片
   
虚拟机资源限制
    CGroups是linux内核实现、用于控制linux系统资源的组件,可以限制、记录、隔离进程租(Process CGroups)和所有的物理资源CPU、内存、I/O等机制;作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。
    KVM虚拟机的资源限制主要是通过CGroups去配置,LIBVirt在CGroups上包了一层,可以通过XML文件做虚拟机的资源限制。
   CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。
   CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。
CGROUP层次结构:systemd 会自动创建 slice、scope 和 service 单位的层级,来为 cgroup 树提供统一结构;systemd 也自动为 /sys/fs/cgroup/ 目录中重要的 kernel 资源管控器挂载层级。
    systemd 的单位类型:
    service —— 一个或一组进程,由 systemd 依据单位配置文件启动。service 对指定进程进行封装,这样进程可以作为一个整体被启动或终止。
方式命名:name.service #name 代表服务名称。
    scope —— 一组外部创建的进程。由强制进程通过 fork() 函数启动和终止、之后被 systemd 在运行时注册的进程,scope 会将其封装。
方式命名:name.scopece #name 代表 scope 名称。
    slice —— 一组按层级排列的单位。slice 并不包含进程,但会组建一个层级,并将 scope 和 service 都放置其中。真正的进程包含在 scope 或 service 中。在这一被划分层级的树中,每一个 slice 单位的名字对应通向层级中一个位置的路径。小横线(”-“)起分离路径组件的作用。

    service、scope 和 slice 单位直接映射到 cgroup 树中的对象。当这些单位被激活,它们会直接一一映射到由单位名建立的 cgroup 路径中。

-slice         # root部分;
system.slice   #所有系统服务的默认位置;
user.slice     #所有用户会话的默认位置;
machine.slice  #所有虚拟机和Linux容器的默认位置。

[root@node3 ~]# systemd-cgls 
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
├─machine.slice
 └─machine-qemu\x2d2\x2dcentos7.2.scope
   └─3654 /usr/libexec/qemu-kvm -name centos7.2 -S -machine pc-i440fx-rhel7.0.0,accel=kvm,usb=off,dump-guest-core=off -cpu Broadwell,
├─user.slice
 └─user-0.slice
   ├─session-5.scope
    ├─15131 sshd: root@pts/2    
    ├─15134 -bash
    ├─17581 systemd-cgls
    └─17582 less
   └─session-1.scope
     ├─2937 sshd: root@pts/0    
     ├─2939 -bash
     ├─3037 dbus-launch --autolaunch ec047aa83a5b4d70a6ce9315488e09bc --binary-syntax --close-stderr
     ├─3038 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
     ├─3040 /usr/libexec/at-spi-bus-launcher
     ├─3045 /bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
     ├─3047 /usr/libexec/at-spi2-registryd --use-gnome-session
     └─3058 /usr/libexec/dconf-service
└─system.slice
  ├─systemd-machined.service
   └─3127 /usr/lib/systemd/systemd-machined
  ├─virtlogd.service
   └─3104 /usr/sbin/virtlogd
  ├─crond.service
   └─1517 /usr/sbin/crond -n
  ├─libvirtd.service
   ├─1509 /usr/sbin/libvirtd
   ├─2834 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_lease
   ├─2835 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_lease
   ├─2899 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/allen.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leasesh
   └─2900 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/allen.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leasesh
  ├─sshd.service
   └─1500 /usr/sbin/sshd -D
  ├─postfix.service
   ├─ 2248 /usr/libexec/postfix/master -w
   ├─ 2282 qmgr -l -t unix -u
   └─14482 pickup -l -t unix -u
  ├─tuned.service
   └─1498 /usr/bin/python -Es /usr/sbin/tuned -l -P
....(略)

资源管控器(也称为 cgroup 子系统)代表一种单一资源:如 CPU 时间或者内存。Linux kernel 提供一系列资源管控器,由 systemd 自动挂载。如需参考目前已挂载的资源管控器列表,请参见 /proc/cgroups,或使用 lssubsys 监控工具。

[root@node3 proc]# cat /proc/cgroups 
#subsys_name    hierarchy   num_cgroups enabled
cpuset  7   6   1
cpu 6   8   1
cpuacct 6   8   1
memory  5   5   1
devices 8   67  1
freezer 9   3   1
net_cls 3   3   1
blkio   2   5   1
perf_event  4   3   1
hugetlb 10  1   1

[root@node3 proc]# lssubsys -M
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls /sys/fs/cgroup/net_cls
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb


[root@node3 ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 5 root root  0 Aug 24 02:53 blkio
lrwxrwxrwx 1 root root 11 Aug 24 02:53 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Aug 24 02:53 cpuacct -> cpu,cpuacct
drwxr-xr-x 5 root root  0 Aug 24 02:53 cpu,cpuacct
drwxr-xr-x 3 root root  0 Aug 24 02:53 cpuset
drwxr-xr-x 5 root root  0 Aug 24 02:53 devices
drwxr-xr-x 3 root root  0 Aug 24 02:53 freezer
drwxr-xr-x 2 root root  0 Aug 24 02:53 hugetlb
drwxr-xr-x 5 root root  0 Aug 24 02:53 memory
drwxr-xr-x 3 root root  0 Aug 24 02:53 net_cls
drwxr-xr-x 3 root root  0 Aug 24 02:53 perf_event
drwxr-xr-x 5 root root  0 Aug 24 02:53 systemd


blkio —— 对输入 ∕ 输出访问存取块设备设定权限;
cpu   —— 使用 CPU 调度程序让 cgroup 的任务可以存取 CPU。它与 cpuacct 管控器一起挂载在同一 mount 上;
cpuacct —— 自动生成 cgroup 中任务占用 CPU 资源的报告。它与 cpu 管控器一起挂载在同一 mount 上;
cpuset  —— 给 cgroup 中的任务分配独立 CPU(在多芯系统中)和内存节点;
devices —— 允许或禁止 cgroup 中的任务存取设备;
freezer —— 暂停或恢复 cgroup 中的任务;
memory  —— 对 cgroup 中的任务可用内存做出限制,并且自动生成任务占用内存资源报告;
net_cls —— 使用等级识别符(classid)标记网络数据包,这让 Linux 流量控制器(tc 指令)可以识别来自特定 cgroup 任务的数据包;
perf_event —— 允许使用 perf 工具来监控 cgroup;
hugetlb    —— 允许使用大篇幅的虚拟内存页,并且给这些内存页强制设定可用资源量。

使用 LIBCGROUP 工具

[root@node3 ]# yum install libcgroup
[root@node3 ]# yum install libcgroup-tools
[root@node3 ]# modprobe netprio_cgroup

查看文档:
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/resource_management_guide/

你可能感兴趣的:(基础,linux,Docker,虚拟化)