2016-07-11 8 views
1

私は、その親とは異なるmnt名前空間を持つプロセスを作成しようとしています。そのために異なるマウント名前空間を持つLinuxでのプロセスの作成

、私は次のコードを使用します。それを実行している場合

static int childFunc(void *arg){ 
    if (mount("/","/myfs", "sysfs", 0, NULL) == -1) 
     errExit("mount"); 
    printf("Starting new bash. Child PID is %d\n",getpid()); 
    execle("/bin/bash",NULL); 
    printf("Shouldn't arrive here.\n"); 
    return 0;   /* Child terminates now */ 
} 

#define STACK_SIZE (1024 * 1024) /* Stack size for cloned child */ 

int main(int argc, char *argv[]){ 
    char *stack;     /* Start of stack buffer */ 
    char *stackTop;     /* End of stack buffer */ 
    pid_t pid; 

    /* Allocate stack for child */ 
    stack = malloc(STACK_SIZE); 
    if (stack == NULL) 
     errExit("malloc"); 
    stackTop = stack + STACK_SIZE; /* Assume stack grows downward */ 

    /* Create child that has its own MNT namespaces*/ 
    pid = clone(childFunc, stackTop, CLONE_NEWNS | SIGCHLD, argv[1]); 
    if (pid == -1) 
     errExit("clone"); 
    printf("clone() returned %ld\n", (long) pid); 
    sleep(1); 

    if (waitpid(pid, NULL, 0) == -1) /* Wait for child */ 
     errExit("waitpid"); 
    printf("child has terminated\n"); 
    exit(EXIT_SUCCESS); 
} 

、私は別のMNT名前空間で実行して、bashシェルを入手できます。 これを確認するために、別のシェルsudo ls -l /proc/<child_pid>/nsで実行します。実際には、子プロセスがシステム内の残りのプロセスと異なる名前空間を持つことがわかりました。

しかし、両方のシェルからmountを実行すると、同じFSTAB出力が得られ、どちらもその行にmyfs on /myfs type sysfs (rw,relatime)が表示されます。

これについての説明は何ですか?

答えて

0

あなたは新しい名前空間を作成する前に、「プライベート」として既存のマウントをマークする必要があります。

mount --make-rprivate/
+0

作品!ありがとう!私はどのようにCコードからそれを行うことができますか? – Noamiko

+0

私は方法がわからないことを認める必要があります。また、システム全体に影響を及ぼすため、このアクションはプロセスによって暗黙的にではなく管理者が行うべきだと主張します。しかし確かに、 'mount'は' C'で書かれているので道があります。私は 'mount'コマンドのコードを読むことをお勧めします。 – hek2mgl

関連する問題