2016-07-11 1 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); 
} 

При запуске его, я получаю Баш оболочку, работает в другом пространстве имен МНТ. Чтобы проверить это, я выполняю в другой оболочке sudo ls -l /proc/<child_pid>/ns, и я действительно вижу, что дочерний процесс имеет другое пространство имен от остальных процессов в системе.

Однако, если я выполняю mount с обеих оболочек - я получаю тот же вывод FSTAB, и строка myfs on /myfs type sysfs (rw,relatime) появляется в обоих из них.

Какое объяснение?

ответ

0

Вам нужно отметить существующие монтирует как «частный» перед созданием нового пространства имен:

mount --make-rprivate/
+0

Works! Благодаря! Как я могу это сделать из c-кода? – Noamiko

+0

Мне нужно признать, что я не знаю, как это сделать. Я также хотел бы утверждать, что это действие должно выполняться администратором, а не косвенно процессом, поскольку оно затрагивает всю систему. Но, конечно, 'mount' написан на' C', так что есть способ. Я бы предложил прочитать код команды mount. – hek2mgl

Смежные вопросы