絶対パス名解決にルートディレクトリはどのように使用されますか?

絶対パス名解決にルートディレクトリはどのように使用されますか?

APUEと言う

各プロセスには絶対パス名を解決するためのルートディレクトリもあります。このルートディレクトリは、chroot関数を使用して変更できます。

相対パス名だけ解決すれば良いと思います。だから私は知りたい

  • 絶対パス名解決はどういう意味ですか?

  • chrootルートディレクトリを使用して絶対パス名を解決するには?ありがとうございます。

答え1

すべてのパス名を確認する必要があります。明らかに、プロセスはパス名をシステムコールの引数としてカーネルに渡します。たとえば、次のようになります。

  • creatまたはopen
  • linkまたはrename
  • unlinkまたはrmdir
  • chmodまたはchown
  • chdirまたはchroot
  • execve

など。次のパス名を考えてみましょう。

…  a  /  b  /  c

カーネルがこれを解釈する方法は次のとおりです。

(ファイルシステムのどこかで)始めて、1という
ディレクトリを見つけます。見つからない場合はエラーが返されます。見つかった場合、ディレクトリは名前付きサブディレクトリを検索します。見つからない場合はエラーが返されます。見つかったら、ディレクトリ内の2というディレクトリエントリを検索します。見つからない場合は、エラー3が返されます。見つかった場合、インデックスノードが返されます。a

b

c

パス名の先頭とアルゴリズムの最初の行に混乱があることに注意してください。簡単です。パス名がスラッシュで始まる場合(例:「絶対パス名」、例/a/b/c:)、パス名が異なるもので始まる場合(例:相対パス名)、検索はプロセスのルートから始まります。例a/b/c)、プロセスの現在の作業ディレクトリから検索が開始されます。


「これはどうなりますか?」と尋ねることもできます。もちろん、カーネルは以下を含む各プロセスに関する多くの情報を保持します。

  • PID、PPID、各種プロセスグループ識別子、
  • 実用的で有効な保存されたUIDとGIDと補足GIDのリスト、
  • ファイルを開き、
  • 信号構成、

そしてもっと。この質問とは関係ないので、多くの内容を省略します。環境変数はカーネルによって保持されないので省略しました。ユーザー空間プログラムによって保持されます。カーネルがすることは、.NETを介してあるプログラムから別のプログラムに環境変数を渡すメカニズムをサポートすることだけですexecve

ドラマのために上のリストから2つを省略しました。

  • プロセスのルートディレクトリ
  • 現在の作業ディレクトリ

これはinodeへのポインタです。これまでにこのプロセスを終えたすべての人がプロセスの現在の作業ディレクトリを設定する方法を理解してください。プロセスはchdirパス名を引数として渡し、上記のプロセスに従ってパス名を解釈します(inodeとして解釈)。成功すると、現在のディレクトリポインタがインデックスノードを指すように設定されます。

プロセスのルートディレクトリは、chrootシステムコールを除いて同じ方法で設定されます。

(どちらの場合も、パス名引数が次から始まる/と、パス名解決はプロセスのルートから始まります。 システムコールを呼び出すときに適用。 )

いくつかの例:

  • 現在のディレクトリが次/home/tim の場合、プロセスルートがファイルシステムルートの場合
    • 訪問すると/etc/services受け取ることができ/etc/services
    • 訪問すると.bashrc受け取ることができます/home/tim/.bashrc
  • これを行うとchroot /filesystem/tim (同じ名前のディレクトリがあり、そのディレクトリにアクセスでき、必要な権限があると仮定しますchroot
    • 訪問すると/etc/services受け取ることができ/filesystem/tim/etc/services
    • 訪問すると/受信できます/filesystem/tim
    • もしchroot /、何も変わらないでしょう。
    • そうすれば、そうしようとchroot /filesystem/john努力します。chroot/filesystem/tim/filesystem/john

ルートディレクトリと現在のディレクトリはinodeへのポインタとして保存されるため、システムはそれを「見つける」必要はありません。
__________
1  つまり、そのモードがディレクトリであることを示すinodeを指すディレクトリエントリ、つまりを探します(i_mode & IFMT) == IFDIR

2.  パス名の最後のセグメントの場合、ファイルの種類が何であるかは関係ありません。ディレクトリ、一般ファイル、名前付きパイプ、シンボリックリンク、デバイスなどにすることができます。

3  パス名の最後のセグメントが見つからないがシステムコールが(等しく)またはディレクトリエントリを作成できない他のものがある場合、操作は失敗しません。creat(filemode)open(file, O_CREAT, mode)

答え2

たとえば、カーネルが/usr/share/man/man1/cat.1.gzinode と確認された場合は、ルートから始めて/下に進む必要がありますcat.1.gz。相対パス名の場合は、現在のディレクトリでファイルを見つけます。

たぶん現在の作業ディレクトリの絶対パスを取得する方法を考えていますか?パスを決定するには、現在のディレクトリから始まり、ルートディレクトリまですべての中間ディレクトリを通過する必要があります。 (ただし、ファイルへの相対パス(システムコールへの引数など)が与えられた場合、カーネルはこれを行いません。open

関連情報