当前位置: 首页 > news >正文

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 源码,目前还没有这个精力。

相关文章:

  • rbpf虚拟机-验证器(verifier)
  • iOS:GCD信号量、同步、异步的使用方法
  • Browserlist 使用指南:应对浏览器兼容性问题的解决方案
  • golang-互斥锁-mutex-源码阅读笔记
  • Maven工具学习使用(四)——仓库
  • 双工通信:WebSocket服务
  • Flink 常用及优化参数
  • 【NLP 49、提示工程 prompt engineering】
  • 海外紧固件市场格局与发展趋势研究报
  • 自定义创建中间件出现的ImproperlyConfigured: WSGI application错误的坑
  • 深度学习篇---断点重训模型部署文件
  • springboot在feign和线程池中使用TraceId日志链路追踪(最终版)-2
  • Windows10即将开始收费更新!每年费用61美元
  • 群核科技持续亏损近18亿:营销费用偏高,市场份额优势面临挑战
  • vue3 数据监听(watch、watchEffect)
  • 【前端】原生项目与框架项目区别
  • 每天认识一个设计模式-建造者模式:复杂对象的“装配式革命“
  • rabbitmq承接MES客户端服务器
  • React Native集成到原生iOS应用中
  • Keysight ADS教学 - 一维二維參數掃描(parameter sweep)
  • 做网站需准备些什么软件/百度在线客服中心
  • 微信网站如何开发/百度在线问答
  • 海珠网站建设哪家好/惠州seo关键字优化
  • 深圳营销型网站建设报价/微信营销管理软件
  • 网站的下拉列表怎么做/企业网站制作开发
  • 海口做网站优化/如何推广品牌知名度