Linuxについて勉強しています。些細な質問ですがお教えください。(1)LinuxとUnixでファイルツリーの構造が微妙に異なっているようですが、なにか理由があるのでしょうか。(2)ディレクトリの中にはディレクトリやファイルの管理情報があるらしいですが、なぜ親ディレクトリは..、自分自身を.と表現しているのでしょうか。確かに相対パスで指定するとき、少しラクですが、それ以上の理由はあるのでしょうか。(3)ハードリンクはディレクトリに対して行えませんが、なぜでしょうか。確かにls -Rなどとすると、循環して永遠に表示が終わらない可能性がありそうですが…。(4)「/」が、ルートディレクトリを表す一方で、区切りの記号としても使われています。個人的には気持ちが悪いのですが、なにか理由があるのでしょうか。とくにルートディレクトリとその子ディレクトリの表現が気持ち悪いです。たとえば「//home/...」ならばまだ納得できるんですけれど。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/08/27 18:18:11
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:zzz_1980 No.1

回答回数492ベストアンサー獲得回数64

ポイント100pt

(1) Linuxでもディストリビューションによってディレクトリ構成(パス構成)はかわります。設計者の趣味…という説は嘘ですが考え方の相違であったり管理ツールの都合であったりさまざまな理由でディレクトリ構成やおいてあるファイルの種類は異なります。

(2)相対パスでアクセスするためです。それ以外に理由はありません。/ではじまらないパス名は相対パス名と呼ばれますが、自分自身と自分の親ディレクトリを示すものがないと、ディレクトリそのものへアクセスができなかったり、直下にないパス(ディレクトリ)の参照ができないので、.. と . が仕様として追加されました。

(3)管理者権限があればディレクトリへのハードリンクをはれます。管理者でないと出来ないようになっているのは、書かれている通り無限ループにおちいる可能性があるため危険な操作を簡単に出来るようにするためです。

(4)ルートは/とするという設計仕様だからです。ルートディレクトリ含めてディレクトリを透過的にあらわすためです。(ルートディレクトリは名無しのディレクトリだと思えば。)

a. 他のホスト上にあるルートディレクトリをNFSで/mnt にマウントする場合を考えてください。

b. 任意のディレクトリは chroot システムコールを使うとそのプロセスからはルートディレクトリに見えます。

おそらく "http://q.hatena.ne.jp"の類推から"//"が気持ち悪いと感じられているのだと思いますが、ここでの"//"はホストを示すものとして扱われています。今ルートディレクトリを"//"と再定義してしまうと"http://q.hatena.ne.jp//index.html" と書かざるをえなくなってしまって大混乱ですよ。ホスト名を"//"で表現するのは大昔の広域ファイル共有システムの表現の名残ですね。

id:javabenkyo

(1)と(3)は了解しました。ありがとうございます。

(2)ですが、たとえばディレクトリdir1の下にディレクトリdir2があって、カレントディレクトがdir2だったとします。dir1に移動するとき、cd ..とすればよく、簡単だと思います。でも、「..」という表記がなくともdir2が持っている情報のなかに親ディレクトリとしてdir1という名前が登録されていれば、cd dir1とでも表現できそうなものです。なぜ、直接の名前ではなく、「..」といった表現なのかなあという質問なのでした。

(4)ですが、「透過的」「名無しのディレクトリ」「chrootシステムコール」等不勉強でわからない単語でして、確認させていただきます。質問の趣旨としては、ルートディレクトリを「/」とするのは、それはそのように作られているのだからしょうがありませんが、また一方で区切りとして使うのもよいのですけど、だったらルートディレクトリとその子ディレクトリとの間にも区切りの/を入れて表現してほしいなあ、「/(ルートディレクトリ)/(区切り)home」ならわかるのだけど、なぜ「/home」となるの?というものでした。もしお時間ありましたら再回答をしていただければありがたいです。

2008/08/24 13:57:06

その他の回答4件)

id:zzz_1980 No.1

回答回数492ベストアンサー獲得回数64ここでベストアンサー

ポイント100pt

(1) Linuxでもディストリビューションによってディレクトリ構成(パス構成)はかわります。設計者の趣味…という説は嘘ですが考え方の相違であったり管理ツールの都合であったりさまざまな理由でディレクトリ構成やおいてあるファイルの種類は異なります。

(2)相対パスでアクセスするためです。それ以外に理由はありません。/ではじまらないパス名は相対パス名と呼ばれますが、自分自身と自分の親ディレクトリを示すものがないと、ディレクトリそのものへアクセスができなかったり、直下にないパス(ディレクトリ)の参照ができないので、.. と . が仕様として追加されました。

(3)管理者権限があればディレクトリへのハードリンクをはれます。管理者でないと出来ないようになっているのは、書かれている通り無限ループにおちいる可能性があるため危険な操作を簡単に出来るようにするためです。

(4)ルートは/とするという設計仕様だからです。ルートディレクトリ含めてディレクトリを透過的にあらわすためです。(ルートディレクトリは名無しのディレクトリだと思えば。)

a. 他のホスト上にあるルートディレクトリをNFSで/mnt にマウントする場合を考えてください。

b. 任意のディレクトリは chroot システムコールを使うとそのプロセスからはルートディレクトリに見えます。

おそらく "http://q.hatena.ne.jp"の類推から"//"が気持ち悪いと感じられているのだと思いますが、ここでの"//"はホストを示すものとして扱われています。今ルートディレクトリを"//"と再定義してしまうと"http://q.hatena.ne.jp//index.html" と書かざるをえなくなってしまって大混乱ですよ。ホスト名を"//"で表現するのは大昔の広域ファイル共有システムの表現の名残ですね。

id:javabenkyo

(1)と(3)は了解しました。ありがとうございます。

(2)ですが、たとえばディレクトリdir1の下にディレクトリdir2があって、カレントディレクトがdir2だったとします。dir1に移動するとき、cd ..とすればよく、簡単だと思います。でも、「..」という表記がなくともdir2が持っている情報のなかに親ディレクトリとしてdir1という名前が登録されていれば、cd dir1とでも表現できそうなものです。なぜ、直接の名前ではなく、「..」といった表現なのかなあという質問なのでした。

(4)ですが、「透過的」「名無しのディレクトリ」「chrootシステムコール」等不勉強でわからない単語でして、確認させていただきます。質問の趣旨としては、ルートディレクトリを「/」とするのは、それはそのように作られているのだからしょうがありませんが、また一方で区切りとして使うのもよいのですけど、だったらルートディレクトリとその子ディレクトリとの間にも区切りの/を入れて表現してほしいなあ、「/(ルートディレクトリ)/(区切り)home」ならわかるのだけど、なぜ「/home」となるの?というものでした。もしお時間ありましたら再回答をしていただければありがたいです。

2008/08/24 13:57:06
id:zzz_1980 No.2

回答回数492ベストアンサー獲得回数64

(1) Linuxでもディストリビューションによってディレクトリ構成(パス構成)はかわります。設計者の趣味…という説は嘘ですが考え方の相違であったり管理ツールの都合であったりさまざまな理由でディレクトリ構成やおいてあるファイルの種類は異なります。

(2)相対パスでアクセスするためです。それ以外に理由はありません。/ではじまらないパス名は相対パス名と呼ばれますが、自分自身と自分の親ディレクトリを示すものがないと、ディレクトリそのものへアクセスができなかったり、直下にないパス(ディレクトリ)の参照ができないので、.. と . が仕様として追加されました。

(3)管理者権限があればディレクトリへのハードリンクをはれます。管理者でないと出来ないようになっているのは、書かれている通り無限ループにおちいる可能性があるため危険な操作を簡単には出来ないようにするためです。

(4)ルートは"/"とするという設計仕様だからです。ルートディレクトリ含めてディレクトリを透過的にあらわすためです。(ルートディレクトリは名無しのディレクトリ。)

a. 他のホスト上にあるルートディレクトリをNFSで/mnt にマウントする場合を考えてください。

b. 任意のディレクトリは chroot システムコールを使うとそのプロセスからはルートディレクトリに見えます。

おそらく "http://q.hatena.ne.jp"の類推から"//"が気持ち悪いと感じられているのだと思いますが、ここでの"//"はホストを示すものとして扱われています。今ルートディレクトリを"//"と再定義してしまうと"http://q.hatena.ne.jp//index.html" と書かざるをえなくなってしまって大混乱ですよ。ホスト名を"//"で表現するのは大昔の広域ファイル共有システムの表現の名残ですね。

id:kn1967 No.3

回答回数2915ベストアンサー獲得回数301

ポイント75pt

(2)

根っこを表すroots(ルーツ)という言葉。

植物の根は通常1本ではなくて大量にあるので通常使う言葉としては複数形で表しますが

根源という意味で単数形に戻すと root となります。


一番最初に書く / は根源から辿れ(絶対指定や絶対パスなどと表します)という意味となり

一番最初に / が無ければ現在位置から(相対指定や相対パスなどと表します)という意味になります。


相対指定のために現在位置を示す . と親ディレクトリを示す .. が存在するのですが

現在位置からを示す場合 ./ は通常は省略できるようになっているため

./hogehoge ではなく hogehoge と書く場合が殆どだと思います。

省略可能であるという事を意識せず(知らず)に使っている人が大半かと思いますが、

それに気付いたがために意味が判らず「気持ち悪い」となったのでしょう。

# ちなみに「意識せずに(知らず)」が「透過的に」と同じ意味になります。



(4)

途中で使う / はディレクトリとファイル(あるいはサブディレクトリ)との区切りになってますが

上記と違う意味なのに同じ記号が使われているのは

「これらが使われ始めた時代は使える文字の種類が非常に少なかった」のが原因かと思います。

(アルファベット大文字小文字と数種類の記号、制御コードまで含めて128種類)


(1)と(3)

既回答にて納得の様子なので割愛しますね。

id:javabenkyo

ご丁寧な回答、ありがとうございます。(2)に関しては、あるディレクトリがもっている情報として

i-nod番号 ファイル名

10 ..

20 .

30 file1

40 dir3

となっているかと思いますが、これが、

10 dir1

20 dir2

30 file1

40 dir3

となっていないのはなぜなのだろう、という疑問でした。皆さんの回答から、(1)dir1が親ディレクトリである、dir2が自分自身を表す、といった情報を表現しないといけないため、余分な容量が必要となる。(2)「..」「.」と表現したほうが、簡単に相対パスを表現できるため操作性が上がる、と理解しました。

(4)について、なるほど!と思いました。ありがとうございます。

2008/08/24 15:29:03
id:ken33jp No.4

回答回数928ベストアンサー獲得回数13

ポイント50pt

(1)もともとUNIXはLINUX以外にもいろんなものがそんざいしたからです。

http://e-words.jp/w/UNIX.html

id:javabenkyo

ありがとうございます。

2008/08/24 16:50:01
id:longicorn No.5

回答回数56ベストアンサー獲得回数6

ポイント75pt

基本的に他の方が答えていますので(1)について補足しておきます。

ファイルシステムの構成は昔はUnix全般で結構色々ありました。

これは歴史的な理由になります。

ここの説明は省略します。それこそUnixの歴史を最初から追わなくてはいけないので…。


そして現在このままでは問題があるということで標準化を行っています。

(コメントでttamoさんが指摘していますが)これがFHS(The Filesystem Hierarchy Standard)という規格です。

http://www.pathname.com/fhs/ がFHSのサイトです。


現在のLinux(おそらくはUnix全般も)はFHSに従っているはずです(100%ではないですが)。

ただし、FHSにもバージョンがありまして、各ディストリビュータがリリースを行うときにFHSのどのバージョンに従うかによってディレクトリ構成が変わってきます。

Linux間でも(もちろんUnix間でも)ディレクトリ構成が異なるのはこういう事情です。

もちろんFHSに従っていない場合もありますのでその辺は仕方が無い部分もあります。

ちなみにLinuxであればmanのhier(7)を参照すれば各ディレクトリの意味が書いています。


>>ttamoさん

>ありがとうございます。(2)について、ちょっと意味がわかりません(笑)。ただ、「すべてをファイルで表現する」という思想があるのですね。参考になりました。

この「すべてをファイルで表現する」というのはまさにUnixの哲学の1つです。

この辺(というか今回の質問全般)を本当に理解するにはC言語でプログラミングを行うしかないと思います。

id:javabenkyo

ありがとうございます。FHS、確認してみます。

すべてをファイルで表現する、というのは、たとえばデバイスもファイルとして扱われている、

というところにもつながっているのでしょうかね。

いま勉強を始めたばかりで、C言語まではまだ追えませんが、意識したいと思います。

2008/08/24 17:09:17
  • id:zzz_1980
    すいません、最初の回答にタイプミスがあったので、修正して二つ目を書きました。
    誤 簡単に出来るようにするためです。
    正 簡単に出来きないようにするためです。
  • id:javabenkyo
    javabenkyo 2008/08/24 14:03:30
    了解しました。
    上にも書きましたが、もし補足がありましたら回答いただければ幸いです。
  • id:ttamo
    真面目に答えきれないので、コメントにて。ネタだと思ってください。

    (1) http://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard
    Linux はだいたい FHS に従っているような気がします。

    (2) 「親を .. と表す」のではなく、逆に、「.. が親」だと考えると、
    なんだかすごいことのように思えてきませんか。よくわかりませんが、
    「すべてをファイルで表現する」という Unix philosophy と関係があるのかもしれません。

    (3) 私の記憶によると、ハードリンクは、あるファイル (の inode) に
    別の名前を付けることです。結果ファイルに二つ (以上) の名前ができますが、
    それらのどちらが本当の名前でどちらがリンクなのかは区別されません。
    リンクかどうかわからない、ということで、色々な問題があります。
    たとえばおっしゃるとおりの無限ループです。
    http://his.luky.org/ML/linux-users.6/msg05840.html

    (4) なにがご不満なのかよくわかりませんが、
    なにもないところを切ってルートを出したと考えると良いのでは?
    つまり、ルートディレクトリが「/」なのではなく、
    ディレクトリ名のうしろに付く記号が「/」なだけだと。

  • id:zzz_1980
    (2)について
    > 「..」という表記がなくともdir2が持っている情報のなかに親ディレクトリとしてdir1という名前が登録されていれば、cd dir1とでも表現できそうなものです。
    そうするためには、ディレクトリが持っているディレクトリの情報の中に「親ディレクトリである」という情報を1bit追加しなければなりません。「ディレクトリをまるごと別のディレクトリにmvした」なんていう場合を考えると、わざわざ親ディレクトリの名前を取得してディレクトリエントリを書き換える必要があります。「親ディレクトリの親ディレクトリの親ディレクトリの」とかいちいちディレクトリ名を打つのは自分には耐えられません(笑)。ようは面倒なんで、できるだけシンプルにした結果現在の仕様に落ち着いたのでしょう。
    Linux/Unixそのものの仕様ではなくて「ファイルシステム」の仕様ですね。
    /www/dir1
    /www/dir2
    /www/dir3
    があってカレントディレクトリが /mnt/dir1であるときに /mnt/dir1 を /mnt/dir2/dir1 へ移動するにはどのようなmvコマンドでの中でディレクトリ(ファイルシステム)に対してどのような操作が行われる(べき)か考えてみてください。(どのようなシンボリックリンクをはるかでもいいです。)現状よりも簡単な実装でかつ誰でも覚えやすく使いやすいものが出来たらすごいことです。先人の知恵は偉大です。
  • id:javabenkyo
    javabenkyo 2008/08/24 15:20:21
    >ttamoさん
    ありがとうございます。(2)について、ちょっと意味がわかりません(笑)。ただ、「すべてをファイルで表現する」という思想があるのですね。参考になりました。(4)について、そう思えば確かにつじつまがあるのですが、どの参考書を見てもルートディレクトリを「/」を表現すると書かれているので、その説明は成り立たないかと。大いに不満があるわけではないのですが、ちょっと違和感を覚えていましたので、質問させていただきました。
    >zzz_1980
    ありがとうございます。ディレクトリの移動の際などのユーザーの操作性を考慮して、「..」「.」と表現される、ということですね(逆に言うと、システムの内部的な事情、というわけではないだろうと)。それならば、納得しました。複数回答いただきましてありがとうございます。
  • id:kn1967
    >dir1が親ディレクトリである、dir2が自分自身を表す、といった情報を表現しないといけないため、
    >余分な容量が必要となる。

    .. に親ディレクトリの名前を書いた場合に
    親ディレクトリの名前を変えたらどうなるかを考えてみてください。
    子ディレクトリの中の全ての..を書き換えなければならなくなりますよね。
    つまりは容量ではなく管理のしやすさでしょうね。
  • id:kensaito
    > でも、「..」という表記がなくともdir2が持っている情報のなかに
    > 親ディレクトリとしてdir1という名前が登録されていれば、
    > cd dir1とでも表現できそうなものです。

    それだと、"dir2"に"dir1"というファイル/ディレクトリは作成できなくなりますよね。
    #脱字があったので書き直しました。
  • id:javabenkyo
    javabenkyo 2008/08/24 16:46:16
    >kn1967さん
    ありがとうございます。なるほど、そうですね!

    >kensaitoさん
    なるほど!親ディレクトリの名前と同じ名前をディレクトリまたはファイルにつける、
    などという操作は考えたこともありませんでしたが、たしかにそうですね。


    みなさんのご説明を聞いて、なかなか精妙に作られているのだなあと感じ始めました。
  • id:zzz_1980
    本格的に(OSとしての)UNIXを勉強するためのネタとして超古典ですが、以下の2冊をあげておきます。アマゾンには中古であるようです。図書館にもあるかな。
    UNIXカーネルの設計 (単行本) 著 Maurice J. Bach (著), 坂本 文 (翻訳), 村井 純 (翻訳), 多田 好克 (翻訳) (通称Back本)
    Lions’ Commentary on UNIX (Ascii books) (単行本(ソフトカバー)) 著 ジョン ライオンズ (著), John Lions (原著), 岩本 信一 (翻訳)
    の2冊をあげておきます。後者はUNIX V6のフルソースコードとコードに対する詳細なコメントを含んだ本です。
  • id:javabenkyo
    javabenkyo 2008/08/27 18:15:09
    >zzz_1980さん
    ありがとうございます。勉強になりそうです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません