Linux(CentOS)のディレクトリ構造
サーバをいじりはじめて最初に感じたのが、各ディレクトリの意味をちゃんと理解できていないなーということでした。
サーバを管理する上では吐かれたログを見たり、システムの設定をいじったりしないといけないので、ディレクトリ構造については知っておくべきだと思い、現行のディレクトリ構造の標準などについて調べてみました。
※間違いがあったら指摘して戴けると嬉しいです。
目次
FHS(Filesystem Hierarchy Standard)について
FHSはLinuxディストリビューションの多くが従っているファイルシステム階層に関する標準だそうです。自分が利用しているCentOSもこれに則っているようです。
2017年1月現在での現行標準はv3.0のようです。
※ファイルシステムとは、記憶装置に格納されたデータ(ファイル)を、ユーザが操作できるようにするためにOSが提供している機能です。複数の関連するファイル(及びディレクトリ)を束ねるのがディレクトリになります。
Windows系OSではデバイスごとにツリー構造を持ちますが、UNIX系OSでは、すべてのデバイス上のファイルをひとつの階層構造(木構造)のいずれかのディレクトリ内に配置する仮想ファイルシステムになっており、この木構造の根にあたるのがルートディレクトリになります。
ディレクトリ構造
Linuxのファイルシステム最上位はルートディレクトリ("/")です。※ルートディレクトリは厳密には/直前の空白らしいのですが/と表すのが慣例となっています。
その直下のディレクトリは下記のようになっています。
名前 | 格納される内容 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/bin |
最低限必要な基本コマンドの実行ファイル(binaries)が格納されている。 例えば、chmod、sh、ls、cp、pwd、chown、psなど。 ※/usr/binと違いシングルユーザモードで使う最低限のもの置いている点。/binにないものを/usr/binに置いている。 |
||||||||||||||||||||
/boot | 起動(ブート)に必要なファイル。カーネルの他にもinitrd等が含まれる。 | ||||||||||||||||||||
/dev | 接続されたデバイスを制御する際に用いるデバイス・ファイル(スペシャル・ファイル)が置かれる。データ入出力を1文字(バイト)単位で行うマウス・キーボードのようなものをキャラクタデバイス、ある一定の大きさ(ブロック)単位で行うHDD・メモリ・FDのようなものをブロックデバイスと呼ぶ。 デバイスファイルに対し、open()などのシステムコールを用いると、カーネルドライバがファイルではなくデバイスへアクセスする仕組みになっている。 主なデバイスファイル名とその詳細については以下のようになる。
|
||||||||||||||||||||
/etc |
固有の設定ファイルが置かれる。設定ファイルの拡張子と定義されているわけでないものの、confとつくものが割とある。例えばWebサーバの設定はhttpd.conf(httpd/conf)などとして置かれる。 |
||||||||||||||||||||
/home | ユーザのホームディレクトリ。 | ||||||||||||||||||||
/lib | /bin配下や/sbin配下にある実行ファイルに必要なライブラリ。 | ||||||||||||||||||||
/media | リムーバブルなデバイスのマウントポイント。 | ||||||||||||||||||||
/mnt | ファイルシステムの一時的なマウントポイントで、通常は空である。 | ||||||||||||||||||||
/opt | アプリケーションのパッケージのインストール用。 | ||||||||||||||||||||
/proc |
procfs(process filesystem)というプロセスの情報をファイルシステムに見せかけたものをマウントするディレクトリ。ここではプロセスや場合によってはカーネルの情報が置かれる。 |
||||||||||||||||||||
/root | rootユーザのホームディレクトリ。 | ||||||||||||||||||||
/sbin | システム管理関係のコマンド実行ファイルが置かれる。 | ||||||||||||||||||||
/tmp | 一時的に利用するファイル置き場。システムを再起動したときには消去されている。 | ||||||||||||||||||||
/usr | マルチユーザで共有可能なリソース、アプリケーションが置かれるディレクトリ。
|
||||||||||||||||||||
/var | 内容が変化する可変データが置かれるディレクトリ。ログファイルやアプリケーションキャッシュなど。 |
この他にもディストリビューションやOSごとに固有のディレクトリだったり、インストールしたサブシステムによって追加されるディレクトリがあるようです。自分のCentOSではselinuxという強制アクセス制御のためのディレクトリ等もありました。
補足
■initrdとはなんぞや
聞いたことがあってもよくわかっていなかったものの一つです。Wikipediaさん曰く次の通りらしいです。
初期RAMディスク(initial ramdisk)はLinuxカーネルのブート時に一時的なルートファイルシステムをメモリに読み込むための方式。
カーネルのbootにはファイルシステムを参照しないといけないが、ファイルシステム構築にはカーネルが必要という矛盾があり、これを打開するため、カーネルブート時には一時的なファイルシステムをメモリ上に展開するということでしょうか…?
うーん確信が持てない…ということでさらに調べていくとめちゃくちゃわかりやすく解説されていらっしゃるサイト様がありましたので、リンクを張っておきます。
つまりポイントは以下
- 現状のLinuxでは、カーネルはモジュール化により各種ドライバを内包していない。なぜなら、ドライバをすべてカーネルに内包させると容量が肥大化するため。現在は必要に応じてモジュールをカーネルに組み込む形を取っている。
- つまりブート時にカーネル単体をメモリ上に展開しても、ドライバがないのでHDDを認識できない問題が起こる。
- initrdはブートする際に必要なHDDドライバなどのモジュールを、カーネルと一緒にメモリに展開するために記述されるファイル
モノリシックカーネルとドライバのモジュール化についても勉強になりましたので、ブートの仕組みやこれらについても後で改めて別記事にまとめようと思います。