linux ns,Linux Namespace (ns)
LXC所實現的隔離性主要是來自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace將container的進程, 網絡, 消息, 文件系統和hostname 隔離開。
一、 pid namespace
之前提到用戶的進程是lxc-start進程的子進程, 不同用戶的進程就是通過pidnamespace隔離開的,且不同 namespace 中可以有相同PID。具有以下特征:
1、每個namespace中的pid是有自己的pid=1的進程(類似/sbin/init進程)
2、每個namespace中的進程只能影響自己的同一個namespace或子namespace中的進程
3、因為/proc包含正在運行的進程,因此在container中的pseudo-filesystem的/proc目錄只能看到自己namespace中的進程
4、因為namespace允許嵌套,父namespace可以影響子namespace的進程,所以子namespace的進程可以在父namespace中看到,但是具有不同的pid
正是因為以上的特征,所有的LXC進程在docker中的父進程為docker進程,每個lxc進程具有不同的namespace。同時由于允許嵌套,因此可以很方便的實現 LXC in LXC
二、 net namespace
有了 pid namespace, 每個namespace中的pid能夠相互隔離,但是網絡端口還是共享host的端口。網絡隔離是通過netnamespace實現的,
每個net namespace有獨立的 network devices, IP addresses, IP routing tables, /proc/net 目錄。這樣每個container的網絡就能隔離開來。
LXC在此基礎上有5種網絡類型,docker默認采用veth的方式將container中的虛擬網卡同host上的一個docker bridge連接在一起。
三、 ipc namespace
container中進程交互還是采用linux常見的進程間交互方法(interprocess communication - IPC), 包括常見的信號量、消息隊列和共享內存。然而同VM不同,container 的進程間交互實際上還是host上具有相同pid namespace中的進程間交互,因此需要在IPC資源申請時加入namespace信息 - 每個IPC資源有一個唯一的 32bit ID。
四、 mnt namespace
類似chroot,將一個進程放到一個特定的目錄執行。mnt namespace允許不同namespace的進程看到的文件結構不同,這樣每個 namespace 中的進程所看到的文件目錄就被隔離開了。同chroot不同,每個namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。
五、 uts namespace
UTS(“UNIX Time-sharing System”) namespace允許每個container擁有獨立的hostname和domain name, 使其在網絡上可以被視作一個獨立的節點而非Host上的一個進程。
六 、 user namespace
每個container可以有不同的 user 和 group id, 也就是說可以以container內部的用戶在container內部執行程序而非Host上的用戶。
有了以上6種namespace從進程、網絡、IPC、文件系統、UTS和用戶角度的隔離,一個container就可以對外展現出一個獨立計算機的能力,并且不同container從OS層面實現了隔離。 然而不同namespace之間資源還是相互競爭的,仍然需要類似ulimit來管理每個container所能使用的資源 - LXC 采用的是cgroup。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的linux ns,Linux Namespace (ns)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android中点击按钮弹出一个编辑框,
- 下一篇: 国内用户ios android比例,国内