Loading... ### 命名空间 Linux的命名空间机制提供了一种资源隔离的解决方案。PID,IPC,Network等系统资源不再是全局性的,而是属于特定的Namespace。Linux Namespace机制为实现基于容器的虚拟化技术提供了很好的基础,LXC(Linux containers)就是利用这一特性实现了资源的隔离。不同Container内的进程属于不同的Namespace,彼此透明,互不干扰。 Namespace是对全局系统资源的一种封装隔离,使得处于不同namespace的进程拥有独立的全局系统资源,改变一个namespace中的系统资源只会影响当前namespace里的进程,对其他namespace中的进程没有影响。 ### Linux内核支持的命名空间 | 名称 | 宏定义 | 隔离内容 | | ------- | --------------- | ------------------------------------------------------------ | | Cgroup | CLONE_NEWCGROUP | Cgroup root directory (since Linux 4.6) | | IPC | CLONE_NEWIPC | System V IPC, POSIX message queues (since Linux 2.6.19) | | Network | CLONE_NEWNET | Network devices, stacks, ports, etc. (since Linux 2.6.24) | | Mount | CLONE_NEWNS | Mount points (since Linux 2.4.19) | | PID | CLONE_NEWPID | Process IDs (since Linux 2.6.24) | | User | CLONE_NEWUSER | User and group IDs (started in Linux 2.6.23 and completed in Linux 3.8) | | UTS | CLONE_NEWUTS | Hostname and NIS domain name (since Linux 2.6.19) | ### Python切换指定进程的命名空间 ```python import os import ctypes class NameSpace(object): libc_so = "libc.so.6" NS_NET = "net" NS_IPC = "ipc" NS_MNT = "mnt" NS_PID = "pid" NS_USER = "user" NS_UTS = "uts" def __init__(self): if os.name == "nt": raise NotImplementedError("Windows does not support operation namespaces") self.libc = ctypes.cdll.LoadLibrary(self.libc_so) def change_namespace(self, pid, ns): """ 切换名称空间 :param pid: :param ns: :return: """ # 判断进程是否存在 ns_descriptor = "/proc/%s/ns/%s" % (pid, ns) if not os.path.exists(ns_descriptor): raise IOError("no such namespace file: %s" % ns_descriptor) c_char_p = ctypes.c_char_p(ns_descriptor.encode()) fd = self.libc.open(c_char_p, 0) # 00 O_RDONLY res = self.libc.setns(fd, 0) self.libc.close(fd) return res == 0 def change_net_ns(self, pid): return self.change_namespace(pid, self.NS_NET) def change_ipc_ns(self, pid): return self.change_namespace(pid, self.NS_IPC) def change_mnt_ns(self, pid): return self.change_namespace(pid, self.NS_MNT) def change_pid_ns(self, pid): return self.change_namespace(pid, self.NS_PID) def change_user_ns(self, pid): return self.change_namespace(pid, self.NS_USER) def change_uts_ns(self, pid): return self.change_namespace(pid, self.NS_UTS) if __name__ == "__main__": namespace = NameSpace() namespace.change_net_ns(2568) # 切换到2568进程的net命名空间 ``` > 使用`golang`切换到`mnt`命名空间时会切换失败, 需要使用`CGo`在Go程序启动前切换进指定的mnt名字空间. 原因: 因为golang天生是多线程的,在程序启动完毕后无法切换到指定的mnt命名空间 最后修改:2022 年 10 月 08 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 3 如果觉得我的文章对你有用,请随意赞赏
5 条评论
案例丰富且贴合主题,论证逻辑环环相扣。
《搜神传粤语》香港剧高清在线免费观看:https://www.jgz518.com/xingkong/70006.html
你的才华横溢,让人敬佩。 https://www.4006400989.com/qyvideo/81334.html
看的我热血沸腾啊www.jiwenlaw.com
看的我热血沸腾啊https://www.ea55.com/