IPC namespace用來隔離System V IPC objects和POSIX message queues。其中System V IPC objects包含Message queues、Semaphore sets和Shared memory segments. html
對於其餘幾種IPC,下面是個人理解,有可能不對,僅供參考,歡迎指正:linux
signal不必隔離,由於它和pid密切相關,當pid隔離後,signal天然就隔離了,能不能跨pid namespace發送signal則由pid namespace決定git
pipe好像也不必隔離,對匿名pipe來講,只能在父子進程之間通信,因此隔離的意義不大,而命名管道和文件系統有關,因此只要作好文件系統的隔離,命名管道也就隔離了github
socket和協議棧有關,而不一樣的network namespace有不一樣的協議棧,因此socket就被network namespace隔離了shell
下面的全部例子都在ubuntu-server-x86_64 16.04下執行經過ubuntu
從這篇文章開始,再也不像介紹UTS namespace那樣本身寫代碼,而是用ubuntu 16.04中現成的兩個工具,他們的實現和上一篇文章中介紹UTS namespace時的代碼相似,只是多了一些參數處理bash
這裏將以消息隊列爲例,演示一下隔離效果,在本例中將用到兩個ipc相關的命令工具
ipcmk - 建立shared memory segments, message queues, 和semaphore arrays
ipcs - 查看shared memory segments, message queues, 和semaphore arrays的相關信息
爲了使演示更直觀,咱們在建立新的ipc namespace的時候,同時也建立新的uts namespace,而後爲新的utsnamespace設置新hostname,這樣就能經過shell提示符一眼看出這是屬於新的namespace的bash,後面的文章中也採起這種方式啓動新的bash。
在這個示例中,咱們將用到兩個shell窗口
#--------------------------第一個shell窗口---------------------- #記下默認的uts和ipc namespace number dev@ubuntu:~$ readlink /proc/$$/ns/uts /proc/$$/ns/ipc uts:[4026531838] ipc:[4026531839] #確認hostname dev@ubuntu:~$ hostname ubuntu #查看現有的ipc Message Queues,默認狀況下沒有message queue dev@ubuntu:~$ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages #建立一個message queue dev@ubuntu:~$ ipcmk -Q Message queue id: 0 dev@ubuntu:~$ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x12aa0de5 0 dev 644 0 0 #--------------------------第二個shell窗口---------------------- #從新打開一個shell窗口,確認和上面的shell是在同一個namespace, #能看到上面建立的message queue dev@ubuntu:~$ readlink /proc/$$/ns/uts /proc/$$/ns/ipc uts:[4026531838] ipc:[4026531839] dev@ubuntu:~$ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x12aa0de5 0 dev 644 0 0 #運行unshare建立新的ipc和uts namespace,而且在新的namespace中啓動bash #這裏-i表示啓動新的ipc namespace,-u表示啓動新的utsnamespace dev@ubuntu:~$ sudo unshare -iu /bin/bash root@ubuntu:~# #確認新的bash已經屬於新的ipc和uts namespace了 root@ubuntu:~# readlink /proc/$$/ns/uts /proc/$$/ns/ipc uts:[4026532455] ipc:[4026532456] #設置新的hostname以便和第一個shell裏面的bash作區分 root@ubuntu:~# hostname container001 root@ubuntu:~# hostname container001 #當hostname改變後,bash不會自動修改它的命令行提示符 #因此運行exec bash從新加載bash root@ubuntu:~# exec bash root@container001:~# root@container001:~# hostname container001 #如今各個bash進程間的關係以下 #bash(24429)是shell窗口打開時的bash #bash(27668)是運行sudo unshare建立的bash,和bash(24429)不在同一個namespace root@container001:~# pstree -pl ├──sshd(24351)───sshd(24428)───bash(24429)───sudo(27667)───bash(27668)───pstree(27695) #查看message queues,看不到原來namespace裏面的消息,說明已經被隔離了 root@container001:~# ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages #建立一條新的message queue root@container001:~# ipcmk -Q Message queue id: 0 root@container001:~# ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x54b08fc2 0 root 644 0 0 #--------------------------第一個shell窗口---------------------- #回到第一個shell窗口,看看有沒有受到新namespace的影響 dev@ubuntu:~$ ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x12aa0de5 0 dev 644 0 0 #徹底無影響,仍是原來的信息 #試着加入第二個shell窗口裏面bash的uts和ipc namespace #-t後面跟pid用來指定加入哪一個進程所在的namespace #這裏27668是第二個shell中正在運行的bash的pid #加入成功後將運行/bin/bash dev@ubuntu:~$ sudo nsenter -t 27668 -u -i /bin/bash #加入成功,bash的提示符也自動變過來了 root@container001:~# readlink /proc/$$/ns/uts /proc/$$/ns/ipc uts:[4026532455] ipc:[4026532456] #顯示的是新namespace裏的message queues root@container001:~# ipcs -q ------ Message Queues -------- key msqid owner perms used-bytes messages 0x54b08fc2 0 root 644 0 0
上面介紹了IPC namespace和兩個經常使用的跟namespace相關的工具,從演示過程能夠看出,IPC namespace差很少和UTS namespace同樣簡單,沒有太複雜的邏輯,也沒有父子namespace關係。不事後續將要介紹的其餘namespace就要比這個複雜多了。