请注意,本文编写于 551 天前,最后修改于 551 天前,其中某些信息可能已经过时。
pivot_root是一个系统调用,用于更改进程的根文件系统。它将当前进程的根文件系统移动到put_old目录,并将new_root设为新的根文件系统。pivot_root系统调用需要在用户命名空间中拥有CAP_SYS_ADMIN特权[1]。
使用pivot_root系统调用需要满足以下条件:
- new_root和put_old必须是目录。
- new_root和put_old不能在当前根文件系统的相同挂载点上。
- put_old必须在new_root下,也就是说,通过在put_old路径后添加一些非负数的"../"后缀,应该得到与new_root相同的目录。
- new_root必须是一个挂载点的路径,但不能是"/"。如果一个路径还不是挂载点,可以通过将该路径绑定到自身来将其转换为挂载点。
- new_root的父挂载点和当前根目录的父挂载点的传播类型不能为MS_SHARED。同样,如果put_old是一个现有的挂载点,它的传播类型也不能为MS_SHARED。这些限制确保pivot_root系统调用不会将任何更改传播到另一个挂载命名空间。
- 当前根目录必须是一个挂载点[2]。
pivot_root系统调用的返回值:
- 成功时返回0。
- 失败时返回-1,并设置errno来指示错误[2]。
pivot_root系统调用可能会失败,并返回以下错误之一:
- EBUSY:new_root或put_old在当前根挂载点上。这种情况通常发生在new_root是"/"的情况下。
- EINVAL:new_root不是一个挂载点。
- EINVAL:put_old不在new_root下。
- EINVAL:当前根目录不是一个挂载点(因为之前进行了chroot操作)。
- EINVAL:当前根目录在rootfs(初始ramfs)挂载上。
- EINVAL:new_root的挂载点或其父挂载点的传播类型为MS_SHARED。
- EINVAL:put_old是一个挂载点,并且其传播类型为MS_SHARED。
- ENOTDIR:new_root或put_old不是目录。
- EPERM:调用进程没有CAP_SYS_ADMIN特权[2]。
Learn more:
- pivot_root (BPX1PVR, BPX4PVR) — Change the root mount
- pivot_root(2) - Linux manual page
- pivot_root(8) - Linux manual page
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!