ITPub博客

首页 > 数据库 > 数据库开发技术 > C语言创建内核容器

C语言创建内核容器

原创 数据库开发技术 作者:liiinuuux 时间:2016-09-26 13:23:26 0 删除 编辑

用clone()创建一个内核容器,也就是一组命名空间。

点击(此处)折叠或打开

  1. #define _GNU_SOURCE
  2. #include <sys/types.h>
  3. #include <sys/wait.h>
  4. #include <sys/mount.h>
  5. #include <stdio.h>
  6. #include <sched.h>
  7. #include <signal.h>
  8. #include <unistd.h>


  9. #define STACK_SIZE (1024 * 1024)
  10. static char container_stack[STACK_SIZE];

  11. char* const container_args[] = {
  12.     "/bin/bash",
  13.     NULL
  14. };


  15. int container_main(void* arg)
  16. {
  17.     mount("none", "/", NULL, MS_REC|MS_PRIVATE, NULL);
  18.     mount("proc", "/proc", "proc", 0, NULL);
  19.     execv(container_args[0], container_args);
  20.     printf("Error!\n");
  21.     return 1;
  22. }

  23. int main()
  24. {
  25.     int container_pid = clone(container_main, container_stack+STACK_SIZE,
  26.             CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWNET | SIGCHLD, NULL);
  27.     waitpid(container_pid, NULL, 0);
  28.     return 0;
  29. }
调用
在自己独立的进程命名空间中,自身的进程号是1。
[root@localhost ns]# ./ns
[root@localhost ns]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 22:18 pts/1    00:00:00 /bin/bash
root        32     1  0 22:18 pts/1    00:00:00 ps -ef
[root@localhost ns]# echo $$
1


除了进程,还有独立的网络、挂载点等命名空间。
可以借助网桥让两个netns之间通信
先获取两个容器的进程号,然后执行下面脚本
p0=2016
p1=2024
ln -s /proc/$p0/ns/net /var/run/netns/$p0
ln -s /proc/$p1/ns/net /var/run/netns/$p1

brctl addbr br0
brctl stp br0 off
ip link set dev br0 up

ip link add e0 type veth peer name b0e0
brctl addif br0 b0e0
ip link set dev b0e0 up
ip link set e0 netns $p0
ip netns exec $p0 ifconfig e0 192.168.10.10 up

ip link add e1 type veth peer name b0e1
brctl addif br0 b0e1
ip link set dev b0e1 up
ip link set e1 netns $p1
ip netns exec $p1 ifconfig e1 192.168.10.11 up

如果是ehrl6,ip命令不支持“ip netns”选项,要到两个进程的容器里手工执行ifconfig

测试两个容器可以ping通
[root@localhost ~]# ip netns exec $p1 ping -c1 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=64 time=0.123 ms

--- 192.168.10.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.123/0.123/0.123/0.000 ms
[root@localhost ~]# ip netns exec $p0 ping -c1 192.168.10.11
PING 192.168.10.11 (192.168.10.11) 56(84) bytes of data.
64 bytes from 192.168.10.11: icmp_seq=1 ttl=64 time=0.130 ms

--- 192.168.10.11 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.130/0.130/0.130/0.000 ms

tcp链接也没问题
容器a
sh-4.2# gcc -o a a.c
sh-4.2# ./a 4444
listen ok.

容器b
sh-4.2# telnet 192.168.10.11 4444
Trying 192.168.10.11...
Connected to 192.168.10.11.
Escape character is '^]'.
hello
Connection closed by foreign host.

容器a
sh-4.2# ./a 4444
listen ok.
accepted 192.168.10.10





来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26239116/viewspace-2125594/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 调用mysql
请登录后发表评论 登录
全部评论

注册时间:2012-11-12

  • 博文量
    94
  • 访问量
    309726