Linux Namespace之:PID Namespace

星河追踪者 2小时前 ⋅ 1 阅读

Linux Namespace

概述

Linux的Namespace是一种隔离机制,通过将全局共享的系统资源变为进程私有的资源,实现了对进程之间的隔离。其中之一的PID Namespace(进程ID隔离)是Linux Namespace的一种,它使得每个PID Namespace内的进程ID都互相隔离,从而实现了一个进程在一个PID Namespace中,可以将整个进程视为一个独立的系统。

PID Namespace的作用

PID是每个进程的唯一标识符,它在整个系统中是唯一的。PID Namespace的引入使得不同的PID Namespace下的进程可以使用相同的PID,同时不会相互干扰。PID Namespace为进程提供了一个隔离的环境,在该环境中,每个PID Namespace内的进程感知不到其他PID Namespace中的进程存在。

PID Namespace的另一个作用是使得进程在不同的PID Namespace下可以有不同的视图。每个PID Namespace都以一个init进程(PID为1)为根,即PID Namespace中的所有进程的父进程都是init进程。这样,一组进程可以独立于其他进程运行,形成自己的进程树,从而实现对进程的隔离,方便管理和监控。

创建PID Namespace

创建PID Namespace可以使用clone系统调用,通过传递CLONE_NEWPID标志给clone函数即可创建一个新的PID Namespace。举个例子,下面的代码演示了如何创建一个新的PID Namespace:

#define _GNU_SOURCE
#include <sched.h>
#include <unistd.h>
#include <stdio.h>

int child_func(void *args) {
    printf("Child process - PID: %d\n", getpid());
    sleep(5);
    return 0;
}

int main() {
    char stack[1024 * 1024];
    int clone_flags = CLONE_NEWPID | SIGCHLD;
    pid_t child_pid;

    child_pid = clone(child_func, stack + sizeof(stack), clone_flags, NULL);
    if (child_pid < 0) {
        perror("clone");
        return 1;
    }

    printf("Parent process - PID: %d, Child PID: %d\n", getpid(), child_pid);

    sleep(10);

    return 0;
}

在上面的代码中,主进程使用clone函数创建了一个新的PID Namespace,并通过child_func函数在新的PID Namespace中创建了一个子进程。

查看PID Namespace

可以使用命令ps -e -o pid,ns来查看系统中存在的PID Namespace及其对应的进程。

$ ps -e -o pid,ns
   PID NS
    1 4026531840
    2 4026531840
    3 4026531840
    ...

上面的命令输出了系统中的进程及其所属的PID Namespace。每个PID Namespace都有唯一的标识符,通过查看PID Namespace标识符,可以知道每个进程属于哪个PID Namespace。

总结

PID Namespace是Linux Namespace的一种,它通过隔离进程ID,使得每个PID Namespace内的进程互相隔离,为每个PID Namespace提供了一个独立的环境和视图。PID Namespace的应用让进程具备了更强大的隔离性和自我管理能力,为容器技术等提供了坚实的基础。

参考文献:

  • Linux Manual Pages - clone(2) [https://man7.org/linux/man-pages/man2/clone.2.html]
  • Namespaces in operation, part 2: process namespaces [https://lwn.net/Articles/531419/]

全部评论: 0

    我有话说: