C語言建立核心容器
用clone()建立一個核心容器,也就是一組名稱空間。
點選(此處)摺疊或開啟
-
#define _GNU_SOURCE
-
#include <sys/types.h>
-
#include <sys/wait.h>
-
#include <sys/mount.h>
-
#include <stdio.h>
-
#include <sched.h>
-
#include <signal.h>
-
#include <unistd.h>
-
-
-
#define STACK_SIZE (1024 * 1024)
-
static char container_stack[STACK_SIZE];
-
-
char* const container_args[] = {
-
"/bin/bash",
-
NULL
-
};
-
-
-
int container_main(void* arg)
-
{
-
mount("none", "/", NULL, MS_REC|MS_PRIVATE, NULL);
-
mount("proc", "/proc", "proc", 0, NULL);
-
execv(container_args[0], container_args);
-
printf("Error!\n");
-
return 1;
-
}
-
-
int main()
-
{
-
int container_pid = clone(container_main, container_stack+STACK_SIZE,
-
CLONE_NEWUTS | CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWNET | SIGCHLD, NULL);
-
waitpid(container_pid, NULL, 0);
-
return 0;
- }
呼叫
在自己獨立的程式名稱空間中,自身的程式號是1。
在自己獨立的程式名稱空間中,自身的程式號是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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux核心C語言將升級LinuxC語言
- C語言如何實現繼承及容器C語言繼承
- C++開發者快速學習Objective-C語言核心語法C++ObjectC語言
- C++20語言核心特性的變化C++
- c語言的二叉樹的建立C語言二叉樹
- C語言建立空白Windows視窗程式碼C語言Windows
- C語言 C語言野指標C語言指標
- C語言---“C語言 誰與爭鋒?”C語言
- C語言核心之陣列和指標詳解C語言陣列指標
- C語言C語言
- Linux核心筆記003 - Linux核心程式碼裡面的C語言和組合語言Linux筆記C語言組合語言
- 聊聊C語言/C++—程式和程式語言C語言C++
- srilm建立語言模型模型
- C語言link()函式:建立檔案連線C語言函式
- C語言判斷檔案存在和建立檔案C語言
- C語言字串C語言字串
- C語言: returnC語言
- C語言(一)C語言
- C語言概述C語言
- c語言 %pC語言
- 字串(C語言)字串C語言
- C語言程式C語言
- CUDA C語言C語言
- C語言 typedefC語言
- C語言的本質(32)——C語言與彙編之C語言內聯彙編C語言
- C語言函式手冊:c語言庫函式大全|C語言標準函式庫|c語言常用函式查詢C語言函式
- C語言與嵌入式C語言的區別C語言
- C語言學習方法,怎麼學習C語言?C語言
- go語言與c語言的相互呼叫GoC語言
- 終於!“30 歲”的 Linux 核心 C 語言將升級到 C11Linux
- C語言symlink()函式:建立檔案符號連線C語言函式符號
- 連結串列基本操作(建立,插入,查詢,刪除)-C語言C語言
- C 語言程式碼風格之 Linux 核心程式碼風格Linux
- 關於C語言結構體賦值(linux核心風格)C語言結構體賦值Linux
- 手機寫作業系統之 使用C語言編寫核心作業系統C語言
- C語言魔塔遊戲C語言遊戲
- C語言:extern用法C語言
- C語言 截圖C語言