LXC 容器技术简介
这段时间一直在折腾 Linux 系统上运行安卓应用。上一篇文章《安卓应用兼容新方案:Android Translation Layer(ATL)》介绍了 Android 翻译层,但这个项目远远不够成熟,远水不解近渴,所以还是得回到容器化方案。
虽然在软件开发中用到了 docker 容器,但仅限于使用它,对其原理并不清楚。而且这次使用的方案是 LXC 容器技术,只能硬着头皮,恶补一下相关知识。所以这篇文章仅仅是一个知识小结。
提到 LXC 容器,估计很多开发人员都没听说过。其实 docker 早期就是基于 LXC 打造的,只是后来直接采用更底层的资源隔离技术,才抛弃了 LXC。
说了半天 LXC 容器,那什么是 LXC?
Linux LXC(Linux Containers)是一种轻量级的虚拟化技术,通过内核的命名空间(namespaces)和控制组(cgroups)实现进程和资源的隔离。
这里又出现了命名空间和控制组的概念,所以还需要回顾一下 Linux 下容器技术的发展。
Linux容器技术的发展经历了多个重要阶段,主要围绕资源隔离、访问控制和封装系统的实现。
1. 初始隔离机制:chroot
容器技术的起源可以追溯到 1979 年 UNIX 7 系统中的 chroot 命令。该命令通过改变进程的根目录来限制其访问范围,最初用于降低开发和测试中的误操作风险。
尽管 chroot 在文件系统层面提供了一定的隔离,但它并不能完全防止安全漏洞,后续的pivot_root 技术在 2000 年被引入,以增强文件隔离的安全性。
2. 名称空间的引入
2002 年,Linux Kernel 2.4.19 引入了名称空间机制,允许进程在独立的环境中运行,仿佛拥有自己的系统资源。这一机制不仅限于文件系统,还扩展到进程 ID、用户 ID 和网络等多个方面。
随着时间的推移,Linux 内核不断添加新的名称空间类型,包括 UTS、IPC 等,直到最新的 Linux Kernel 5.6 支持八种资源的隔离。
3. 资源控制:cgroups
为了实现更好的资源管理,Linux 在 2008 年引入了 cgroups。这一机制允许系统管理员控制和限制进程组的资源使用,如 CPU 时间、内存和磁盘 I/O 等。
2016年,Linux Kernel 4.5发布了第二代cgroups,支持统一层级管理,使资源控制更加清晰和精确。
4. 封装系统的实现:LXC
在文件系统、访问和资源隔离机制完善后,2008年 Linux 发布了 LXC,作为一种轻量级虚拟化解决方案。LXC 使得用户能够更方便地使用底层的名称空间和 cgroups 功能,从而实现容器化。
LXC 的使用
下面简单介绍一下 LXC 的操作命令,更多的帮助可查看命令行帮助,或求助于 AI。
1、安装LXC
sudo apt install lxc lxc-templates
安装后可通过 lxc-checkconfig 验证内核支持情况,确保所有选项均为 Enabled 。
2、创建容器
使用 lxc-create 命令基于模板创建容器。常用模板包括 ubuntu 、 centos 等:
sudo lxc-create -n <容器名> -t <模板名> [-- -r <发行版版本>]
比如:
sudo lxc-create -n mycontainer -t ubuntu -- -r 20.04
创建了一个 Ubuntu 20.04 系统的名为 mycontainer 的容器。
3、启动与停止容器
启动容器:
sudo lxc-start -n <容器名> [-d]
其中 -d 表示后台运行
停止容器:
sudo lxc-stop -n <容器名>
销毁容器(需先停止):
sudo lxc-destroy -n <容器名>
启动后可通过 lxc-ls -f 查看容器状态(运行中、停止等)。
4、进入容器
通过 lxc-attach 附加到容器:
sudo lxc-attach -n <容器名> --clear-env -- /bin/bash
通过控制台登录:
sudo lxc-console -n <容器名>
退出需按 `Ctrl+a q`
小结
总体看下来,LXC 的命令和 docker 类似,但需要了解一下命名空间和 cgroup 的概念,否则和内核开发人员沟通起来就比较困难。比如在某些内核上,cgroup 特性没开启,导致容器无法启动,这时就需要将需求提清楚。
涉及到更深入的知识,那就需要研究 linux 源码,目前还没有这个精力。