Não é ideal, mas você sempre pode fazer uma montagem NFS ou outro sistema de arquivos de rede.
A parte abaixo faz not funcionar (pelo menos não com um kernel 4.2), colocando-o como referência para que um não tente por si mesmo.
Embora quando você insere um namespace de montagem ( nsenter -m
ou setns(CLONE_NEWNS)
), seu diretório de trabalho é alterado automaticamente para a raiz ( /
) desse namespace, ainda é possível abrir um diretório em algum descritor de arquivo , insira o namespace e ainda tenha esse diretório aberto nesse fd (e, por exemplo, faça um fchdir()
nele).
Então você acha que essa abordagem pode funcionar:
#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");
}
Ele funciona até o fchdir()
, mas o mount
falha com EINVAL
:
# ~/a.out /home /mnt < /proc/1200/ns/mnt
cwd: (unreachable)/home
mount: Invalid argument