假设我有一个带有隔离的挂载命名空间pid 1200的进程,称为unshare()的进程将它的命名空间与父进程隔离开来。然后,我想在pid 1200的S命名空间内挂载一个只能在pid 1200命名空间内访问的设备。这有可能吗?
我希望在没有重新启动容器的情况下,在具有lxc.monitor.unshare = 1的正在运行的LXC容器中挂载设备或绑定到主机上的目录。
发布于 2016-01-03 15:52:34
并不理想,但您可以始终执行NFS挂载或其他网络文件系统。
下面的部分不起作用(至少在4.2内核中不起作用),将其作为参考,这样我们就不会自己尝试。
虽然当您输入一个挂载名称空间(nsenter -m或setns(CLONE_NEWNS))时,您的工作目录会自动更改为该名称空间的根(/),但仍然可以在某个文件描述符上打开一个目录,输入名称空间,并在该fd上打开该目录(例如,在它上做一个fchdir() )。
所以你会认为这种方法可能会奏效:
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mount.h>
#include <sched.h>
void die(char *msg) {perror(msg); exit(1);}
int main(int argc, char *argv[]) {
int fd;
if (argc != 3) {
fprintf(stderr, "Usage: %s <source-in-current-namespace> <dest-in-namespace-on-stdin>\n");
exit(1);
}
fd = open(argv[1], O_RDONLY|O_DIRECTORY);
if (fd < 0) die("open");
if (setns(0, CLONE_NEWNS) < 0) die("setns");
if (fchdir(fd) < 0) die("fchdir");
printf("cwd: %s\n", get_current_dir_name());
if (mount(".", argv[2], 0, MS_BIND, 0) < 0) die("mount");
}它在fchdir()之前确实有效,但是mount在EINVAL中失败了:
# ~/a.out /home /mnt < /proc/1200/ns/mnt
cwd: (unreachable)/home
mount: Invalid argumenthttps://unix.stackexchange.com/questions/252968
复制相似问题