LXC-Linux Containers介绍

摘要:
它被称为基于容器的操作系统级虚拟化技术。它由一个Linux内核补丁和一些用户空间工具组成。该子系统是Linux内核提供的基于进程组的资源管理框架。这取决于Linux内核提供的命名空间特性。应用程序访问控制系统确保主机不会受到容器中实例的恶意行为的影响。4.不支持检查点检查点技术。容器中的所有进程都可以临时冻结。

Linux Containers,Linux的容器,容器嘛,可以想象成一个大的装东西的罐子,罐子口很大,里面可以装很多同样形状,只不过大小不同的小罐子。专业的话,叫做基于容器的操作系统层面的虚拟化技术。

在这个大的容器里面,可以装很多小的容器,每一个容器都具备完整的运行环境,如特定的CPU、memory节点、可分配的cpu时间,IO时间,受限的内存大小(包括内存和SWAP),提供对底层设备的访问,拥有独立的namespace(网络、pid、ipc、mmt和uts)。

LXC项目地址:https://linuxcontainers.org/

LXC在github上的地址:https://github.com/lxc/lxc

一个LXC的实例,我们称之为container,类比于PC机器上面的Virtual Box和Vmware。

LXC具体组成

LXC项目在Sourceforge上面的,它有一个Linux内核补丁和一些用户空间的工具组成,其中内核补丁提供底层新特性,上层工具使用这些新特性,提供一套简化的工具来维护容器。

LXC在资管管理方面,依赖与Linux内核密切相关的Cgroups子系统,这个子系统是Linux内核提供的一个基于进程组的资源管理框架,可以为特定的进程组限定可以使用的资源,借助cgroups子系统,在当前Linux环境下,实现一个轻量化的虚拟机。

LXC在隔离控制方面,依赖于Linux内核提供的namespace特性,具体来说,就是在clone的时候加入相应的flag。

LXC的优势

LXC是操作系统层面的虚拟化技术,与传统的HAL层次的虚拟化技术相比,有以下优势:

1. 更小的虚拟化开销。LXC的诸多特性基本有内核提供

2. 快速部署。只需要安装LXC,就可以利用LXC的相关命令来创建并且启动容器,为应用提供虚拟执行环节。而传统的虚拟化技术,需要先创建虚拟机,然后安装系统,再部署应用。

3. 虚拟机的rootfs就在/var/lib/lxc/container_name ,可以在宿主机上轻松修改container的文件系统。

4. LXC使用apparmor,应用程序访问控制系统来确保主机不受容器内实例的恶意行为。

LXC的缺点

1. 缺少对磁盘限额(disk quota)的支持,目前使用LVM来限定支持。

2. 缺少对写时复制(copy on write)的支持,对于每个容器来说,都是一份操作系统的用户态实例,都有属于自己的系统库函数文件等必需文件。在一个系统有多个容器的情况下,这会造成磁盘空间的浪费。这里可以借鉴写时复制的概念,对于容器共用的文件,在没有对共享文件进行写入之前,可以只保存一份拷贝,其他容器采用硬链接的方式来共享,当有容器对共享文件进行写入时,为其单独创建一份拷贝。

3. 进程和容器之间的动态关联还不够完善

    理想情况下,进程和容器之间是动态关联的,进程可以在容器之间迁移。在LXC中,资源管理是通过cgroups实现的,进程可以在cgroup之间有条件的迁移。命名空间的隔离是通过namespace实现的,目前内核只支持进程变更有限的几类命名空间。

4. 不支持checkpoint

    checkpoint技术可以将容器中所有的进程暂时frozen,将当时容器完整的状态存储在磁盘上,类似于Vmware的snapshot,目前LXC不支持checkpoint技术,只是借助cgroups的freezer子系统,将进程暂时frozen和resume,没有完整的存储容器的状态。

5. 不支持容器的动态迁移

   动态迁移是指将正在运行的容器从一个机器上迁移到另一个机器上,在此过程中,容器中的进程无需停止,此项技术可以用来优化服务器集群的资源配置。目前LXC不支持动态迁移。

LXC安装使用

在Ubuntu系统下,可以使用apt命令来安装或者使用源码来安装,建议使用apt来安装,这种方式在安装过程中会自动安装LXC所依赖的其他软件.

image

在正确使用lxc之前,需要对其配置文件进行简单的介绍,以便更好的理解LXC的工作原理.

a. /etc/lxc/lxc.conf    创建lxc容器的时候默认使用的配置文件,默认内容如下。

image

b. /usr/lib/lxc/templates/   该目录保存当前LXC支持的各种发行版本的Linux模板配置文件

image

c. /var/lib/lxc/       该目录存放每个创建的容器实例,只有root用户才有权限访问其内容

d. /var/cache/lxc   该目录存放容器实例的cache,加快容器实例创建速度。

LXC根据容器类型的不同而有所不同,一种是系统容器,一种是应用程序容器。系统容器类似于虚拟机,

lxc-start –n name init ,运行init程序。

应用程序容器只是创建用于隔离一个应用程序的单独的命名空间,类似的命令,lxc-execute –n name cmd

LXC常用命令

1. lxc-checkconfig   用于判断Linux内核是否支持LXC

2. lxc-create          用于创建一个容器

   lxc-create –n name [ –f config_file ]

   name        创建的容器名称

   config_file  容器配制文件的路径

   备注: 容器名称是全局的,也就是说,系统不允许存在重名的容器。lxc-create创建的容器,在停止运行后,不会自动销毁。

3. lxc-destroy          用于销毁一个容器

4. lxc-execute          用于在一个容器执行应用程序

   lxc-execute –n name [ –f config_file] [ –s KEY=VAL ] command

  name       容器名称

  config_file 容器配制文件路径

   -s 后面跟配制键值对 例如 lxc.cgroup.cpu.shares = 512

   command   待执行的命令

备注:如果不存在name容器,lxc-execute会自动创建一个,容器停止运行后会自动销毁。

        执行过程中,有限选用 –f 指定的配置文件参数。 -s选项可以特别改变配置文件中的某一项参数值。

        lxc-execute 先创建lxc-init进程,然后在lxc-init中fork一个进行来执行命令,常用于在容器中执行应用程序。

5. lxc-start           用于在容器中执行给定命令

    lxc-start –n name [-f config_file ] [-c console_file ] [-d] [-s KEY=VAL]  [command]

    -d : 将容器当做守护进程执行

    -c : 指定一个文件作为容器的控制台输出,默认为终端

备注:如果容器还不存在,lxc-start会自动创建一个,容器停止允许后会自动销毁。它是直接创建进程来运行命令。

        lxc-start 用于在容器中启动system

6. lxc-kill               用于发送信号给容器中的第一个用户进程(容器内部进程号为1的为init,进程号为2的为第一个用户进程),默认信号为SIGKILL。

     lxc-kill –n name [SIGNUM]

7. lxc-stop              用于停止容器中所有的进程

      lxc-stop –n name

  8. lxc-destroy         用于销毁容器

      lxc-destroy –n name

  9. 其他命令,等到需要的时候再补充。

使用上述命令,需要root权限来执行。

在成成的虚拟机容器中,有config配置文件,可以在里面添加针对这个虚拟机的各种资源限制范围。

经验总结

1. 创建虚拟机,需要以root权限来创建和执行上述相关的命令

2. 当尝试在容器中执行命令出现如下错误时,

image

由于LXC采用cgroup对容器进行资源管理,在实际使用lxc之前,必须执行mount none –t cgroup /cgroup 来挂载cgroup系统,或者将此命令写到/etc/fstab中,让系统每次启动时,自动挂载cgroup。

解决方法: https://groups.google.com/forum/#!topic/ns-3-users/brjBDmGU4PE

image

Cgroup部分的配置都是以lxc.cgroup.[subsystem name].key=value的形式出现的.例如:

lxc.cgroup.cpu.shares=512

lxc.cgroup.cpuset.cpus=1.2

cgroup下面有cpu子系统、cpuset子系统、memory子系统、blkio子系统、network部分、rootfs部分这些来设置。

免责声明:文章转载自《LXC-Linux Containers介绍》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇VMware Workstation 中安装Redhat linux 9.0Linux设备驱动程序 之 信号量和互斥体下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

java 执行JavaScript 以及容器化的问题

1. 可选方案     a. jdk 6 开始内置的Rhino 引擎   b. jdk8 替换的nashorn (性能高,对于ECMA 支持更好)   c. java 版的nodejs vertx.io   2. 实践操作 public static void main(String[] args) { ScriptEngineMana...

Qt下开发及调用带界面的DLL

0.背景 由于某项目需要,在Qt下开发及调用带界面的DLL。由于中间折腾时间较长才搞定,在这记录一下。 本帖子中所用Qt版本为QtCreator 4.10.2.基于Qt5.13.2(MSVC 2017,32位) 1. Qt DLL开发 1.1 工程建立 新建工程,选择:Library->C++ Library在工程细节中Qt module中选择 Wi...

容器虚拟化网络和Docker容器网络(转载)

容器虚拟化网络和Docker容器网络 docker 6种名称空间 UTS namespace 主机名与域名 Mount namespace 挂载点 IPC namespace 信号量、消息队列和共享内存 PID namespace 进程号 User namespace 用户和组 Network namespace 网络设备、网络栈、端口等 Linux系统...

git使用教程13-.gitignore忽略文件不提交

前言 git 提交代码到仓库的时候,经常有一些缓存文件我们不希望提交过去,手动去筛选会比较浪费时间。 在项目跟目录放一个 .gitignore 文件,可以指定忽略哪些文件不用提交。 .gitignore文件的使用 在项目根目录,指定哪些文件不用提交 .gitignore文件内容示例 .idea/* .pytest_cache/* __pycache__/*...

python3降级为python2(linux)

在Linux上,使用python,有时候需要python2,有时候需要python3,下面简单介绍下将python3换成python2的方法。 1.查看Python目前的版本 直接输入 python 1 可以查看Python版本 2.将/usr/bin目录下的python版本切换 mv /usr/bin/python /usr/bin/python3....

怎么使用gitee进行团队开发

1. 注册gitee账号 从官网进行注册,注册的时候注意尽量自己定义用户名,绑定手机号或者邮箱,不要使用微信登陆(否则会有坑) https://gitee.com/  2.注册完之后,使用自己的账号密码进行登陆 我在这里使用的是手机号登陆 3. 使用gitee创建仓库   这样就可以创建一个仓库了 4. clone 其他人的仓库 如果进行团队开发,A...