参考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;
}
![]()