我正在尝试将我的进程的根更改为我安装在 /tmp/mount_dir 的新文件系统,并且我在其中创建了另一个目录 /tmp/mount_dir/inner_mount_dir,并且根据手册页 pivot_root(2) 没有这个系统调用的 glibc 包装器,所以我自己做了
int pivot_root(const char *new_root, const char *put_old){
return(syscall(SYS_pivot_root, new_root, put_old));
}
创建手册页指定的两个嵌套目录后,我在此代码中调用它
fprintf(stderr,"-->Changing the process's root...");
if(pivot_root(mount_dir, inner_mount_dir)){
fprintf(stderr,"Failed..%m\n");
return -1;
}else{
fprintf(stderr,"Success\n");
}
系统调用返回成功,但问题是系统进入崩溃状态,首先来自 gnome dash 的所有图标都消失了,我根本无法与系统交互(系统冻结我只能首先更改窗口然后全部终止),屏幕变成一个空白的黑屏,左上角有一个“-”,好像系统正在关闭,但在该状态下冻结,直到我强制关闭。
pivot_root() 作用于命名空间。
要仅影响您的进程(及其子进程),请首先输入新的挂载命名空间。并且您需要确保 pivot_root 操作不会传播回原始名称空间,例如使用
mount --make-rslave /
.如何使用 Linux 命名空间执行 chroot?