IPC Namespace
基本信息
IPC(进程间通信)命名空间是Linux内核的一个功能,提供对System V IPC对象(如消息队列、共享内存段和信号量)的隔离。这种隔离确保不同IPC命名空间中的进程不能直接访问或修改彼此的IPC对象,为进程组之间提供了额外的安全性和隐私层。
工作原理:
创建新IPC命名空间时,它将以一个完全隔离的System V IPC对象集合开始。这意味着运行在新IPC命名空间中的进程默认情况下无法访问或干扰其他命名空间或主机系统中的IPC对象。
在命名空间内创建的IPC对象仅对该命名空间内的进程可见和可访问。每个IPC对象在其命名空间内由唯一键标识。尽管在不同命名空间中键可能相同,但对象本身是隔离的,无法跨命名空间访问。
进程可以使用
setns()
系统调用在命名空间之间移动,或者使用带有CLONE_NEWIPC
标志的unshare()
或clone()
系统调用创建新命名空间。当进程移动到新命名空间或创建新命名空间时,它将开始使用与该命名空间关联的IPC对象。
实验:
创建不同的命名空间
命令行界面
sudo unshare -i [--mount-proc] /bin/bash
通过挂载一个新的 /proc
文件系统实例,如果使用参数 --mount-proc
,可以确保新的挂载命名空间对该命名空间特定的进程信息具有准确和隔离的视图。
Docker
docker run -ti --name ubuntu1 -v /usr:/ubuntu1 ubuntu bash
检查您的进程位于哪个命名空间
ls -l /proc/self/ns/ipc
lrwxrwxrwx 1 root root 0 Apr 4 20:37 /proc/self/ns/ipc -> 'ipc:[4026531839]'
查找所有IPC命名空间
sudo find /proc -maxdepth 3 -type l -name ipc -exec readlink {} \; 2>/dev/null | sort -u
# Find the processes with an specific namespace
sudo find /proc -maxdepth 3 -type l -name ipc -exec ls -l {} \; 2>/dev/null | grep <ns-number>
进入 IPC 命名空间
nsenter -i TARGET_PID --pid /bin/bash
此外,只有作为root用户才能进入另一个进程命名空间。而且,没有指向它的描述符(如/proc/self/ns/net
),无法进入其他命名空间。
创建IPC对象
# Container
sudo unshare -i /bin/bash
ipcmk -M 100
Shared memory id: 0
ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x2fba9021 0 root 644 100 0
# From the host
ipcs -m # Nothing is seen
参考资料
最后更新于