12MHz_CPU 发表于 2016-06-20 15:30

linux的命名空间

大家好!
我有一个问题想请教一下各位。
linux的命名空间确切的说是什么意思?查了好多资料,都说是虚拟化的一种,为了更好的分配全局资源。我一直不理解这是什么意思,希望大家能解释一下。

captivated 发表于 2016-06-20 17:36

其实就是内核里面的数据结构。说白了就是内核里面的 cgroups.
也就是说,通过 cgroups, 内核将呈现不同的进程/进程组视图,当然,除了进程/进程组之外,还有其它的资源。
内核控制的一切都是资源。然后,通过 cgroups,内核将这些资源呈现为不同的视图。然后,《深入理解linux内核构架》一书中,将这种内核能够将所有的资源划分开,呈现不同视图的能力和机制,称为容器。一个视图就是一个容器。
也就是说,cgroups 企图将所有的资源进行划分和隔离。
那么内核既然提供了这种机制,就有系统调用来使用内核的这种机制/特性/能力。应用层通过系统调用,或者/proc /sys接口,来使用内核的这种机制。这也就使得,在应用层划分资源、隔离资源成为可能。所谓的 docker 就是干这件事情的。没看见现在的 docker 很火嘛。说白了docker是个使用内核 cgroups 能力的应用程序,它企图在应用层将系统的资源隔离,每个内核里面的视图映射为一个跑在 docker 上的虚拟机。由于没有 vmware 之类的虚拟层,当然性能就好;但是 cgroups 是有它的局限性的,很明显,cgroups 只是“企图”将所有的资源进行划分和隔离。

说真的我不喜欢 cgroups. 虚拟化什么的其实让 vmware 之类的去干就好了。企图在内核里面什么都搞定,个人觉得这是荒谬的。
麻烦的是,cgroups 明显让内核的数据结构复杂了。这不用说。这让内核的初学者,甚至有一些经验的老菜鸟(啊,其实我连菜鸟都不算。。。)在无关的数据结构上耗费精力。比如你明明只是想看进行 fork 怎么干的,它特么给你来插一段乱七八糟的 cgroups 代码。更麻烦的是,如果内核总是增加各种乱七八糟越来越复杂的机制和特性的话,会让内核成为一堆难以维护的 mess (当然现在已经是了,我这种菜鸟是搞不定的).

captivated 发表于 2016-06-20 17:58

哦,对了。docker还导致原来的init要换成systemd.
虽然虚拟化什么的大势所趋,不过 linux 作为一个 monothetic kernel, 真的不要干太多了,特性特么不要太丰富了好嘛!这特么让我这种怕麻烦的人怎么看kernel代码!
以后就让你几个黑客老爷子玩儿kernel去!玩儿蛋去!艹特么的。

qianguozheng 发表于 2016-06-21 11:31

樓上觀點明確,鄙人不敢溝通。其實就是Docker火起來後才對這個進行優化的。

captivated 发表于 2016-06-21 13:40

回复 4# qianguozheng


    大哥,我就吐槽下。难道你不觉得 kernel 越来越复杂是坏事嘛。不先学个十年八年kernel,谁能维护那玩意。

qianguozheng 发表于 2016-06-21 16:35

回复 5# captivated


    我覺得吧算法本來就複雜。其實,linux複雜了對你來說是個機會,你寫一個比Linux簡單的內核,你就出名啦,後半輩子就不用怎麼工作了。

nswcfd 发表于 2016-06-22 19:07

“命名空间”简单的可以理解为全局数据结构的局部化。
比如network namespace,之前的arp_tbl是个全局变量,现在变成了per namespace的变量了。

不过这跟cgroup不完全一样。

kiongf 发表于 2016-06-24 11:05

回复 2# captivated


    不懂就不要胡说八道。链cgroup和ns都没分清楚,就老老实实去读代码去

kiongf 发表于 2016-06-24 11:07

回复 1# 12MHz_CPU

https://lwn.net/Articles/531114/      看下这一系列的lwn文档,跟着实践一下。你就有一个深刻的理解。


   

captivated 发表于 2016-06-28 11:28

回复 8# kiongf


    不好意思记错了。不过也就是 struct nsproxy 而已么,还不是差不多。
    反正容器的实现在内核中就是 cgroup + ns 这两数据结构搞出来的,总没错吧。
    我干嘛要那么老实地读内核代码,我能找到我想看的代码在哪,知道大概的意思是那么个意思不就行了嘛。
页: [1] 2
查看完整版本: linux的命名空间