スラッシュ(/)はLinuxルートディレクトリの名前の一部ですか?


46

スラッシュ(/)は実際にはLinuxルートディレクトリの名前の一部ですか?または、それは単なるシンボルですか?

どう/etcですか?

更新

仮定し/dev/sda2、Linuxのルートディレクトリのブロックデバイスです。

$ sudo debugfs / dev / sda2
debugfs 1.44.1(24-Mar-2018)
debugfs:   pwd
[pwd] INODE:2パス:/
[ルート] INODE:2パス:/
debugfs:   stat /
iノード:2    タイプ:ディレクトリ     モード:0755フラグ:0x80000
世代:0バージョン:0x00000000:00000077
ユーザー:0グループ:0プロジェクト:0サイズ:4096
ファイルACL:0
リンク:25ブロック数:8
フラグメント:アドレス:0番号:0サイズ:0
 ctime:0x5b13c9f1:3f017990-Sun Jun 3 15:28:57 2018
 atime:0x5b13ca0f:3b3ee380-2018年6月3日15:29:27
 mtime:0x5b13c9f1:3f017990-Sun Jun 3 15:28:57 2018
crtime:0x5aad1843:00000000-2018年3月17日(土)16:59:39
追加のiノードフィールドのサイズ:32
範囲:
(0):9249

そのため、そこにはディレクトリiノード#2がありますが、名前はありません。


1
いくつかのdebugfs出力を示す最近の更新について。これが質問をどのように変えるかを明確にできますか?
クサラナナンダ

そうではありません。答えを完成させたかっただけです。しかし、私は別のものを追加したくありませんでした。更新しました。あなたがあなたの答えにthease行を入れることができればそれらを削除します
-mlibre

回答:


61

POSIX.1-2008標準では、

単一のパス名で構成されるパス名/は、プロセスのルートディレクトリに解決されます。nullパス名は正常に解決されません。

標準では、ファイル名パス名をさらに区別しています/ルートディレクトリのパスのパス名です。ディレクトリの名前は「ルートディレクトリ」ですが、ファイルシステムでは名前がなく、ファイル名がありません。ファイル名がある場合、その名前はルートディレクトリの上のディレクトリのディレクトリエントリになり、そのようなディレクトリはありません。

文字/はパス区切り文字であるため、ファイル名の一部にすることはできません。

明確にするために:/ではない名前のルートディレクトリのが、パスそれまで、そのパス名

/etc別のパス名です。これは、etcディレクトリへの絶対パスの名前です。そのパスにあるディレクトリの名前はetc(ファイル名はですetc)。

/usr/local/bin/curlディレクトリのパス名curlと同じ方法で、実行可能ファイル/etcのパス名ですetc


「ファイル名がある場合、その名前はルートディレクトリの上のディレクトリのディレクトリエントリになります」技術的には、iノード番号と名前(これはiノード2です)の2つです。それはまたことに注意することは興味深い/..ポイントはバックに/、そして/自分自身のためのディレクトリエントリ持っている-古き良きです/.。これら3つすべてが同じiノードを指している
-2

@SergiyKolodyazhnyy 技術的には、ルートディレクトリは「プロセスごと」であり、chroot環境では重要です。chrootでは、ルートディレクトリのiノード番号は特定の番号ではありません(chrootルートのiノード番号になります)。また、(chrootされていない状況での)数値2は使用されるファイルシステムに依存していると思います。
クサラナンダ

また、/プロセスごとのルートの観点から定義されていることにも気付きましたが、iノードchrootが必ずしも2 であるとは限りませんでした。非常に興味深い事実です。また/、特権カーネルプロセスのディレクトリとは何かという問題も発生します。それは、ユーザー空間プロセスのみ/が関連付けていることを意味しますか?
Sergiy Kolodyazhnyy

37

スラッシュは区切り記号です。ディレクトリ名にはセパレータは含まれませんが、フルパス名にはセパレータが含まれます。

そのため、「ルートレベル」 /には名前がありません。ほとんどのUnixライクなシステムでは、これは.andのような特別なケースとして扱われ..ます(もちろん、ルートレベルでは2つの間に違いはありません)。

命名法は異なる場合があります。たとえば、POSIX.1-2017には、よく使用される定義がいくつかリストされています

  • 3.2絶対パス名

    1 <slash>文字または3 文字以上で始まるパス名。Pathnameも参照してください。

  • 3.271パス名

    ファイルを識別するために使用される文字列。POSIX.1-2008のコンテキストでは、パス名は、終端のヌルバイトを含む{PATH_MAX}バイトに制限される場合があります。オプションの開始<slash>文字があり、その後に文字で区切られたゼロ個以上のファイル名が続きます<slash>。オプションで、パス名に1つ以上の末尾<slash>文字を含めることができます。連続する複数の<slash>文字は<slash>、先行<slash>文字が2つだけの場合を除き、oneと同じと見なされます。

    注:パス名がポータブルファイル名文字セット(ポータブルファイル名文字セットを参照)の文字に対応するバイトのみで構成されている場合、<slash>文字、および単一の終了文字<NUL>文字。パス名は、サポートされているすべてのロケールで文字列として使用できます。それ以外の場合、パス名は文字列(文字列ではなく)のみになります。さらに、文字のシングルバイトエンコーディングは<slash>すべてのロケールで同じであり、マルチバイト文字内で発生しないことが要求されるため<slash>、パス名が文字でない場合でもパス名内の文字への参照は明確に定義されます。文字列。ただし、このプロパティは、ポータブルファイル名文字セット内の残りの文字を必ずしも保持するわけではありません。

  • 3.272パス名コンポーネント

    でファイル名を参照してくださいファイル名

  • 3.170ファイル名

    {NAME_MAX}ファイルに名前を付けるために使用される1バイトからなるバイトのシーケンス。名前を構成するバイトには、<NUL>または<slash>文字を含めないでください。パス名のコンテキストでは、各ファイル名の後に文字<slash>または<NUL>文字が続きます。他の場所では、ファイル名の後に<NUL>文字が続きます(ただし、文字列である必要はありません)。ファイル名にはドットが付きdot-dot特別な意味があります。ファイル名は、「パス名コンポーネント」と呼ばれることもあります。Pathnameも参照してください。

だから...あなたが明確化を探しているなら、それはあなたの最初のストップではないかもしれません。この「UNIXの概念」ページなどのチュートリアルは役立ちます。たとえば、「フルパス名」は「絶対パス名」と同義語であると指摘します。


3
Nitpick:ドットとドットドットはファイル名であり、パス名ではありません。実際、POSIX標準には、「特殊なケースとして、ルートディレクトリでは、ドットドットルートディレクトリ自体を指す場合があります」という奇妙な形式があります。(私の強調)。
クサラナナンダ

したがって、文字の仕様を読み取ること/は、有効なファイル名またはパス名コンポーネントではなく、そのようなコンポーネントを含む文字列ではありませんが、特定のディレクトリに対して完全に有効なパス名です。これが存在する必要がありますが、これを要求する部分はその「名前」に言及していません。どういうわけか、これは少しおもしろいと思います。
-ilkkachu

POSIXで回答されています。オプションの開始文字があり、その後に文字で区切られた0個以上のファイル名が続きます。
トーマスディッキー

@Kusalanandaは、仕様の根拠を強調して確認します。仕様で定義されている可能性は、実装テストに関する明確な保証です。使用される可能性がある場合、仕様は、定義された動作の新進順守を保証します。言い換えれば、任意の実装が可能に頼る../結びます/
mikeserv

19

Unixでは、ファイル(およびディレクトリは単なるファイル)に「名前」はありません。リンクには名前があり、リンクは名前をファイルにマッピングするディレクトリ内のエントリです。

あなたは可能性があるリンクがあること、言う与えるファイルに名前を、しかしノート:これは複数のリンクを持つことができますので、ファイルは、複数の名前を持つことができることを意味します。

ルートディレクトリはルートディレクトリであるため、その中にリンクがある「上位の」ディレクトリはないため、それに関連付けられた名前はありません。理論的には他のディレクトリ内のルートディレクトリにリンクを追加することは可能ですが、ほとんどのUnicesは既存のディレクトリへのリンクの追加を禁止します。グラフ内では高価ですが、それらを検出しないと、カーネル内で名前を解決しようとするときに無限再帰につながる可能性があります。

したがって、基本的に、ルートディレクトリには名前がありません。名前を記録できるディレクトリがその上にないためです。

他の回答で指摘したように、名前とパス(名前)を区別する必要があります。ルートディレクトリはpath(name)を介して参照できます/


はい、ファイルは人と同じように複数の名前を持つことができます。私の若い娘の夫は通常ミドルネームで通っていますが、彼は明らかに彼の名前にも答えなければなりません。ルートディレクトリのメイン名は「/」であり、「/」と発音されます。これは、その絶対パス名が「/」であるためです(相対パス名に基づく名前は特に有用ではありません)。(常に「スラッシュルート」と呼ばれるべき「/ルート」、との混同をリスク「ルート」それを呼び出す。
モンティハーダー

1
名前を記録する上位ディレクトリがないため、名前がないという点が気に入っています。それは概念をうまく明確にします。
ジョー

7

「名前」という言葉の使用は少し柔軟です。「完全修飾パス名」を参照できます。「ディレクトリエントリ」を参照できます。さまざまな関数またはルーチンに渡される「ファイル名」を参照できます。

したがって、たとえば、/etc/foo/var/tmp/../../etc/foo/tmp/../../../../../../foo同じファイルを参照するすべての方法をされています。これらはすべて、ディレクトリ内の場合と同様に有効な名前です。foo/etc

それでは、基本に戻りましょう。

UNIXのファイル名は、ディレクトリ区切り文字で区切られたコンポーネント構成され/ます。コンポーネントに関するほとんど唯一の制限は、コンポーネントに/NUL文字を含めることができないことです。それ以外は許可されます。

したがって、の「完全修飾パス名」/etcは完全な文字列です/etc。これはetc、ルートディレクトリにコンポーネントがあることを意味します。

同様に、ディレクトリにコンポーネント/x/y/z/fooがありfooます/x/y/z

ルートディレクトリは、親ディレクトリにコンポーネントを持たないという点でユニークです。それだけで、その名のようにフルパス名を持っています/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.