この一連のコマンドは機能します。
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")
その後で a を実行しようとすると、マウントされたファイルシステムが出力されます)。