Namespace

linux.jpg

Namespace

概念

Linux namespace是Kernel的一个功能,可以将一些系统资源进行隔离。Namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。

用户可以创建指定类型的namespace,并将程序放入该namespace中,表示从前的系统中隔离出一个进程的运行环境,在此运行环境中的进程将认为自己拥有该namespace中的独立资源。 实际即使没有手动创建namespace,Linux系统开机后也会创建一个默认的namespace,称为 root namespace,所有进程默认都运行在root namespace中,每个进程都认为自己拥有该namespace中所有的全局资源。
每一个namespace都是基于当前内核,root namespace直接基于内核用户创建的namespace运行环境基于当前所在的namespace,不直接基于内核是因为namespace可能会修改某些运行时内核参数。

namespace资源类型

每种资源都是随着Linux内核版本更新逐渐加入的,所以有些内核版本可能不具备某种namespace

namespace类型 隔离的资源
IPC SystemV IPC(信号量、消息队列、共享内存)和POSIX消息队列
Network 网络设备、网络栈、端口
Mount 文件系统挂载点
PID 进程编号
User 用户和用户组
UTS 主机名和NIS域名
Cgroup Cgroup的根目录

查看进程所在的namespace

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
]# ll /proc/$$/ns  && ll /proc/1/ns
total 0
lrwxrwxrwx 1 root root 0 Jul 4 12:08 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Jul 4 12:08 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Jul 4 11:35 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Jul 4 11:35 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Jul 4 12:08 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jul 4 12:08 uts -> uts:[4026531838]
total 0
lrwxrwxrwx 1 root root 0 Jul 4 11:18 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 root root 0 Jul 4 11:18 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 root root 0 Jun 30 23:28 net -> net:[4026531956]
lrwxrwxrwx 1 root root 0 Jun 30 23:28 pid -> pid:[4026531836]
lrwxrwxrwx 1 root root 0 Jul 4 11:18 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jul 4 11:18 uts -> uts:[4026531838]

路径下的文件都是软连接,指向的文件名中的数字表示namespace的inode,如果不同进程对应的文件的inode相同说明两个进程是在同一个namespace中。

Cgroup

Cgroups(Control Groups) 是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。可以对一组进程及将来的子进程的资源的限制、控制和统计的能力,这些资源包括CPU,内存,存储,网络等。通过Cgroups,可以方便的限制某个进程的资源占用,并且可以实时的监控进程的监控和统计信息。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC (Linux Container)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x 2 root root 0 Jun 30 23:27 blkio #​​​定​​​输​​​入​​​/输​​​出​​​限​​​制​​​
lrwxrwxrwx 1 root root 11 Jun 30 23:27 cpu -> cpu,cpuacct #使​​​用​​​调​​​度​​​程​​​序​​​提​​​供​​​对​​​CPU的​​​cgroup任​​​务访​​问
​lrwxrwxrwx 1 root root 11 Jun 30 23:27 cpuacct -> cpu,cpuacct #自​​​动​​​生​​​成​​​cgroup中​​​任​​​务​​​所​​​使​​​用​​​的​​​CPU报​​​告
drwxr-xr-x 3 root root 0 Jun 30 23:27 cpu,cpuacct
drwxr-xr-x 2 root root 0 Jun 30 23:27 cpuset #​​​为​​​cgroup中​​​的​​​任​​​务​​​分​​​配​​​独​​​立​​​CPU(在​​​多​​​核​​​系​​​统​​​)和​​​内​​​存​​​节​​​点​​​
drwxr-xr-x 2 root root 0 Jun 30 23:27 devices #允​​​许​​​或​​​者​​​拒​​​绝​​​ cgroup 中​​​的​​​任​​​务​​​访​​​问​​​设​​​备
drwxr-xr-x 2 root root 0 Jun 30 23:27 freezer #挂​​​起​​​或​​​者​​​恢​​​复​​​ cgroup 中​​​的​​​任​​​务
drwxr-xr-x 2 root root 0 Jun 30 23:27 hugetlb #主要针对于HugeTLB系统进行限制,这是一个大页文件系统
drwxr-xr-x 3 root root 0 Jun 30 23:27 memory #设​​​定​​​ cgroup 中​​​任​​​务​​​使​​​用​​​的​​​内​​​存​​​限​​​制​​​,并​​​自​​​动​​​生​​​成​​​​​内​​​存​​​资​​​源使用​​​报​​​告
lrwxrwxrwx 1 root root 16 Jun 30 23:27 net_cls -> net_cls,net_prio
drwxr-xr-x 2 root root 0 Jun 30 23:27 net_cls,net_prio
lrwxrwxrwx 1 root root 16 Jun 30 23:27 net_prio -> net_cls,net_prio
drwxr-xr-x 2 root root 0 Jun 30 23:27 perf_event
drwxr-xr-x 2 root root 0 Jun 30 23:27 pids
drwxr-xr-x 4 root root 0 Jun 30 23:27 systemd

Cgroup分配限制资源

拿menory为例,进入/sys/fs/cgroup/memory下创建test,这样就相当创建一个menory的控制组,进入到test下会发现自动创建了许多文件,每个文件对应不同的限制条件,再将需要进行限制进程的PID添加到tasks中,这样就对这个进程的menory进行了限制,需要删除的话将这个目录删除即可