1. 程式人生 > >linux名稱空間(namespace)學習(一)

linux名稱空間(namespace)學習(一)

關於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)
結果如下:

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

**

IPC名稱空間

**
操作過程如下:

 1. 啟動子程序名稱空間;
 2. 在子程序名稱空間中建立IPC通道;
 3. 在子程序中再啟動一個子程序,並檢視IPC;
 4. 子名稱空間的子名稱空間中檢視不到上一層名稱空間中的IPC通訊;

操作如下:

[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

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

[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ipcmk -Q
Message queue id: 0
[email protected]:/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           

[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

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

[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# exit
exit
this is in main
[email protected]:/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           

[email protected]:/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] ... ]
[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ipcrm -Q 0x5f9a3379
[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ipcs -q

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

[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# exit
exit
this is in main

**

PID名稱空間

**
操作過程如下:

1.啟動子程序名稱空間;
2.檢視子程序名稱空間中的程序;
3.檢視子程序名稱空間中的proc檔案系統

操作如下:

[email protected]:/usr/src/linux-2.6.39/driver/namespace/clone# ./clone 
this is in contain_func, and pid : 1 
[email protected]:/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
[email protected]:/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
[email protected]:/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
[email protected]:/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一樣的。