C語言建立核心容器

liiinuuux發表於2016-09-26

用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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章