人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: javabenkyo
●カテゴリ:コンピュータ
✍キーワード:HOME Linux LS UNIX ディレクトリ
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● zzz_1980
●100ポイント ベストアンサー

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

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

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

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

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

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

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

◎質問者からの返答

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

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

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


2 ● zzz_1980
●0ポイント

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

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

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

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

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

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

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


3 ● kn1967
●75ポイント

(2)

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

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

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


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

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


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

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

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

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

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

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



(4)

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

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

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

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


(1)と(3)

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

◎質問者からの返答

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

i-nod番号 ファイル名

10 ..

20 .

30 file1

40 dir3

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

10 dir1

20 dir2

30 file1

40 dir3

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

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


4 ● ken33jp
●50ポイント

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

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

◎質問者からの返答

ありがとうございます。


5 ● longicorn
●75ポイント

基本的に他の方が答えていますので(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言語でプログラミングを行うしかないと思います。

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ