What’s the Linux Namespace?
Linux Namespace
是 Linux 提供的一种内核级别环境隔离的方法。Namespace
为不同的资源提供了隔离和限制的能力,如 UTS
、 IPC
、 mount
、 PID
、 network
、 User
等隔离机制,使得多个进程可以在同一系统上并行运行,彼此隔离互不干扰。
Linux Namespace Types
Linux Namespace supports many types of namespaces, official documentation is here《Namespace in Operation》:
- PID Namespace: Provides process ID isolation, allowing each namespace to have its own set of process IDs. Processes in different PID namespaces can have the same PID, but they refer to different processes in the global namespace.
- Network Namespace: Provides network isolation, enabling each namespace to have its own network interfaces, IP addresses, routing tables, and network-related resources. Processes in different network namespaces can have separate network stacks.
- Mount Namespace: Provides file system isolation, allowing each namespace to have its own set of mount points and file system views. Mount namespaces enable processes to have a private file system hierarchy.
- UTS Namespace: Provides isolation for the hostname and domain name. Each UTS namespace can have its own unique hostname and domain name.
- IPC Namespace: Provides isolation for interprocess communication (IPC) mechanisms such as System V IPC and POSIX message queues. Processes in different IPC namespaces can have separate IPC resources.
- User Namespace: Provides isolation for user and group identifiers (UID and GID). User namespaces allow mapping of different user and group IDs inside the namespace to different IDs in the global namespace.
Linux 提供了一些系统调用函数来操作命名空间,用于创建、管理和操作命名空间。以下是一些常用的操作命名空间的系统调用函数:
clone()
:clone()
用于创建新进程,并可以指定要共享的命名空间。通过设置特定的标志参数,可以选择与父进程共享特定类型的命名空间。unshare()
:unshare()
用于解除与指定类型的命名空间的关联。调用unshare()
函数后,进程将成为该类型命名空间的唯一拥有者,与父进程分离出来成为一个独立的命名空间。unshare(CLONE_NEWPID)
:使用unshare()
函数与CLONE_NEWPID
标志可以创建新的 PID 命名空间,使得进程在该命名空间中具有独立的进程 ID 空间。unshare(CLONE_NEWNET)
:使用unshare()
函数与CLONE_NEWNET
标志可以创建新的网络命名空间,使得进程在该命名空间中具有独立的网络设备、IP 地址等网络资源。unshare(CLONE_NEWUTS)
:使用unshare()
函数与CLONE_NEWUTS
标志可以创建新的 UTS 命名空间,使得进程在该命名空间中具有独立的主机名和域名。unshare(CLONE_NEWIPC)
:使用unshare()
函数与CLONE_NEWIPC
标志可以创建新的 IPC 命名空间,使得进程在该命名空间中具有独立的进程间通信资源,如消息队列、信号量和共享内存等。unshare(CLONE_NEWNS)
:使用unshare()
函数与CLONE_NEWNS
标志可以创建新的挂载命名空间,使得进程在该命名空间中具有独立的文件系统视图。
setns()
:setns()
用于将当前进程加入到已经存在的命名空间中。通过调用setns()
函数,进程可以共享其他进程已经创建的命名空间。
clone()系统调用
首先,我们来看一下一个最简单的clone()系统调用的示例: