Docker背后的内核知识:命名空间资源隔离---亲测

参考URL:

https://linux.cn/article-5057-1.html

实现代码(网络和用户空间只是看懂了)

实际上,Linux内核实现namespace的主要目的就是为了实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛自己置身于一个独立的系统环境中,以此达到独立和隔离的目的。

需要说明的是,本文所讨论的namespace实现针对的均是Linux内核3.8及其以后的版本。


Namespace


系统调用参数


隔离内容


UTS


CLONE_NEWUTS


主机名与域名


IPC


CLONE_NEWIPC


信号量、消息队列和共享内存


PID


CLONE_NEWPID


进程编号


Network


CLONE_NEWNET


网络设备、网络栈、端口等等


Mount


CLONE_NEWNS


挂载点(文件系统)


User


CLONE_NEWUSER


用户和用户组

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <sched.h>
#include <signal.h>
#include <unistd.h>

#define STACK_SIZE (1024 * 1024)

static char child_stack[STACK_SIZE];
char* const child_args[] = {"/bin/bash", NULL};

int child_main(void* args) {
    printf("run in child process!\n");
    sethostname("Changens", 12);
    execv(child_args[0], child_args);
    return 1;
}

int main() {
    printf("programe beginning....\n");
    int child_pid = clone(child_main, child_stack+STACK_SIZE, CLONE_NEWNS|CLONE_NEWPID|CLONE_NEWIPC|CLONE_NEWUTS|SIGCHLD, NULL);
    waitpid(child_pid, NULL, 0);
    printf("exited.\n");
    return 0;
}

 

时间: 2024-09-19 00:09:50

Docker背后的内核知识:命名空间资源隔离---亲测的相关文章

Docker背后的内核知识:命名空间资源隔离

Docker背后的内核知识:命名空间资源隔离 Docker这么火,喜欢技术的朋友可能也会想,如果要自己实现一个资源隔离的容器,应该从哪些方面下手呢?也许你第一反应可能就是chroot命令,这条命令给用户最直观的感觉就是使用后根目录/的挂载点切换了,即文件系统被隔离了.然后,为了在分布式的环境下进行通信和定位,容器必然需要一个独立的IP.端口.路由等等,自然就想到了网络的隔离.同时,你的容器还需要一个独立的主机名以便在网络中标识自己.想到网络,顺其自然就想到通信,也就想到了进程间通信的隔离.可能你

PostgreSQL 会话级资源隔离探索

背景 如果一个数据库对外提供的服务,或者承载的业务很多时,你首先想到的肯定是拆分数据库. 但是,拆分毕竟是有成本的,而且有时并不是所有的场景都适合拆分来解决. 如果多个业务混合在一起使用一个数据库,就容易造成资源的争抢. 那么不拆分的情况下,控制每个业务或者每个会话的资源使用呢? 如何区分来源应用 要隔离应用使用数据库的资源,首先要区分应用. 通常如果一个数据库提供了多个业务服务时,会给每个业务创建不同的库或者分配不同的用户. 当然,如果你用了同一个库,或者同一个数据库,就分不清业务了吗?当然不

(转) 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文)

  本文转自:http://mp.weixin.qq.com/s/aAHbybdbs_GtY8OyU6h5WA   专题 | 深度强化学习综述:从AlphaGo背后的力量到学习资源分享(附论文) 原创 2017-01-28 Yuxi Li 机器之心 选自arXiv 作者:Yuxi Li 编译:Xavier Massa.侯韵楚.吴攀     摘要   本论文将概述最近在深度强化学习(Deep Reinforcement Learning)方面喜人的进展.本文将从深度学习及强化学习的背景知识开始,包

《中国人工智能学会通讯》——12.51 现有知识图谱资源

12.51 现有知识图谱资源 知识图谱经历了由人工和群体智慧构建,到面向互联网利用机器学习和信息抽取技术自动获取的过程.根据信息来源和获取方式的不同,目前的知识图谱分为以下几类. 依靠人工构建的知识资源 早期知识资源建立是通过人工添加和群体智能合作编辑得到,如英文 Wordnet [1] 和 Cyc 项目[2] ,以及中文的Hownet.Cyc 是一个通用的世界知识库,始建于 1984 年,其目的是将上百万条知识编码为机器可处理形式,并在此基础上实现知识推理等人工智能相关任务.Cyc 包含了 5

Greenplum 资源隔离的原理与源码分析

背景 Greenplum是一个MPP的数据仓库系统,最大的优点是水平扩展,并且一个QUERY就能将硬件资源的能力发挥到极致. 但这也是被一些用户诟病的一点,因为一个的QUERY就可能占光所有的硬件资源,所以并发一多的话,query相互之间的资源争抢就比较严重. Greenplum资源隔离的手段 Greenplum为了降低并发query之间的资源争抢,设计了一套基于resource queue的资源管理方法. 每个resource queue定义了资源的使用或限制模式,根据用户的用途将用户指派给r

浅谈Hadoop YARN资源隔离机制

编者按:Hadoop  YARN同时支持内存和CPU两种资源的调度,在YARN中,资源管理由ResourceManager和NodeManager共同完成,其中,ResourceManager中的调度器负责资源的分配,而NodeManager则负责资源的供给和隔离.本文董西城将会介绍YARN在资源隔离方面的一些进展. 作者原文: 资源调度和资源隔离是YARN作为一个资源管理系统,最重要和最基础的两个功能.资源调度由ResourceManager完成,而资源隔离由各个NodeManager实现,在

深入解析Docker背后的namespace技术

相信你在很多地方都看到过"Docker基于mamespace.cgroups.chroot等技术来构建容器"的说法,但你有没有想过为何容器的构建需要这些技术? 为什么不是一个简单的系统调用就可以搞定?原因在于Linux内核中并不存在"linux container"这个概念,容器是一个用户态的概念. Docker软件工程师Michael Crosby将撰写一些列博客,深入到Docker运行的背后,探索在 docker run这段代码的背后发生了什么,这是系列博客的第

Linux cgroup资源隔离各个击破之 - io隔离

Linux Cgroup blkio子系统的用法. blkio子系统支持的两种IO隔离策略 .1. (Completely Fair Queuing 完全公平队列)cfq io调度策略,支持按权重分配IO处理的时间片,从而达到IO在各资源组直接的调度和限制的目的,权重取值范围100-1000.通过以下两个文件进行配置. blkio.weight 默认值 blkio.weight_device 块设备级的值 (major:minor weight) (优先级高于blkio.weight) 例子 e

Linux cgroup资源隔离各个击破之 - cpu隔离1

Linux cgroup 有两个子系统支持CPU隔离.一个是cpu子系统,另一个是cpuset子系统. cpu子系统根据进程设置的调度属性,选择对应的CPU资源调度方法 .1. 完全公平调度 Completely Fair Scheduler (CFS)原理详见https://www.kernel.org/doc/Documentation/scheduler/sched-design-CFS.txtCFS用于处理以下几种进程调度策略SCHED_OTHERSCHED_BATCHSCHED_IDL