unshare --fork --pid --mount
umount /proc
mount -t proc proc /proc
umount /dev/pts
mount -t devpts devpts /dev/pts
然而,相应的C程序并没有按预期工作(似乎它没有卸载之前的/proc,并且在尝试卸载devpts时提供了EBUSY错误):
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")
,它会打印挂载的文件系统)。
mount
devpts上的EBUSY是由umount
/mount
proc的“静默失败”引起的。 - ocirocirumount
对我来说失败了,所以我用umount2("<mountpoint>", MNT_DETACH)
替换它们。然而,这并没有完全解决问题:它在全局范围内卸载(和重新挂载)了/proc和/dev/pts!这到底是怎么回事? - user3035772umount("/proc")
返回成功代码的部分?我不太倾向于相信它真正展示了您描述的umount()
和mount()
的行为。当然,我已经试图复制您的代码并没有发现这样的行为。我怀疑程序存在缺陷,但由于您没有展示全部代码,我无法确定。 - John Bollinger