我正在尝试将进程的根更改为安装在 /tmp/mount_dir 的新文件系统,并且我在其中创建了另一个目录 /tmp/mount_dir/inner_mount_dir ,并且根据手册页ivot_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 中的所有图标都消失了,我根本无法与系统交互(系统冻结我只能首先更改窗口然后一切都终止),屏幕变成空白黑屏,左上角有一个“-”,就像系统正在关闭一样,但会冻结在该状态,直到我强制关闭。
答案1
hub_root() 作用于命名空间。
要仅影响您的进程(及其子进程),请首先输入新的挂载命名空间。并且您需要确保pivot_root操作不会传播回原始命名空间,例如通过使用mount --make-rslave /
.