Unix-system-calls-pivot-root

提供:Dev Guides
移動先:案内検索

[top]#

[[File:]]

[[File:]]

|Web |This Site

  • 初心者向けのUnix *
  • 高度なUnix *

選択した読書

Copyright©2014 by finddevguides

  Home     References     Discussion Forums     About TP  

pivot_root()-Unix、Linuxシステムコール

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] image:http://www.finddevguides.com/add- this.gif [AddThisソーシャルブックマークボタン]

広告

NAME

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* ()の実装は将来変更される可能性があるため、上記の段落は意図的に曖昧です。 執筆時点で、 *pivot_root* ()は、各プロセスまたはスレッドのルートとcwdが古いルートディレクトリを指している場合、_new_root_に変更します。 これは、カーネルスレッドがファイルシステムに決してアクセスしない場合でも、カーネルスレッドがルートとcwdで古いルートディレクトリをビジー状態に保つのを防ぐために必要です。 将来的には、カーネルスレッドがファイルシステムへのアクセスを明示的に放棄するメカニズムが存在する可能性があります。そのため、このかなり侵入的なメカニズムを *pivot_root* ()から削除できます。

これは現在のプロセスにも適用されることに注意してください: pivot_root ()はcwdに影響する場合としない場合があります。 したがって、 pivot_root ()の直後に* chdir( "/")*を呼び出すことをお勧めします。

_new_root_および_put_old_には次の制限が適用されます。

Tag

説明

-

それらはディレクトリでなければなりません。

-

_new_root_および_put_old_は、現在のルートと同じファイルシステム上に存在してはなりません。

-

put_old_は_new_root_の下にある必要があります。 _put_old_が指す文字列に0以外の/.._を追加すると、_new_root_と同じディレクトリが生成されます。

-

_put_old_に他のファイルシステムをマウントすることはできません。

その他の使用例については、 pivot_root (8)も参照してください。

現在のルートがマウントポイントではない場合(例: chroot (2)または pivot_root ()の後、以下も参照)、古いルートディレクトリではなく、そのファイルシステムのマウントポイントが_put_old_にマウントされます。

new_root_はマウントポイントである必要はありません。 この場合、/proc/mounts_には、new_root_をルート(/_)として含むファイルシステムのマウントポイントが表示されます。

返り値

成功すると、ゼロが返されます。 エラーの場合、-1が返され、_errno_が適切に設定されます。

エラー

*pivot_root* ()は、 *stat* (2)によって返されるエラーを(_errno_で)返す場合があります。 さらに、以下を返す場合があります。

Tag

説明

*EBUSY*

_new_root_または_put_old_が現在のルートファイルシステムにあるか、ファイルシステムが_put_old_に既にマウントされています。

*EINVAL*

_put_old_は_new_root_の下にはありません。

*ENOTDIR*

_new_root_または_put_old_はディレクトリではありません。

*EPERM*

現在のプロセスには CAP_SYS_ADMIN 機能がありません。

バージョン

*pivot_root* ()はLinux 2.3.41で導入されました。

準拠

*pivot_root* ()はLinux固有であるため、移植性がありません。

BUGS

*pivot_root* ()は、システム内の他のすべてのプロセスのルートとcwdを変更する必要はありません。
*pivot_root* ()のより曖昧な使用のいくつかは、すぐに狂気につながる可能性があります。

ノート

Glibcはこのシステムコールのラッパーを提供しません。 syscall (2)を使用して呼び出します。

関連項目

[[File:]] image :http://www.finddevguides.com/images/next.gif [next] [[File:]]

広告

  
Advertisements