Linux Kernel的一个功能,可以隔离一系列的系统资源:UTS、mount、PID、User、Network等。
UTSUTS Namespace主要用来隔离nodename和domainname两个系统标识。在UTS Namespace中,每个Namespace运行有自己的hostname。
mount用来隔离各个进程看到的挂载点视图。在不同Namespace进程中,看到的文件系统层次是不一样的。在mount namespace中调用mount()和umount()仅仅只会影响当前namespace内的文件系统,对全局的文件系统是没有影响的。即mount namespace在子进程中重新mount了/proc文件系统
PIDNamespace建立系统的不同视角,从用户角度来看,每个命名空间都应该像一个单独的Linux,A和B空间都有PID为1的init进程。子命名空间的进程映射到父命名空间的进程上,父命名空间知道每一个子命名空间的运行状态,而子命名空间之间是隔离的。
User使用Namespace可以做到UID级别的隔离,也就是说可以为UID为n的用户虚拟化出一个Namespace,在这个Namespace中,用户是有root权限的,但是在真实的物理机上,他还是那个UID为n的用户。
IPCIPC:共享内存、信号量、消息队列等;隔离开只让同一个Namespace下的进程才能互相通信;IPC需要有一个全局的ID,Namespace对这个ID隔离,不能让其他Namespace的进程看到
IPC Namespace用来隔离System V IPC和POSIX message queues。每个IPC Namespace都有自己的System V IPC和POSIX message queue
Network用来隔离网络设备、IP地址端口等网络栈的Namespace
可以让每个容器拥有自己独立的网络设备,而且容器内的应用可以绑定到自己的端口,这样不会互相冲突
Linux网络虚拟化技术
Linux CgroupNamespace主要解决了环境隔离的问题,但是计算机资源的使用问题没有解决,比如进程中使用CPU、内存、磁盘等计算资源是随心所欲的。Linux Cgroup就解决了进程资源利用上的限制或控制。
Linux Cgroups(Control Groups),控制与分离一个进程组群的资源(CPU、内存、磁盘输入输出、网络带宽)。通过Cgroups,可以方便的限制每个进程的资源占用,并且可以实时地监控进程地监控和统计信息,甚至在运行中的系统中也能动态配置cgroup
功能:
-
Resource Limitation:限制资源使用,比如内存使用上限以及文件系统的缓存限制
-
Prioritzation:优先级控制,比如CPU利用和磁盘IO吞吐
-
Accounting:一些审计或一些统计,主要用于计费
-
Control:挂起进程,恢复执行进程
-
cgroup是对进程分组管理的一种机制,一个cgroup包含一组进程,并可以在这个cgroup上增加Linux subsystem的各种参数配置,将一组进程和一组subsystem的系统参数关联起来
-
subsystem是一组资源控制的模块
-
blkio设置对块设备(如硬盘、USB)输入输出的访问控制
-
cpu设置对cgroup中进程的CPU被调度的策略
-
cpuacct可以统计cgroup中进程的CPU占用
-
cpuset 为Cgroup中的任务分配独立CPU(多核)和内存节点
-
devices可以允许或者拒绝cgroup中的任务访问设备
-
memory设定任务使用的内存限制,自动生成内存使用报告
-
net_cls使用等级标识符(classid)标记网络数据包,可允许linux流量控制程序(tc)识别从具体cgroup中生成的数据包
-
net_prio用来设计网络流量的优先级
-
hugetlb针对HugeTLB系统进行设计,这是大页文件系统
-
-
tasks,任务,就是系统的一个进程
-
control group,控制组,cgroup的呈现就是一个目录带一系列的可配置文件
-
hierarchy,层级,控制组可以组织成hierarchical,即一颗控制组的树(目录结构)。控制树上的子节点;即hierarchy就是在一个或多个子系统上的cgroups目录树
-
subsystem,子系统,一个子系统就是一个资源控制器,比如CPU子系统就是控制CPU时间分配的一个控制器。子系统必须附加到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都会受到这个子系统的控制。
三个组件:cgroup控制组、hierarchy层级、subsystem子系统
三个组件之间的关系:
-
一个subsystem只能附加到一个hierarchy上
-
一个hierarchy可以附加多个subsystem
-
一个进程可以作为多个cgroup的成员,但是这些cgroup必须在不同的hierarchy中
-
一个进程进行了fork,子父进程是在同一个cgroup中的,也可以根据需要将其移动到其他cgroup中
Linux文件系统由两部分组成:
-
bootfs:bootloader+kernel
-
rootfs:包含典型linux系统中的/dev /proc /bin /etc等标准目录和文件
传统的Linux加载bootfs时会先将rootfs设为read-only,然后在系统自检之后将rootfs从read-only改为read-write,然后我们就可以在rootfs上进行写和读的 *** 作了。
但Docker的镜像却不是这样,它在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用union mount(UnionFS的一种挂载机制)将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。在加载了这么多层的rootfs之后,仍然让它看起来只像是一个文件系统,在Docker的体系里把union mount的这些read-only的rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行 *** 作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。
联合文件系统的解决方案有以下几个:AUFS、DeviceMapper、Btrfs、OverlayFS
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)