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一樣的。