Linux Namespace系列(03):IPC namespace (CLONE_NEWIPC)

IPC namespace用來隔離System V IPC objectsPOSIX 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

namespace相關tool

從這篇文章開始,再也不像介紹UTS namespace那樣本身寫代碼,而是用ubuntu 16.04中現成的兩個工具,他們的實現和上一篇文章中介紹UTS namespace時的代碼相似,只是多了一些參數處理bash

  • nsenter:加入指定進程的指定類型的namespace,而後執行參數中指定的命令。詳情請參考幫助文檔代碼ssh

  • unshare:離開當前指定類型的namespace,建立且加入新的namespace,而後執行參數中指定的命令。詳情請參考幫助文檔代碼socket

示例

這裏將以消息隊列爲例,演示一下隔離效果,在本例中將用到兩個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就要比這個複雜多了。

相關文章
相關標籤/搜索