linux命名空间(namespace)学习(一)
关于linux命名空间网络上有很多是关于docker的,也有关于linux的专门的linux的namespace介绍的,没有专门介绍Linux命名空间的应用的。所以我想先介绍一下linux命名空间的应用,然后再介绍linux内核对于命名空间的管理方式。好了,废话不多说先上原理吧。命名空间在linux中是实现资源隔离的一种手段,也是轻量级虚拟化的一种手段。可以实现多个用户,也可以实现多个网络设备..
关于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一样的。
更多推荐
所有评论(0)