天天看點

cgroup----ns子系統

ns子系統

     ns子系統是一個比較特殊的子系統。特殊在哪兒呢,首先ns子系統沒有自己的控制檔案,其次ns子系統沒有屬于自己的狀态資訊,這點從ns子系統的ns_cgroup的定義可以看出:

struct ns_cgroup {

struct cgroup_subsys_state css;

};

它隻有一個cgroup_subsys_state成員。

     最後ns子系統的實作也比較簡單,隻是提供了一個ns_cgroup_clone函數,在copy_process和unshare_nsproxy_namespaces被調用。而ns_cgroup_clone函數本身的實作也很簡單,隻是在目前的cgroup下建立了一個子cgroup,該子cgroup完全clone了目前cgroup的資訊,然後将目前的程序移到建立立的cgroup中。

      這樣看來,好像ns子系統沒什麼意義,其實不然。要想了解ns子系統的意義,就要分析一下ns_cgroup_clone被調用的時機了。我們來看copy_process中的代碼:

if (current->nsproxy != p->nsproxy) {

retval = ns_cgroup_clone(p, pid);

if (retval)

goto bad_fork_free_pid;

}

copy_process是在do_fork中被調用的,作用在于為子程序複制父程序的相關資訊。這段意思就是目前程序(即父程序)和子程序的命名空間不同時,調用ns_cgroup_clone。這樣以來,ns子系統的作用就清楚了,ns子系統實際上是提供了一種同命名空間的程序聚類的機制。具有相同命名空間的程序會在相同cgroup中。

那什麼時候,父程序fork出的子程序會擁有不同的命名空間呢,這就設計到了Linux的命名空間的機制了,在這裡就不詳細講了。簡單說來就是,在調用fork時,加入了特殊flag(比如NEWPID,NEWNS)時,核心會為子程序建立不同的指令空間。

 除了這種情況外,ns_cgroup_clone在unshare_nsproxy_namespaces用到了。unshare_nsproxy_namespaces函數被sys_unshare調用,實際上是對unshare系統調用的實作。當指定相應标記時,unshare系統調用會為調用的程序建立不同的命名空間,是以調用ns_cgroup_clone為其建立新的cgroup。

作者曰:要深入了解ns子系統,linux namespace機制是繞不過的,等寫完cgroup子系統後,我會專門寫一篇文章分析linux namespace機制。

繼續閱讀