Mount

使用 Linux 使用者命名空間,為什麼 clone() 可以掛載 /proc,而 unshare() 不能?

  • November 10, 2018

我正在嘗試讓非 root 使用者掛載/proc在 Linux 使用者命名空間中。

如果我通過創建命名空間clone(),那麼我可以掛載/proc.

但是,如果我通過創建命名空間unshare(),則呼叫mount()失敗並顯示Operation not permitted.

為什麼mount()創建命名空間時的行為與創建命名空間clone()不同unshare()

下面的程式碼展示了差異。

#define   _GNU_SOURCE
#include  <errno.h>
#include  <sched.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <string.h>
#include  <unistd.h>
#include  <sys/syscall.h>
#include  <sys/mount.h>
#include  <sys/types.h>
#include  <sys/stat.h>
#include  <sys/wait.h>
#include  <fcntl.h>


#define STACK_SIZE (1024 * 1024)

static char child_stack[STACK_SIZE];    /* Space for child's stack */


void  try  ( const char * msg, int rv )  {
 printf ( "%-8s  %6d  %s\n", msg, rv, strerror ( rv < 0 ? errno : 0 ) );
}


int  child  ( void * arg )  {
 try(  "mount_1",   mount   (  "PROC", "/proc", "proc", 0, NULL  ));
 try(  "umount_1",  umount  (  "/proc"                           ));
 return  0;
}


int  main  ()  {

 int  clone_flags  =  0;

 clone_flags  |=  CLONE_NEWNET;
 clone_flags  |=  CLONE_NEWNS;
 clone_flags  |=  CLONE_NEWPID;
 clone_flags  |=  CLONE_NEWUSER;

 try(  "clone",    clone    (  child, child_stack + STACK_SIZE,
                               clone_flags | SIGCHLD, NULL       ));
 try(  "wait",     wait     (  NULL                              ));
 try(  "unshare",  unshare  (  clone_flags                       ));
 try(  "mount_2",  mount    (  "PROC", "/proc", "proc", 0, NULL  ));

 return  0;

}

輸出:

clone      31478  Success
mount_1        0  Success
umount_1       0  Success
wait       31478  Success
unshare        0  Success
mount_2       -1  Operation not permitted

我在帶有核心的 Ubuntu 18.04 上執行Linux 4.15.0-20-generic。我以非 root 身份執行上述程式碼。

我認為您仍然處於“錯誤”的 PID 命名空間中,這意味著您無權掛載 procfs 實例。

CLONE_NEWPID

$$ … $$呼叫程序不會移動到新的命名空間中。呼叫程序創建的第一個子程序的程序 ID 為 1,並將承擔新命名空間中的 init(1) 角色。 http://man7.org/linux/man-pages/man2/unshare.2.html

比較

CLONE_NEWPID

$$ … $$ 如果設置了 CLONE_NEWPID,則在新的 PID 命名空間中創建程序。 http://man7.org/linux/man-pages/man2/clone.2.html

引用自:https://unix.stackexchange.com/questions/480873