关于linux命名空间网络上有很多是关于docker 的,也有关于linux的专门的linux的namespace介绍的,没有专门介绍Linux命名空间的应用的。所以我想先介绍一下linux命名空间的应用,然后再介绍linux内核对于命名空间的管理方式。好了,废话不多说先上原理吧。
命名空间在linux中是实现资源隔离的一种手段,也是轻量级虚拟化的一种手段。可以实现多个用户,也可以实现多个网络设备访问(虚拟化网络),但是实体网络却只有一个。资源隔离意味着比如不通PID命名空间看到的PID进程是不一样的,不通命名空间看到的IPC通信是不一样的。
命名空间分类:

 1. UTS命名空间
 2.IPC命名空间;
 3.PID命名空间;
 4.文件命名空间;
 5.网络命名空间;
 6.用户命名空间;

本博客会先在用户用户命名空间的使用方式上介绍前四种命名空间;
代码如下:
<ipc_clone.c>

#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sched.h>
#define STACK_SIZE (1024*1024)

static char container_stack[STACK_SIZE];
const char * args  = "/bin/bash";

int contain_func(void * arg)
{
        printf("this is in %s, and pid : %d \n", __func__, getpid());

        sethostname("alexander", 10);
        system("mount -t proc proc /proc");
        execv(args, arg);
        printf("this is in %s end\n", __func__);
        return 1;
}


int main(void)
{
        int clone_pid = clone(contain_func, container_stack + STACK_SIZE,
                              CLONE_NEWPID | CLONE_NEWUTS| CLONE_NEWIPC|CLONE_NEWNS |SIGCHLD , NULL);

        waitpid(clone_pid, NULL, 0);
        printf("this is in %s\n", __func__);
        return 0;
}

**

UTS命名空间

**
操作如下:
1.启动UTS命名空间进程,在进程内把UTS的名字命名为alexander;
2.在进程内启动了bash进程,查看子进程UTS命名空间,为alexander;
3.退出子进程,子命名空间不存在;
4.查看主命名空间,为系统的hostname(ubuntu)
结果如下:

root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# gcc ipc_clone.c -o clone
root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# hostname
alexander
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit
exit
this is in main
root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# hostname
ubuntu
root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# 

**

IPC命名空间

**
操作过程如下:

 1. 启动子进程命名空间;
 2. 在子进程命名空间中创建IPC通道;
 3. 在子进程中再启动一个子进程,并查看IPC;
 4. 子命名空间的子命名空间中查看不到上一层命名空间中的IPC通信;

操作如下:

root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcmk -Q
Message queue id: 0
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x5f9a3379 0          root       644        0            0           

root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit
exit
this is in main
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x5f9a3379 0          root       644        0            0           

root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcrm 0x5f9a3379
ipcrm: unknown argument: 0x5f9a3379
usage: ipcrm [ [-q msqid] [-m shmid] [-s semid]
          [-Q msgkey] [-M shmkey] [-S semkey] ... ]
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcrm -Q 0x5f9a3379
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    

root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit
exit
this is in main

**

PID命名空间

**
操作过程如下:

1.启动子进程命名空间;
2.查看子进程命名空间中的进程;
3.查看子进程命名空间中的proc文件系统

操作如下:

root@ubuntu:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.5  0.0   5748  1956 pts/15   S    04:35   0:00 [bash]
root        13  0.0  0.0   5216  1144 pts/15   R+   04:35   0:00 ps aux
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 04:35 pts/15   00:00:00 [bash]
root        14     1  0 04:35 pts/15   00:00:00 ps -ef
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# ls /proc/
1          cgroups   diskstats    fs          kallsyms    kpageflags     misc     pagetypeinfo  slabinfo       sysvipc      version_signature
15         cmdline   dma          interrupts  kcore       latency_stats  modules  partitions    softirqs       timer_list   vmallocinfo
acpi       consoles  driver       iomem       keys        loadavg        mounts   sched_debug   stat           timer_stats  vmstat
asound     cpuinfo   execdomains  ioports     key-users   locks          mpt      schedstat     swaps          tty          zoneinfo
buddyinfo  crypto    fb           ipmi        kmsg        mdstat         mtrr     scsi          sys            uptime
bus        devices   filesystems  irq         kpagecount  meminfo        net      self          sysrq-trigger  version
root@alexander:/usr/src/linux-2.6.39/driver/namespace/clone# exit
exit
this is in main

**

总结

**

上述子命名空间中的操作主要由如下关键宏操作:
CLONE_NEWPID:创建PID命名空间
CLONE_NEWUTS:创建UTS命名空间;
CLONE_NEWIPC:创建新的IPC命名空间;
CLONE_NEWNS:创建新的文件系统命名空间;
注意:
在创建新的IPC命名空间过程中必须指定创建文件系统命名空间,并且挂载新的proc文件系统,否则会使用上一层命名空间中的proc文件系统,这样显示的PID(无论是ps 命令还是top命令)就如上一层命名空间中显示的PID一样的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐