pivot_root() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于TP  

pivot_root() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

pivot_root - 更改根文件系统

语法

int pivot_root(const char *new_root, const char *put_old);

描述

pivot_root() 将当前进程的根文件系统移动到目录put_old,并将new_root设为当前进程的新根文件系统。

pivot_root() 的典型用法是在系统启动期间,系统挂载一个临时根文件系统(例如 initrd),然后挂载真正的根文件系统,并最终将后者转换为所有相关进程或线程的当前根。

pivot_root() 可能会或可能不会更改使用旧根目录的任何进程或线程的当前根和当前工作目录 (cwd)。pivot_root() 的调用者必须确保具有根或 cwd 在旧根上的进程在任何情况下都能正常运行。确保这一点的简单方法是在调用 pivot_root() 之前将其根和 cwd 更改为new_root

上面一段话有意含糊不清,因为pivot_root() 的实现将来可能会发生变化。在撰写本文时,如果进程或线程的根或 cwd 指向旧根目录,则pivot_root() 会将它们的根和 cwd 更改为new_root。这是为了防止内核线程即使它们以任何方式从未访问过文件系统,也仍然使用其根和 cwd 使旧根目录保持繁忙状态。将来,可能存在一种机制,允许内核线程显式放弃对文件系统的任何访问,这样就可以从pivot_root() 中删除这种相当侵入性的机制。

请注意,这也适用于当前进程:pivot_root() 可能会或可能不会影响其 cwd。因此,建议在pivot_root() 之后立即调用chdir("/")

以下限制适用于new_rootput_old

标签描述
- 它们必须是目录。
- new_rootput_old 不得与当前根位于同一文件系统上。
- put_old 必须位于new_root 下方,即,向put_old 指向的字符串添加非零数量的/.. 必须产生与new_root 相同的目录。
- 不得在put_old 上挂载其他文件系统。
另请参阅 pivot_root(8) 以获取其他用法示例。

如果当前根不是挂载点(例如,在chroot(2) 或pivot_root() 之后,另请参见下文),则不是旧根目录,而是该文件系统的挂载点将挂载在put_old 上。

new_root 不必是挂载点。在这种情况下,/proc/mounts 将显示包含new_root 的文件系统的挂载点作为根 (/)。

返回值

成功时,返回零。出错时,返回 -1,并适当地设置errno

错误

pivot_root() 可能会(在errno 中)返回stat(2) 返回的任何错误。此外,它可能会返回
标签描述
EBUSY new_rootput_old 位于当前根文件系统上,或者文件系统已挂载在put_old 上。
EINVAL put_old 不在new_root 下方。
ENOTDIR
  new_rootput_old 不是目录。
EPERM 当前进程没有CAP_SYS_ADMIN 权限。

版本

pivot_root() 引入于 Linux 2.3.41。

符合标准

pivot_root() 是 Linux 特定的,因此不可移植。

错误

pivot_root() 不应该需要更改系统中所有其他进程的根和 cwd。

pivot_root() 的一些更模糊的用法可能会很快导致疯狂。

备注

Glibc 没有为此系统调用提供包装器;请使用syscall(2) 调用它。

另请参阅



previous next Printer Friendly

广告


  

广告



广告