软件平台:Ubuntu 14.04 容器有效地将由单个操作系统管理的资源划分到孤立的组中,以更好的在孤立的组之间有冲突的资源使用需求。与其他的虚拟化比较,这样既不需要指令级模拟,也不需要即时编译。容器可以在寒心CPU本地运行指令,而不需要任何专门的解释机制。此外半虚拟化和系统调用替换的复杂性。 LXC的实现是基于内核中的namespace和cgroup实现的。
namespace:
和C++中的namespace概念相似。在Linux操作系统中,系统资源如:进程、用户账户、文件系统、网络都是属于某个namespace。每个namespace下的资源对于其他的namespace资源是透明的,不可见的。因为在操作系统层上就会出现相同的pid的进程,多个相同uid的不同账号。 内核中的实现: namespace是针对每一个进程而言的,所以在task_struct结构的定义中有一个指向nsproxy的指针
/* namespaces */ struct nsproxy *nsproxy;
该结构体的定义如下:
/*
* A structure to contain pointers to all per-process
* namespaces - fs (mount), uts, network, sysvipc, etc.
*
* The pid namespace is an exception -- it's accessed using
* task_active_pid_ns. The pid namespace here is the
* namespace that children will use.
*
* 'count' is the number of tasks holding a reference.
* The count for each namespace, then, will be the number
* of nsproxies pointing to it, not the number of tasks.
*
* The nsproxy is shared by tasks which share all namespaces.
* As soon as a single namespace is cloned or unshared, the
* nsproxy is copied.
*/ struct nsproxy { atomic_t count; struct uts_namespace *uts_ns; struct ipc_namespace *ipc_ns; struct mnt_namespace *mnt_ns; struct pid_namespace *pid_ns_for_children; struct net *net_ns; };
其中第一个属性count表示的是该命名空间被进程引用的次数。后面的几个分别是不同类型的命名空间。以pid_namespace为例。 其结构如下所示:
struct pid_namespace { struct kref kref;//引用计数 struct pidmap pidmap[PIDMAP_ENTRIES];//用于标记空闲的id号 struct rcu_head rcu; int last_pid;//上一次分配的id号 unsigned int nr_hashed; struct task_struct *child_reaper;//相当于全局的init进程,用于对僵尸进程进行回收 struct kmem_cache *pid_cachep; unsigned int level;//namespace的层级 struct pid_namespace *parent;//上一级namespace指针 #ifdef CONFIG_PROC_FS struct vfsmount *proc_mnt; struct dentry *proc_self; #endif #ifdef CONFIG_BSD_PROCESS_ACCT struct bsd_acct_struct *bacct; #endif struct user_namespace *user_ns; struct work_struct proc_work; kgid_t pid_gid; int hide_pid; int reboot; /* group exit code if this pidns was rebooted */ unsigned int proc_inum; };
内核中的pid结构表示:
struct pid { atomic_t count; unsigned int level;//pid对应的级数 /* lists of tasks that use this pid */ struct hlist_head tasks[PIDTYPE_MAX];//一个pid可能对应多个task_struct struct rcu_head rcu; struct upid numbers[1];//该结构是namespace中的具体的pid,从1到level各级别的namesapce,这里相当于一个指针,只不过不需要再分配空间 };
上面的结构体就是内核中进程的标示符,可以用于标识内核中的tasks、process groups和sessions。这个结构体和具体的task通过hash来关联,通过具体的task对应的pid的值可以获得绑定的pid结构体。 属于具体的namespace的pid结构upid:
struct upid { /* Try to keep pid_chain in the same cacheline as nr for find_vpid */ int nr; struct pid_namespace *ns; struct hlist_node pid_chain; };
该结构体是用来获得结构体pid的具体的id,它只对特定的namespace可见。会通过函数find_pid_ns(int nr,pid_namespace *ns)函数来获得具体的PID结构。
Cgroup:
Cgroup是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(CPU,内存,IO等等)的机制。Cgroup也是LXC位实现虚拟化所使用的资源管理的手段。可以说没有Cgroup就没有LXC,也就没有Docker。
Cgroup提供的功能:
限制进程组可以使用的资源数量。一单进程组使用的内存达到限额就会引发异常
控制进程组的优先级。可以使用cpu子系统为某个进程组分配特定的cpu share
记录进程组使用资源的数量
进程组隔离。eg.使用ns子系统可以使不同的进程组使用不同的namespace,已达到
进程组控制
Cgroup子系统:
blkio:设定输入输出限制
cpu:使用调度程序对CPU的Cgroup任务访问
cpuacct:自动生成Cgroup任务所使用的CPU报告
cpuset:为Cgroup中的任务分配独立的CPU(多核系统中)和内存节点
devices:允许或拒绝Cgroup中的任务访问设备
freezer:挂起或回复Cgroup中的任务
memory:Cgroup中任务使用内存的限制
net_cls:允许Linux流量控制程序识别从cgroup中生成的数据包
ns:命名空间子系统
Cgroup中的概念:
任务(Task):任务就是系统中的一个进程
控制族群(control group):一组按某种标准划分的进程,控制族群通常按照应用划分,即与某应用相关的一组进程,被划分位一个进程组(控制族群)。Cgroup中资源控制都是以控制族群为单位实现。一个进程可以加入某个控制族群,也可以从一个进程组迁移到另一个控制族群。
层级:控制族群可以组织成层级的形式--控制族群树。
子系统:资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须attach到一个层级上才能起作用,一个子系统附件到某个层级以后,这个层级上的所有控制族群都收到这个子系统的控制。
Cgroup使用控制CPU:
在Ubuntu中,cgroup默认挂载位置/sys/fs/cgroup目录。ls查看一下:
yan@yan-Z400:/sys/fs/cgroup$ ls
blkio cpu cpuset freezer memory systemd
cgmanager cpuacct devices hugetlb perf_event
可以看到cgroup的不同子系统目录。 在CPU文件夹中新建一个geekcome目录,默认ubuntu已经将子系统全部挂载了: 进入cpu文件夹新建一个geekcome文件夹,然后查看:
yan@yan-Z400:/sys/fs/cgroup/cpu$ ls
cgroup.clone_children cgroup.sane_behavior cpu.shares lxc tasks
cgroup.event_control cpu.cfs_period_us cpu.stat notify_on_release
cgroup.procs cpu.cfs_quota_us geekcome release_agent
新建文件夹后在文件夹里会自动生成相应的文件:
geekcome ├── cgroup.clone_children ├── cgroup.event_control ├── cgroup.procs ├── cpu.cfs_period_us ├── cpu.cfs_quota_us ├── cpu.shares ├── cpu.stat ├── notify_on_release └── tasks
下面就跑一个死循环程序,导致CPU使用率到达100%。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
yan 20 0 25928 4848 2324 R 100.0 0.1 0:22.47 python
现在执行如下的命令:
echo "50000" >/sys/fs/cgroup/cpu/geekcome/cpu.cfs_quota_us
echo "5046" >/sys/fs/group/cpu/geekcome/tasks
再top查看一下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
yan 20 0 25928 4844 2324 R 49.8 0.1 0:49.27 python
进程5046的cpu使用率从100%降低到50%。在Cgroup里,可以使用cpu.cfs_period_us和cpu.cfs.quota_ua来限制在单位时间里可以使用的cpu时间。这里cfs的含义是Completely Fair Scheduler(完全公平调度器)。cpu.cfs_period_us是时间周期,默认是100000(百毫秒)。cpu.cfs_quota_us是在这期间可以使用的cpu时间,默认-1(无限制)。 在上面的实例中,通过修改cpu.cfs_period_us文件,将百毫秒修改为一半,成功将CPU使用率降低到50%。cfs.quota_us文件主要对于多核的机器,当有n个核心时,一个控制组的进程最多能用到n倍的cpu时间。 Cgroup除了资源控制功能外,还有资源统计功能。云计算的按需计费可以通过它来实现。这里只实例CPU的控制,其他的子系统控制请自行实验。
LXC使用:
创建一个容器:
lxc-create -n name [-f config_file] [-t template] sudo lxc-create -n ubuntu01 -t ubuntu
-n就是虚拟机的名字,-t是创建的模板,保存路径在/usr/lib/lxc/templates。模板就是一个脚本文件,执行一系列安装命令和配置(穿件容器的挂载文件系统,配置网络,安装必要软件,创建用户并设置密码等)。
显示已经创建的容器:
lxc-ls
启动一个容器:
lxc-start -n name [-f config_file] [-s KEY=VAL] [command]
启动一个容器,可以指定要执行的命令,如果没有指定,lxc-start会默认执行/sbin/init命令,启动这个容器。
关闭一个容器:
lxc-stop -n name
快速启动一个任务,任务执行完毕后删除容器:
lxc-execute -n name [-f config_file] [-s KEY=VAL ] [--] command
它会按照配置文件执行lxc-create创建容器,如果没有指定的配置文件,则选择默认。该命令一般用于快速使用容器环境执行摸个任务,任务执行完毕后删除掉容器。
分享到:
相关推荐
LXC(Linux Containers)是Linux内核提供的一种轻量级虚拟化技术,它不创建完整的操作系统实例,而是通过Namespace和Control Groups(Cgroups)来实现资源隔离和分配。 Namespace是Linux内核中的一个关键特性,它...
LXC是一种轻量级虚拟化技术,它允许用户在另一个Linux系统内运行一个完整的Linux系统。这种方式下,一个容器(container)是Linux机器上的一组进程,这些进程形成一个隔离的环境。在容器内部,它看起来就像是一个...
操作系统级虚拟化(如Linux Containers,LXC)是一种轻量级的虚拟化技术,它不运行多个独立的操作系统,而是通过在单个操作系统内创建独立的容器,实现隔离的应用环境。每个容器共享宿主操作系统的内核,但拥有独立...
他阐述了轻量级虚拟化技术如何推动PaaS(平台即服务)的发展,并介绍了Linux Containers(LXC)以及相关的技术概念,如Namespaces、Control Groups(cgroups)、AUFS、BTRFS以及Docker等。接下来,我们详细解析这些...
2. LXC(Linux Containers):轻量级容器技术,不依赖于硬件虚拟化,而是通过命名空间和控制组(cgroups)来隔离资源。LXC可以在同一内核上运行多个相互隔离的应用环境,启动速度快,性能接近原生。 3. Xen:一个...
LXC提供了一种轻量级的虚拟化技术,允许在单一主机上运行多个相互隔离的实例,这些实例在功能上类似于虚拟机,但它们之间共享操作系统内核,因此在资源占用上更为高效。 LXC的实现依赖于Linux内核提供的几种关键...
随着LXC技术的不断成熟,轻量级虚拟化预计将进一步推动平台即服务(PaaS)的发展,成为云服务部署的标准方式。这将促进更多的企业采用容器技术,优化资源管理,降低运维成本。 【总结】 本文详细介绍了Linux容器...
这种技术的优势在于它轻量级和高效率,因为容器间共享同一个操作系统的内核,与传统的虚拟机技术相比,不需要模拟所有的硬件,因此资源开销更小,启动速度更快。 虚拟化管理程序,也被称作Hypervisor或者虚拟机监视...
而LXC则利用命名空间和控制组(cgroups)实现轻量级的容器化,不需虚拟化硬件,适用于快速部署和管理应用。 接下来,我们来谈谈Helm,这是Kubernetes生态中的一个核心组件,用于管理和部署应用到Kubernetes集群。...
LXC(Linux Containers)是一种操作系统级的虚拟化技术,它允许用户在单个主机上运行多个隔离的Linux实例,这些实例被称为容器。与传统的虚拟化技术不同,LXC不依赖于硬件虚拟化,而是利用了Linux内核中的命名空间...
在Ubuntu 16.04环境下,LXC(Linux Containers)是一项重要的轻量级虚拟化技术。LXC 与传统的虚拟化技术(例如 Qemu 或 VMware)不同,因为它们不模拟硬件,而是让容器共享宿主机的操作系统。这使得容器轻量、启动...
- **LXC**:Linux Containers,一种在Linux内核支持下的轻量级虚拟化技术。 - **GeoStack**:可能是指一套用于地理信息系统的开源软件栈,包含地图服务、数据存储、分析等功能组件。 4. **角色规划**: - **容器...
4. LXC(Linux Containers):轻量级容器技术,不模拟硬件,而是隔离进程和资源,提供快速的启动和高效的资源利用。 虚拟机在开发、测试、部署和隔离环境中都有广泛的应用。例如,你可以在一台机器上同时运行多个...
- **LXC**:Linux Containers,一种在Linux内核支持下的轻量级虚拟化技术。 - **GeoStack**:地理信息系统平台,用于处理、存储和分析地理数据。 - **容器宿主机**:运行LXC并承载多个容器的主机。 - **容器**:在...
相较于传统的虚拟机技术,容器提供了轻量级的虚拟化解决方案,允许在同一主机上运行多个相互隔离的应用程序环境。本文将详细介绍如何在Ubuntu系统中安装、配置并使用LXC(Linux Containers)容器。 #### 二、LXC...
文章还提及了容器技术在通用领域的应用,如Docker、LXC(Linux Containers)和OpenVZ等,这些技术为应用提供了轻量级的虚拟化环境。在嵌入式系统中,研究这些容器技术的特性,如何将它们应用于资源受限和配置多样性...
容器是一种轻量级的虚拟化技术,它通过共享操作系统的内核来实现快速部署和资源效率。然而,这种共享内核的特性也带来了安全挑战。 【虚拟化技术的发展】 虚拟化技术起源于1960年代,IBM的IBM7044首次实现了虚拟化...
4. **虚拟化类型**:文档提到的是LXC容器,这是一种轻量级虚拟化,与传统的VM(虚拟机)不同,LXC容器不包含完整的操作系统,而是共享宿主机的内核。 5. **集群类型**:虽然未详细说明集群类型,但通常在GeoStack...