编辑
2023-11-06
linux
00
请注意,本文编写于 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:

  1. pivot_root (BPX1PVR, BPX4PVR) — Change the root mount
  2. pivot_root(2) - Linux manual page
  3. pivot_root(8) - Linux manual page

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!