Linux中的命名空间(新手必看)
Linux 最初对资源有一个全局的看法,为了允许进程对资源(如文件系统、网络,甚至用户)有一个本地的看法,Linux 引入了命名空间。
换句话说,Linux 命名空间都是关于资源的可见性,可以用来隔离操作系统资源的不同方面。这里的隔离主要是指进程看到的东西,不一定是硬边界(从安全角度看)。
为了创建命名空间,你有三个相关的系统调用供你使用:
前面的系统调用将一系列标志作为参数,使你能够对你想要创建、加入或离开的命名空间进行细粒度的控制:
查看你的系统中使用的命名空间的一种方法如下:
换句话说,Linux 命名空间都是关于资源的可见性,可以用来隔离操作系统资源的不同方面。这里的隔离主要是指进程看到的东西,不一定是硬边界(从安全角度看)。
为了创建命名空间,你有三个相关的系统调用供你使用:
- clone:用于创建一个可以与父进程共享部分执行环境的子进程;
- unshare:用于从一个现有的进程中移除共享的执行环境;
- setns:用于将一个现有的进程加入一个现有的命名空间。
前面的系统调用将一系列标志作为参数,使你能够对你想要创建、加入或离开的命名空间进行细粒度的控制:
- CLONE_NEWNS:用于文件系统挂载点,可通过 /proc/$PID/mounts 看到,从 Linux 2.4.19 开始支持;
- CLONE_NEWUTS:用于创建主机名和(NIS)域名的隔离,可通过 uname -n 和 hostname -f 看到,从 Linux 2.6.19 开始支持;
- CLONE_NEWIPC:用于进行进程间通信(IPC)资源隔离,如 System V IPC 对象或 POSIX 消息队列。可通过 /proc/sys/fs/mqueue、/proc/sys/kernel 和 /proc/sysvipc 看到,从 Linux 2.6.19 开始支持;
- CLONE_NEWPID:用于 PID 数字空间的隔离(命名空间内 PID/命名空间外 PID),可以通过 /proc/$PID/status 收集关于它的细节,从 Linux 2.6.24 开始支持;
- CLONE_NEWNET:用来控制网络系统资源的可见性,如网络设备、IP 地址、IP 路由表和端口号。可以通过 ip netns list、/proc/net 和 /sys/class/net 查看,从 Linux 2.6.29 开始支持;
- CLONE_NEWUSER:用于映射命名空间内部/外部的 UID+GID,可以通过 id 命令和 /proc/$PID/uid_map 以及 /proc/$PID/gid_map 查询 UID 和 GID 及其映射,从 Linux 3.8 开始支持;
- CLONE_NEWCGROUP:用于管理命名空间中的 cgroups,可以通过 /sys/fs/cgroup、/proc/cgroups 和 /proc/$PID/cgroup 看到它,从 Linux 4.6 开始支持。
查看你的系统中使用的命名空间的一种方法如下:
$ sudo lsns NS TYPE NPROCS PID USER COMMAND 4026531835 cgroup 251 1 root /sbin/init splash 4026531836 pid 245 1 root /sbin/init splash 4026531837 user 245 1 root /sbin/init splash 4026531838 uts 251 1 root /sbin/init splash 4026531839 ipc 251 1 root /sbin/init splash 4026531840 mnt 241 1 root /sbin/init splash 4026531860 mnt 1 33 root kdevtmpfs 4026531992 net 244 1 root /sbin/init splash 4026532233 mnt 1 432 root /lib/systemd/systemd-udevd 4026532250 user 1 5319 mh9 /opt/google/chrome/nacl_helper 4026532316 mnt 1 684 systemd-timesync /lib/systemd/systemd-timesyncd 4026532491 mnt 1 688 systemd-resolve /lib/systemd/systemd-resolved ...