我正在做一个自我研究项目(我试图创建一个简单的容器)。
我不知道如何正确使用pivot_root(2)
。
我做了什么:1.
chdir("/newroot");
/*chroot(".");*/
pivot_root(".", "."); // errno: EINVAL.
1.到目前为止,我使用chroot()
作为mnt名称空间,我已经注解掉了chroot()
,因为它是EINVAL errno的一部分。
1.我尝试将printk
添加到系统调用中,但没有按计划进行。
chdir("/newroot");
pivot_root(".", "putOld"); errno: EINVAL
mount --make-private --bind /newroot /newroot
1条答案
按热度按时间pxy2qtax1#
The documentation对
pivot_root()
的参数提出了几个要求。最有可能给你带来麻烦的是:new_root
和put_old
不能与当前根目录位于同一挂载上。[...]
new_root
必须是一个挂载点的路径,但不能是“/"。一个还不是挂载点的路径可以通过绑定挂载路径到自身来转换为挂载点。MS_SHARED
有关挂载传播类型的讨论,请参见mount_namespaces(7),并特别注意注解部分。
还要注意的是,为
new_root
和put_old
指定相同的路径对我来说没有多大意义。我认为就文件系统视图而言,这实际上是一个无操作,因为您直接将原始文件系统根安装在新文件系统根的顶部。我希望put_old
在新根下指定一个不同的目录。