【发布时间】:2016-04-24 16:05:18
【问题描述】:
此命令序列有效:
unshare --fork --pid --mount
umount /proc
mount -t proc proc /proc
umount /dev/pts
mount -t devpts devpts /dev/pts
但是,相应的 C 程序并没有按预期工作(似乎它没有卸载以前的 /proc,并且它还提供 EBUSY 尝试卸载 devpts):
unshare(CLONE_NEWPID | CLONE_NEWNS );
int pid = fork();
if (pid != 0) {
int status;
waitpid(-1, &status, 0);
return status;
}
printf("My pid: %i\n", getpid()); // It prints 1 as expected
umount("/proc"); // Returns 0
system("mount"); // Should print error on mtab, but it prints the previous mounted filesystems
mount("proc", "/proc", "proc",
MS_MGC_VAL | MS_NOSUID | MS_NOEXEC | MS_NODEV,
NULL)); // Returns 0
umount("/dev/pts"); // Returns -1 errno = 0 (??)
mount("devpts", "/dev/pts", "devpts",
MS_MGC_VAL | MS_NOSUID | MS_NOEXEC | MS_NODEV,
NULL) ); // Returns -1 errno = EBUSY
为了便于阅读,我在这里省略了错误检查
我认为 unshare 或 unmount 不能按预期工作:即使它返回零,似乎也不会卸载 /proc(如果我尝试在此之后执行 system("mount"),它会打印已安装的文件系统)。
【问题讨论】:
-
使用 perror 代替 printf - 它提供有关 ERRNO 的信息
-
好吧,反正我认为
mountdevpts上的EBUSY是由umount/mountproc的“静默失败”引起的 -
你的
umounts 对我来说失败了,所以我用umount2("<mountpoint>", MNT_DETACH)替换了它们。但是,这并不能完全解决问题:它在全局范围内卸载(并重新安装)/proc 和 /dev/pts!什么鬼? -
为什么你认为 mount 应该在 mtab 上打印错误?
-
因为你已经卸载了/proc,而
/etc/mtab/是/proc/self/mounts的链接
标签: c linux linux-namespaces