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所依赖的其他软件.

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

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

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

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. 当尝试在容器中执行命令出现如下错误时,

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

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

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介绍的更多相关文章

  1. 虚拟化–操作系统级 LXC Linux Containers内核轻量级虚拟化技术

    友情提示:非原文链接可能会影响您的阅读体验,欢迎查看原文.(http://blog.geekcome.com) 原文地址:http://blog.geekcome.com/archives/288 软 ...

  2. LXC linux容器简介——在操作系统层次上为进程提供的虚拟的执行环境,限制其使用的CPU和mem等资源,底层是linux内核资源管理的cgroups子系统

    1.LXC是什么? LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术. 2.LXC可以做什么? LXC可以在操作系统层次上为进程提供的虚拟的执行环境,一个虚拟的 ...

  3. LXC(LinuX Container)之namespaec和cgroup

    LXC(LinuX Container)之namespaec和cgroup namespace概述 从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源 ...

  4. 2.LXC和namespace介绍

    lxc介绍 LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化.(主流的解决方案Xen ,KVM, LXC) Linux Container容器是一种内核虚拟化技术 ...

  5. 01 Linux入门介绍

    一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以及游戏支持度不足 L ...

  6. Linux Epoll介绍和程序实例

    Linux Epoll介绍和程序实例 1. Epoll是何方神圣? Epoll但是当前在Linux下开发大规模并发网络程序的热门人选,Epoll 在Linux2.6内核中正式引入,和select类似, ...

  7. Linux入门介绍

    Linux入门介绍 一.Linux 初步介绍 Linux的优点 免费的,开源的 支持多线程,多用户 安全性好 对内存和文件管理优越 系统稳定 消耗资源少 Linux的缺点 操作相对困难 一些专业软件以 ...

  8. Linux 系统目录介绍

    bin : bin 是Binary 二进制的缩写,就是可执行文件了.Bin目录下是用户常用的命令. sbin: 此目录下也是二进制文件 ,不过这里的命令是 超级用户如 root 这样的用户使用的. e ...

  9. Linux命令介绍

    资料链接:(Linux基本命令介绍)http://note.youdao.com/share/?id=36c07917f8d3e6437c1e764c3516a3f2&type=note#/ ...

随机推荐

  1. JAVA static 作用

    static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...

  2. starling 笔记

    ------------------------------------------------------------------ 这里的舞台是flash原生舞台,不是starling舞台 // r ...

  3. C++中的inline函数

    内联函数: () 内联函数定义和作用: 将一个函数声明为inline,那么函数就成为内联函数.内联函数通常就是它在程序中每个调用点上“内联地”展开.从定义上看,内联函数跟一般函数不一样,一般函数调用的 ...

  4. online ddl 跟踪

    | >mysql_prepare_alter_table T@4 : | | | | | | <mysql_prepare_alter_table 7368 T@4 : | | | | | ...

  5. show engine innodb status解读

    xiaoboluo768   注:以下内容为根据<高性能mysql第三版>和<mysql技术内幕innodb存储引擎>的innodb status部分的个人理解,如果有错误,还 ...

  6. laraval框架model注意事项

    今天创建了一个model,名字叫做Role_Users.php,结果运行的时候死活不识别,后来发现去掉名字中的下划线就可以识别了,虽然解决了,但还是不明白原理,若有大神看到但求解答

  7. PHP.3-DIV+CSS标准网页布局准备工作(上)

    DIV+CSS标准网页布局准备工作(上) 概述 使用"DIV+CSS"对网站进行布局符合W3C标准,采用这种方式布局通常是为了说明与HTML表格定位方式的区别.因为现在的网站设计标 ...

  8. Sorting It All Out

    Description An ascending sorted sequence of distinct values is one in which some form of a less-than ...

  9. Matrix 二维树状数组的第二类应用

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17976   Accepted: 6737 Descripti ...

  10. iOS 生成本地验证码

    在应用程序注册.登陆或者有关支付确认的界面,经常会用到验证码,验证码有的是通过手机发送获取的,有的是在本地点击获取的,通过手机发送获取的动态验证码可以使用第三方类库实现,本地点击获取的是在本地自己绘制 ...