unshare() 後にプロセスの名前空間にデバイスをマウントできますか?

unshare() 後にプロセスの名前空間にデバイスをマウントできますか?

pid 1200以下の孤立したMOUNT名前空間を持つプロセスがあるとします。unshare()その名前空間を親プロセスから分離します。その後、pid 1200名前空間内でのみアクセスできるデバイスをマウントしたいと思いますpid 1200。可能ですか?

lxc.monitor.unshare = 1コンテナを再起動せずに実行中のLXCコンテナ内のホストシステムにデバイスをマウントするか、ディレクトリをバインドマウントしたいと思います。

ベストアンサー1

理想的ではありませんが、常にNFSまたは他のネットワークファイルシステムをマウントできます。


次の部分が完了しました。いいえ動作します(少なくとも4.2カーネルではありません)。ユーザーが自分で試す必要がないように、参照用に保管してください。

nsenter -mマウントネームスペース(または)を入力すると、setns(CLONE_NEWNS)作業ディレクトリは自動的にそのネームスペース()のルートに変わりますが、/一部のファイルディスクリプタでディレクトリを開き、ネームスペースを入力して、そのネームスペースに残ることがあります。ディレクトリを開く空間的にfdします(たとえば、fchdir()aを実行します)。

したがって、このアプローチはうまくいくと思います。

#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 argument

おすすめ記事