Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认为自己具有独立的资源实例。这项技术本来没有掀起多大的波澜,是容器技术的崛起让他重新引起了大家的注意。
命名空间是全局资源的一种抽象,将资源放到不同的命名空间中,各个命名空间中的资源是相互隔离的。
命名空间将全局系统资源包装在一个抽象中,使得命名空间中的进程认为它们拥有独立的资源实例。命名空间可用于多种目的,最重要的是实现容器,一种轻量级虚拟化技术。本系列的第二篇文章将看一下命名空间的一些细节和 API。本系列中的第一篇文章对命名空间进行了总览。本文将看一下命名空间的 API 中的一些细节,并在一些例子中展示运行中的 API。
目前我们所提到的容器技术、虚拟化技术(不论何种抽象层次下的虚拟化技术)都能做到资源层面上的隔离和限制。
Linux对Namespace的操作,主要是通过clone、setns和unshare这3个系统调用来完成的,clone创建新进程时,接收一个叫flags的参数,这些flag包括CLONE_NEWNS、CLONE_NEWIPC、CLONE_NEWUTS、CLONE_NEWNET(Mount namespace)、CLONE_NEWPID和CLONE_NEWUSER,用于创建新的namespace,这样clone创建出来新进程之后就属于新的namespace了,后续新进程创建的进程默认属于同一namespace。
随着 Docker、Linux Containers 这些工具的出现,将 Linux 进程隔离到自己的小系统环境中隔离变得非常容易。这使得在一台真实的 Linux 机器上运行各种各样的应用成为可能,并确保它们之间不会互相干扰,而无需使用额外的虚拟机。这些工具为 PaaS 服务商带来了巨大的福音。但是这背后到底是如何实现的呢?
初始化高端内存线性地址中永久映射的全局变量.IMX6ULL这里的宏没开,所以这里应该是空
在使用 Kubernetes 时,可能会遇到一些网络问题。当通过检查配置与日志无法排查错误时,这时就需要抓取网络数据包,但是Pod内一般不会安装tcpdump命令,那有没有方法可以直接通过宿主机抓取Pod网络数据包?
PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。要创建新的Namespace,只需要在调用clone时指定相应的flag。 Linux Namespaces机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。不同Container内的进程属于不同的Namespace,彼此透明,互不干扰。下面我们就从clone系统调用的flag出发,来介绍各个Namespace。
如果你是刀友,那我们就将这个系列当做容器方面的从零单排吧,希望这个系列能够帮助你了解并爱上docker,下周将介绍苏研DCOS v0.5,敬请期待!
接触过docker的同学多多少少听过这样一句话“docker容器通过linux namespace、cgroup特性实现资源的隔离与限制”。今天我们来尝试学习一下这两个东西。
Docker is written in the Go programming language and takes advantage of several features of the Linux kernel to deliver its functionality.
学习一下linux kernel namespace的代码还是很有必要的,让你对docker容器的namespace隔离有更深的认识。我的源码分析,是基于Linux Kernel 4.4.19 (https://www.kernel.org/pub/linux/kernel/v4.x/patch-4.4.19.gz)版本的,由于namespace模块更新很少,因此其他相近版本之间雷同。User namespace由于与其他namespaces耦合在一起,比较难分析,我将在后续再作分析。 Kernel,Nam
一位同学曾给我打比方:宿主机就好比一间大房子,docker把它成了N个小隔断。在这些小隔断之间,有独立的卫生间、小床、电视...
刚开始接触 Kubernetes 时,你学到的第一件事就是每个 Pod 都有一个唯一的 IP 和主机名,并且在同一个 Pod 中,容器可以通过 localhost 相互通信。所以,显而易见,一个 Pod 就像一个微型的服务器。
上回说到,小E发现了为什么鹿晗和吴亦凡谈恋爱还没有导致新某某博服务器挂掉的秘密(划掉,文末再讲)Linux下的三个秘密,可以让同一台Linux服务器上,混部不同业务的服务进程,并且避免发生网络Socket端口,CPU与RAM资源,以及其他资源权限的三大冲突。
在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件,这是很多时候我们都不愿意看到的,我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。
Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID、主机名、用户 ID、文件名、网络和进程间通信等资源的隔离。Docker 利用 Linux 内核的 Namespace 特性,实现了每个容器的资源相互隔离,从而保证容器内部只能访问到自己 Namespace 的资源。
RXTX 的下载可以到官网或者Fizzed,官网发现并没有64位的支持,但是在Fizzed中找到的2.2版的64,32的windows和Linux版本http://fizzed.com/oss/rxtx-for-java 1.windows下的串口调试 将rxtxParallel.dll、rxtxSerial.dll拷贝到%JAVA_HOME%安装目录bin目录下 将rxtxParallel.dll、rxtxSerial.dll拷贝到%JAVA_HOME%安装目录jre/bin目录下(eclipse开发时调
RXTX 的下载可以到官网或者Fizzed,官网发现并没有64位的支持,但是在Fizzed中找到的2.2版的64,32的windows和Linux版本http://fizzed.com/oss/rxtx-for-java
上篇我们从进程 clone 的角度,结合代码简单分析了 Linux 提供的 6 种 namespace,本篇从源码上进一步分析 Linux namespace,让你对 Docker namespace 的隔离机制有更深的认识。我用的是 Linux-4.1.19 的版本,由于 namespace 模块更新都比较少,所以,只要 3.0 以上的版本都是差不多的。 从内核进程描述符 task_struct 开始切入 由于 Linux namespace 是用来做进程资源隔离的,所以在进程描述符中,一定有 names
首先,先提一下Namespace是什么。最早知道这个名词是在学习C++语言的时候。由于现在的系统越来越复杂,代码中不同的模块就可能使用相同变量,于是就出现了Namespace,来对全局作用域进行划分。
RXTX 的下载可以到官网或者Fizzed,官网发现并没有64位的支持,但是在Fizzed中找到的2.2版的64,32的windows和Linux版本http://fizzed.com/oss/rxtx-for-java 1.windows下的串口调试 将rxtxParallel.dll、rxtxSerial.dll拷贝到%JAVA_HOME%安装目录bin目录下 将rxtxParallel.dll、rxtxSerial.dll拷贝到%JAVA_HOME%安装目录jre/bin目录下(eclipse开发时调用,减少麻烦) 将RXTXcomm.jar 拷贝到%JAVA_HOME%\jre\lib\ext\RXTXcomm.jar(开发时直接导入) 2.Linux下的串口调试 首先确定Linux处理器型号,对应选择RXTX的Linux版本。 如处理器为i386,则将Linux i686版本中的两个os文件复制到系统%JAVA_HOME%/jre/lib/i386(即JDK目录中的系统文件夹) 将RXTXcomm.jar拷贝到%JAVA_HOME%/jre/lib/ext文件夹 代码不变,即可运行使用。 在实际开发中,由于使用树莓派测试,树莓派使用Raspbian系统(使用uname -a命令可查看系统内核信息) Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l GNU/Linux 处理器型号armv6l,在下载的RXTX工具包中并无此种系统版本,在实际测试中,所找到的RXTX工具包也都不能使程序运行,均报出系统位数不符。
User namespace 是 Linux 3.8 新增的一种 namespace,用于隔离安全相关的资源,包括 user IDs and group IDs,keys, 和 capabilities。同样一个用户的 user ID 和 group ID 在不同的 user namespace 中可以不一样(与 PID nanespace 类似)。换句话说,一个用户可以在一个 user namespace 中是普通用户,但在另一个 user namespace 中是超级用户。
本文中,继续上周关于用户命名空间的讨论。特别的,我们看一下更多有关与用户命名空间、capabilities 的交互及用户命名空间与其它类型的命名空间的结合。本文是命名空间系列的最后一篇。
在应用没有用容器的方式运行时,可以用nsenter和cgroup相关命令来进行控制,对应用进行资源隔离和namespace限制。本文先给出命令工具的入口,后续单独出一篇讲其应用场景及使用样例。
对于运行在后台的Docker容器,我们运维人员时常是有登陆进去的需求。登陆Docker容器的方式: 1)使用ssh登陆容器。这种方法需要在容器中启动sshd,存在开销和攻击面增大的问题。同时也违反了Docker所倡导的一个容器一个进程的原则。 参考Docker容器学习梳理--SSH方式登陆容器 2)使用自带命令docker attach登陆容器。命令格式:docker attach container_id。不过docker attach存在的问题是:当多个窗口同时attach到同一个容器时,所有的窗口都会
绿盟科技研究通讯曾经发表过容器逃逸的技术文章《【云原生攻防研究】容器逃逸技术概览》[1],该文中探讨了已有的容器逃逸技术。本文将沿着上文的思路,主要从Linux内核漏洞的角度对容器逃逸进行深度介绍,包括攻击原理、自动化利用和防御思路等内容。
Linux Namespace是Linux提供的一种内核级别环境隔离的方法。很早以前的Unix有一个叫chroot的系统调用(通过修改根目录把用户jail到一个特定目录下),chroot提供了一种简单的隔离模式:chroot内部的文件系统无法访问外部的内容。Linux Namespace在此基础上,提供了对UTS、IPC、mount、PID、network、User等系统资源的隔离机制。在此机制下,这些系统资源不再是全局性的,而是属于特定的Namespace。每个Namespace里面的资源对其他Namespace都是透明的。要创建新的Namespace,只需要在调用clone时指定相应的flag。Linux Namespaces机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。不同container内的进程属于不同的Namespace,彼此透明,互不干扰。
近日,绿盟科技监测发现Linux kernel 存在一个权限提升漏洞(CVE-2020-14386),由于net/packet/af_packet.c在处理AF_PACKET时存在整数溢出,导致可进行越界写从而实现权限提升,攻击者可以利用此漏洞从非特权进程获得系统root权限。使用了Linux Kernel的openshift/docker/kubernetes等虚拟化产品可能会受到该漏洞影响,导致虚拟化逃逸,请相关用户采取措施进行防护。
用了这么久的docker,对docker的实现原理挺感兴趣的,在对Linux下docker的实现原理了解之后,我没有用过Windows下的docker,更加好奇Windows下的docker是如何实现的(它并不开源),问了问owefsad师傅,说是可能用到了hyperV,那么可能类似Vmware吗?不知道啊。
nsenter 是一个可以用来进入到目标程序所在 Namespace 中运行命令的工具,一般常用于在宿主机上调试容器中运行的程序。
Linux的Namespace[1]机制提供了一种资源隔离的解决方案,而目前Linux内核里面实现且支持的Namespace有7种,如下表:
本人菜鸡一枚,这里对docker底层原理也只是简单的描述了一下,想要深入研究的小伙伴,建议可以看其他文章
Linux 3.8 合并窗口接受了 Eric Biederman 的大量用户命名空间及相关的补丁。尽管仍有一些细节待完成,例如,许多 Linux 文件系统还不知道用户命名空间,但用户命名空间的实现已经在功能上完成了。
Docker 概念总览 Docker Engine Docker 引擎 Docker architecture Docker 架构 Docker daemon Docker 守护进程,dockerd 命令 Docker client Docker 客户端,docker 命令 Docker registries Docker 仓库 Docker objects Docker 对象 IMAGES 镜像 CONTAINERS 容器 SERVICES 服务 Services allow you to scale c
本文主要理解的一个核心点,什么是Pod?我们先不关注Pod怎么使用,怎么调度,如何实现最佳实践。这些问题后续继续讨论,在不懂为什么k8s要有Pod的情况下,去先深究最佳实践没有实际意义。
在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。
线上排查pod 问题一般有两种方式,kubectl log 或者 kubectl exec 调试。如果你的 log 写不够优雅,或者需要排除网络问题必须进容器,就只能 exec 了。
我们知道docker 是基于linux 系统的namespace + cgroup实现的进程隔离技术,在mac下并不能很好的支持,因此需要运行在虚拟机上,虚拟机和docker的区别在于,虚拟机多了一层hypervisor。FreeBSD 下的虚拟技术 bhyve (The BSD Hypervisor) 包含在了 FreeBSD 10.0 发行版中。而这个 xhyve 是基于 bhyve 的 Mac OS X 移植版本
Docker 是“新瓶装旧酒”的产物,依赖于 Linux 内核技术 chroot 、namespace 和 cgroup。本篇先来看 namespace 技术。 Docker 和虚拟机技术一样,从操作系统级上实现了资源的隔离,它本质上是宿主机上的进程(容器进程),所以资源隔离主要就是指进程资源的隔离。实现资源隔离的核心技术就是 Linux namespace。这技术和很多语言的命名空间的设计思想是一致的(如 C++ 的 namespace)。 隔离意味着可以抽象出多个轻量级的内核(容器进程),这些进程可以充
说到docker,大家都懂。但是LXC可能就比较陌生。Docker的起源于LXC。LXC的英文全称是Linux Container,相比较其他虚拟机而言,是一种轻量级虚拟化技术,它介于Chroot(linux的一个改变根目录挂载点的机制)和完整开发的虚拟机之间。LXC不使用单独的内核资源,但是可以创建一个类似的Linux操作系统环境。
随着容器技术的发展,它的安全、隔离和资源控制的功能也在不断进步。本文中,我们将回顾Docker容器如何仅仅使用linux的原始功能来实现安全与隔离,比如namespaces, cgroups, capabilities等。 📷 虚拟化和隔离 操作系统级的虚拟化、容器、空间以及“chroot with steroids”,其实都定义了同一个概念:用户空间隔离。类似Docker的产品都使用了操作系统级的虚拟化,通过用户空间隔离可以提供额外的安全性。 0.9版本起,Docker包含了libcon
AppArmor 主要的作用是设置某个可执行程序的访问控制权限,可以限制程序 读/写某个目录/文件,打开/读/写网络端口等等。
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。这种隔离机制和 chroot 很类似,chroot 是把某个目录修改为根目录,从而无法访问外部的内容。Linux Namesapce 在此基础之上,提供了对 UTS、IPC、Mount、PID、Network、User 等的隔离机制,如下所示。
学校介绍 悉尼科技大学(University of Technology Sydney,简称UTS)是世界著名的新兴大学。在2022年QS世界大学排名上,UTS位居全球第137位,澳大利亚第9位。UTS是全球排名第11位的新兴大学,澳大利亚排名第1位(QS Top 50 Under 50 2021)。 而在另一份2022年泰晤士高等教育(TIMES)的榜单上,UTS的表现同样出色,综合排名位列全球第143位。在2022年泰晤士高等教育世界大学影响力排名上,UTS位居全球第15位,澳大利亚第2位。 UTS是全
Docker三大支柱核心技术:Namespace、Cgroups和UnionFS,这节通过一个UTS Namespace简单实践小案例,更加直观理解Namespace资源隔离技术。
uni-app x 没有使用js和webview,它基于 uts 语言。在App端,uts在iOS编译为swift、在Android编译为kotlin,完全达到了原生应用的功能、性能。
我们在启动一个docker容器之后,在容器内的资源和宿主机上其他进程是隔离的,docker的资源隔离是怎么做到的呢?docker的资源隔离主要依赖Linux的Namespace和Cgroups两个技术点。Namespace是Linux提供的资源隔离机制,说的直白一点,就是调用Linux内核的方法,实现各种资源的隔离。具体包括:文件系统、网络设备和端口、进程号、用户用户组、IPC等资源
容器在 docker host 中实际上是一个进程,docker stop 命令本质上是向该进程发送一个 SIGTERM 信号。如果想快速停止容器,可使用docker kill 命令,其作用是向容器进程发送SIGKILL信号。
领取专属 10元无门槛券
手把手带您无忧上云