通过 Linux 容器进行虚拟化


简介
Linux 容器是一种轻量级“虚拟化”方法,用于在单个控制主机上同时运行多个虚拟装置(容器)。另一个可用来描述 Linux 容器所执行的操作的术语是“容器化”。
Linux 容器提供操作系统级别的虚拟化,其中的内核控制隔离的容器。容器通过内核控制组 (cgroup) 和内核命名空间进行隔离。通过 Xen 和 KVM 等其他完整虚拟化解决方案,虚拟化子系统可模拟完整的硬件环境。

Apache Web 服务器就是一个 Linux 容器使用案例。通过 Xen 或 KVM 等超级管理程序,用户可以在虚拟机上安装 SUSE Linux Enterprise Server 和 Apache。虚拟机的引导方式与任何物理计算机的引导方式一样,首先进行开机自检 (POST) 以将控制传递给 bootloader (GRUB),然后,Bootloader 将加载 Linux 内核并启动 init 进程以针对定义的运行级别加载所有服务和守护程序,例如 Apache。

在 SUSE Linux Enterprise Server 上运行的 Apache Web 服务器的 Linux 容器与超级管理程序示例大相径庭。对于 SUSE Linux Enterprise Server 和 Apache,需要在 Linux 容器中安装的软件包较少。最明显不需要安装的软件包是 Linux 内核。另一个区别是引导进程。使用 Linux 容器,引导进程从 init 进程开始,该进程将针对定义的运行级别加载所有服务(例如网络)和守护程序(例如 Apache)。Linux 容器不需要硬件 POST(启动 GRUB 并加载 Linux 内核)即可运行。

使用 Linux 容器有两大主要好处。首先,由于在容器引导进程中不需要 POST、Bootloader 和内核,因此容器可以非常快速地启动。第二,相比运行超级管理程序的虚拟机,容器将使用更少的服务器物理资源。这意味着在单个物理系统中可以启动更多的容器。

Linux 容器的一个缺点是:容器需要使用主机系统的内核。也就是说,如果主机是 SUSE Linux Enterprise Server 时,容器将无法运行 Microsoft Windows。

本文将重点介绍与 Linux 容器相关的重要术语;阐述 SUSE Linux Enterprise Server 11 SP3 中 Linux 容器的体系结构;讨论 Linux 容器使用入门;还提供了一些有关 SUSE Linux Enterprise Server 中的 Linux 容器的未来的一些见解。

术语

  • chroot — change root(chroot 或 change root jail)是文件系统中的一个部分,它与文件系统的其余部分相互隔离。基于此目的,chroot 命令用于更改文件系统的根。在此类“chroot jail”中执行的程序无法访问指定目录树以外的文件。
  • cgroups — 内核控制组(通常称为“cgroup”)是一种内核功能,允许将任务(进程)及其所有子项聚合或分区到按层次组织的组中,以隔离资源。
  • 容器 — 主机服务器上的一个“虚拟机”,可运行任何 Linux 系统。例如 openSUSE、SUSE Linux Enterprise Desktop 或 SUSE Linux Enterprise Server。
  • 容器名称 — 容器的名称。该名称由 lxc 命令使用。
  • 内核命名空间 — 为一组进程隔离某些资源(例如文件系统、网络、用户及其他)的一项内核功能。
  • Linux 容器主机服务器 — 一种系统,包含 Linux 容器系统并通过 cgroup 提供容器和管理控制功能。
  • 资源管理 — cgroup 子系统提供一些可以指派的参数,并控制容器使用内存、磁盘 I/O 和网络通讯等系统资源的方式。

结构概览

Linux 容器不需要超级管理程序。这与类型 1 或类型 2 超级管理程序不同,后两者中的超级管理程序层位于硬件层之上。从概念上讲,可将 Linux 容器视为经过改进的 chroot 技术,该技术利用 Linux 中的额外功能来创建强大但轻量的虚拟化选项,该选项几乎可将所有容器内容与 Linux 容器主机服务器隔离开来。

chroot 环境可分隔文件系统,从而使容器看起来是在文件系统的根上运行,但实际上文件系统储存在 Linux 容器主机服务器内的目录中。SUSE Linux Enterprise Server 11 SP3 的默认位置是将容器文件系统储存在 /var/lib/lxc/<container name> 中。也可以将容器文件系统储存在虚拟磁盘映像中。这不是储存 rootfs 的默认方法,而是 lxc.conf 手册页中介绍的高级配置选项。

lxc 手册页会提到将 Linux 容器用作应用程序容器或系统容器。目前,SUSE Linux Enterprise Server 11 SP3 仅支持设置系统容器。系统容器是安装大部分 SUSE Linux Enterprise Server 操作系统文件的位置,这些文件安装在即将成为容器的根的目录中。应用程序容器仅包含特定于要在容器中运行的应用程序的文件和库。所有其他文件和库将通过 Linux 容器主机文件系统使用。设置应用程序容器不如设置系统容器容易,但它是 SUSE Linux Enterprise Server 上的 Linux 容器的未来目标。

可以将 Linux 容器中的网络分隔,这意味着容器可以有自己的 IP 地址。网络分隔通过在 SUSE Linux Enterprise Server 中使用 Linux 桥接来实现。Linux 桥接技术与用于 SUSE Linux Enterprise Server 上的 Xen 和 KVM 中的网络的桥接技术相同。使用 brctl 命令询问并与 Linux 容器主机服务器上的网桥交互。

控制组是最有趣的组件。它们是 Linux 容器所使用的 Linux 内核中的一项功能,因为它可以提供容器资源管理和控制。控制组不是特定于 Linux 容器的,而是被添加到 Linux 内核版本 2.6.24 中的。与控制组的交互过程的第一步是将一个或多个控制组子系统安装为虚拟文件系统并使用回应命令定义单个控制组容器。可以启动 Linux 进程 ID(PID 或任务)或将其移动到新创建的 Cgroup 容器中。Cgroup 子系统可以控制指派给容器的进程的很多方面。可以将特定设备和单个 CPU 隔离到容器中。控制子系统可以冻结/解冻并收集容器中的 CPU 使用信息。可以使用资源管理子系统在容器内动态定义容器的 CPU 使用、内存以及进程的块设备 IO。所有这些都可以通过将参数回应到容器的虚拟文件系统中的文件来完成。使用控制组听起来很困难。但 Linux 容器正是一个让控制组的使用变得简单的项目。您可以在“Linux 容器使用入门”部分阅读到相关内容。

在使用 Linux 容器时,还需要完全理解另外一个体系结构项,即“安全”。有一点需要提醒,Linux 主机服务器的内核供所有容器使用。这意味着:可以从容器内部使用 Linux 系统调用攻击,从而升级对 Linux 容器主机服务器的访问。社区中有多个不同的选项可以帮助解决此问题。其中一个选项是称为 seccomp 的内核安全功能,seccomp 代表“security computing”(安全计算)。Linux 容器社区使用 seccomp2 和相关的 libseccomp2 库以围绕容器创建沙箱,从而限制容器使用系统调用。另外两个选项是使用 SELinux 和 AppArmor。所有三个选项都已通过 SUSE 工程部的审阅,可用于将来的 SUSE Linux Enterprise Server 版本。

Linux 容器使用入门
首先从已经注册和完全安装了增补程序的 SUSE Linux Enterprise Server 11 SP3 系统开始。安装 GNOME 这样的 GUI 将使得 YaST 模块的使用变得容易简单,但不需要 GUI。有一项要点需要注意:创建 Linux 容器需要具备已定义的并且可用的储存库。建议您注册 Linux 容器主机服务器,以便在创建容器时已正确设置安装和更新储存库,并且储存库可用。

Linux 容器需要在 Linux 容器主机上安装多个软件包。使用 YaST 或 Zypper 安装 lxc、yast2-lxc、sles-lxcquick_en-pdf 和 bridge-utils。YaST 或 Zypper 可能还会添加另外一些相关软件包。尽管 sles-lxcquick_en-pdf 不是核心,但它包含 Linux 容器 quickstart PDF,该容器位于 /usr/share/doc/manual/sles-lxcquick_en-pdf/SLES-lxcquick_en.pdf。
使用 YaST 网络设置模块设置网桥。通常,主机上第一个网桥的默认名称是“br0”。

SUSE 已创建了 Linux 容器 YaST 模块。此模块使您可以轻松创建、删除、启动、停止容器以及连接到容器。启动 Linux 容器 YaST 模块时,它会自动报告来自 lxc-createconfig 的输出。除文件功能通常显示为禁用以外,所有功能都显示为已启用。如果报告任何错误或出现红色文字,则必须在创建和启动第一个容器之前解决这些问题。

如果更习惯使用命令行,则 Linux 管理员可以很轻松地使用“lxc-”命令与任何容器进行交互。如前面提到的那样,lxc-checkconfig 命令可以验证控制组虚拟文件系统和子系统是否已正确安装,以及所有内容是否均已正确配置,可以运行容器。lxc-createconfig 和 lxc-create 可定义容器并基于 Linux 容器模板将 SUSE Linux Enterprise Server 安装到容器中。可以对模板进行自定义,以添加其他要安装到容器中的软件包。模板文件位于 /usr/share/lxc/templates 中。

lxc-start 和 lxc-stop 命令简单明了。管理员可以使用 lxc-console 连接到在后台启动的容器。lxc-ls、lxc-info 和 lxc-ps 命令使管理员能够列出容器中的进程、获取进程信息并查看进程。还有许多其他 lxc 命令,但最后一个需要重点介绍一下的 lxc 命令是 lxc-cgroup。此命令控制容器的资源管理环节,包括设置 CPU、内存和块 I/O 限制。

Outlook
借助 SUSE Linux Enterprise Server 12,我们将从“lxc”Linux 容器框架切换到 libvirt-lxc。这意味着:用于管理 Xen 和 KVM 的相同库和工具(例如 virt-manager)将用于管理 Linux 容器。

有关安全的一些补充。seccomp2 将是 SUSE Linux Enterprise Server 12 的一部分。使用 seccomp2,Linux 容器能够围绕容器创建沙箱,以限制应用程序能够在容器内实施的系统调用的类型。此外,还支持 SELinux 和 AppArmor,并可将其用于保护 Linux 容器对 SUSE Linux Enterprise Server 12 Linux 容器主机服务器的访问。SUSE Linux Enterprise Server 12 将附带 AppArmor 配置文件。

SUSE Linux Enterprise Server 12 将支持应用程序容器。应用程序容器使用 libvirt-lxc 来创建容器和 seccomp2/SELinux/AppArmor 组合,以对在容器内运行的应用程序进行沙箱操作。

我们还会介绍 Docker 项目,这是一个基于 Linux 容器构建的框架。请看来自 Docker 项目网站的引言:“它是一个轻量级框架(具有功能强大的 API),可提供在容器中构建和部署应用程序的生命周期。”Docker 可提供映像储存库并简化容器使用。Docker 将成为 SUSE Linux Enterprise Server 12 中的一个技术概览,也就是说,可以对 Docker 进行测试,但不建议用于生产。

总结
Linux 容器提供了另一个“虚拟化”选项,该选项既有优势也有局限。Linux 容器的优势包括:

  • 通过容器隔离应用程序和操作系统
  • 与完全虚拟化超级管理程序相比,没有虚拟化开销
  • 提供接近本机的性能,因为 Linux 容器能够实时管理资源分配
  • 通过 cgroup 控制网络接口并在容器内应用资源管理

Linux 容器的局限

  • 在主机系统的内核中运行,不能使用不同的内核
  • 仅允许“虚拟机”操作系统
  • 不是完整的虚拟化堆栈,这与 SUSE Linux Enterprise Server 中同样包括的 Xen 或 KVM 不同,因为它们是完整的虚拟化堆栈
  • 必须了解 SUSE Linux Enterprise Server 11 中 Linux 容器的安全性。如果您需要完全安全的系统,请将 KVM 或 Xen 与 SUSE Linux Enterprise 11 SP3 结合使用。SUSE Linux Enterprise Server 12 将为 Linux 容器添加额外的安全功能。

以下是另外几个有关 Linux 容器的使用案例想法:

  • 为用户/开发人员 (root) 提供访问权限,但不提供对“真实”系统的完整 (root) 访问
  • 对有获取系统上所有资源的倾向的应用程序进行限制,就像数据库通常对内存执行的操作一样,或者像计算敏感型应用程序对 CPU 所执行的操作一样
  • 针对没有更多虚拟化技术的特定客户,保证一组应用程序有特定数量的资源 (SLA!)
  • 当难以获取实验室硬件时,在低端服务器上运行 DHCP/DNS、安装服务器和 SMT(订购管理工具)

了解详细信息

  • 有关通过 LXC 进行 SUSE Linux Enterprise Server 11 虚拟化
    的快速入门手册
  • LXC 主页
  • 内核控制组 (cgroup)
  • 使用 libvirt 管理虚拟机

相关内容