uts,unix time-sharing system namespace提供了主機(jī)名和域名的隔離。能夠使得子進(jìn)程有獨(dú)立的主機(jī)名和域名(hostname),這一特性在docker容器技術(shù)中被用到,使得docker容器在網(wǎng)絡(luò)上被視作一個(gè)獨(dú)立的節(jié)點(diǎn),而不僅僅是宿主機(jī)上的一個(gè)進(jìn)程。
docker中利用uts namespace原理,每個(gè)鏡像可以以本身所提供的服務(wù)名稱來命名鏡像的hostname,且不會對宿主機(jī)產(chǎn)生任何影響,由此達(dá)到主機(jī)名和域名的隔離效果。
使用一段簡單的代碼,試一試uts隔離的效果:
#define _gnu_source #include <sys/types.h> #include <sys/wait.h> #include <stdio.h> #include <sched.h> #include <signal.h> #include <unistd.h> #define stack_size (1024*1024) static char child_stack[stack_size]; char* const child_args[] = { "/bin/bash", null }; int child_main(void* args){ printf("now in child process!n"); sethostname("childhostname",12); execv(child_args[0],child_args); return 1; } int main(){ printf("program start: n"); int child_pid = clone(child_main,child_stack stack_size,clone_newuts | sigchld,null); waitpid(child_pid,null,0); printf("already exit!n"); return 0; }
看一下輸出結(jié)果:
[root@localhost workspace]# ./uts_uts.o program start: now in child process! [root@childhostnam workspace]# hostname childhostnam [root@childhostnam workspace]# exit exit already exit! [root@localhost workspace]# hostname localhost.localdomain
上面代碼中,重要的地方是在調(diào)用clone()方法時(shí),加入了 clone_newuts 參數(shù),linux內(nèi)核提供的uts namespace隔離系統(tǒng)調(diào)用。如果不加,執(zhí)行這段代碼,將會更改當(dāng)前的主機(jī)名稱。不會產(chǎn)生主機(jī)名和域名的隔離效果。