Эта последовательность команд работает:
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")после этого, он печатает смонтированные файловые системы).