Mount
使用 Linux 使用者命名空間,為什麼 clone() 可以掛載 /proc,而 unshare() 不能?
我正在嘗試讓非 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