linux namespace入门,Linux Namespace 入门系列:Namespace API

Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法。用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认为自己具有独立的资源实例。这项技术本来没有掀起多大的波澜,是容器技术的崛起让他重新引起了大家的注意。

Linux Namespace 有如下 6 个种类:

| 分类 | 系统调用参数 | 相关内核版本 |

| ------------------ | ---------------- | ------------------------------------------------------------ |

| Mount namespaces | CLONE_NEWNS | Linux 2.4.19 |

| UTS namespaces | CLONE_NEWUTS | Linux 2.6.19 |

| IPC namespaces | CLONE_NEWIPC | Linux 2.6.19 |

| PID namespaces | CLONE_NEWPID | Linux 2.6.24 |

| Network namespaces | CLONE_NEWNET | 始于Linux 2.6.24 完成于 Linux 2.6.29 |

| User namespaces | CLONE_NEWUSER | 始于 Linux 2.6.23 完成于 Linux 3.8 |

namespace 的 API 由三个系统调用和一系列 /proc 文件组成,本文将会详细介绍这些系统调用和 /proc 文件。为了指定要操作的 namespace 类型,需要在系统调用的 flag 中通过常量 CLONE_NEW* 指定(包括 CLONE_NEWIPC,CLONE_NEWNS, CLONE_NEWNET,CLONE_NEWPID,CLONE_NEWUSER 和 `CLONE_NEWUTS),可以指定多个常量,通过 |(位或)操作来实现。

简单描述一下三个系统调用的功能:

clone() : 实现线程的系统调用,用来创建一个新的进程,并可以通过设计上述系统调用参数达到隔离的目的。

unshare() : 使某进程脱离某个 namespace。

setns() : 把某进程加入到某个 namespace。

具体的实现原理请往下看。

1. clone()

clone() 的原型如下:

int clone(int (*child_func)(void *), void *child_stack, int flags, void *arg);

child_func : 传入子进程运行的程序主函数。

child_stack : 传入子进程使用的栈空间。

flags : 表示使用哪些 CLONE_* 标志位。

args : 用于传入用户参数。

clone() 与 fork() 类似,都相当于把当前进程复制了一份,但 clone() 可以更细粒度地控制与子进程共享的资源(其实就是通过 flags 来控制),包括虚拟内存、打开的文件描述符和信号量等等。一旦指定了标志位 CLONE_NEW*,相对应类型的 namespace 就会被创建,新创建的进程也会成为该 namespace 中的一员。

clone() 的原型并不是最底层的系统调用,而是封装过的,真正的系统调用内核实现函数为 do_fork(),形式如下:

long do_fork(unsigned long clone_flags,

unsigned long stack_start,

unsigned long stack_size,

int __user *parent_tidptr,

int __user *child_tidptr)

其中 clone_flags 可以赋值为上面提到的标志。

下面来看一个例子:

/* demo_uts_namespaces.c

Copyright 2013, Michael Kerrisk

Licensed under GNU General Public License v2 or later

Demonstrate the operation of UTS namespaces.

*/

#define _GNU_SOURCE

#include

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[Linux Namespace 入门系列:Namespace API]http://www.zyiz.net/tech/detail-122446.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值