読者です 読者をやめる 読者になる 読者になる

ぎじゅつめも

とある工学系学生が学んだことをメモするだけのブログです。

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()などのシステムコールを用いると、カーネルドライバがファイルではなくデバイスへアクセスする仕組みになっている。 主なデバイスファイル名とその詳細については以下のようになる。
hda IDE接続されたデバイスを表す(HDDである必要はない)。接続されるデバイスごとにhda,hdb,hdc...と命名される。また、HDDにパーティションがある場合パーティションごとのファイルも生成される。(例えば、sdaに3つのパーティションがある場合hda1,hda2,hda3)
sda SCSI接続されたデバイスを表す。命名規則は同上。
null nullデバイスを表す。nullデバイスは実体がない仮想的なデバイスの一つで、書き込んでも捨てられ読み出しても何も得られないデバイス。出力を捨てる際に用いる。
zero zeroデバイスを表す。zeroデバイスは実体がない仮想的なデバイスの一つで、書き込んでも捨てられ読み出すと0を得つづけることができるデバイス。
random 乱数生成器を表す。
stdin 標準入力(デフォルトではキーボード入力)を表す。
stdout 標準出力(デフォルトではコンソール画面)を表す。
stderr 標準エラー出力(デフォルトではコンソール画面)を表す。
tty 標準入出力となっている端末を表すデバイスファイル。teletypewriterの略称。
pts sshtelnetで接続する仮想端末のデバイスファイル。
/etc

固有の設定ファイルが置かれる。設定ファイルの拡張子と定義されているわけでないものの、confとつくものが割とある。例えばWebサーバの設定はhttpd.conf(httpd/conf)などとして置かれる。

/home ユーザのホームディレクトリ。
/lib /bin配下や/sbin配下にある実行ファイルに必要なライブラリ。
/media リムーバブルなデバイスのマウントポイント。
/mnt ファイルシステムの一時的なマウントポイントで、通常は空である。
/opt アプリケーションのパッケージのインストール用。
/proc

procfs(process filesystem)というプロセスの情報をファイルシステムに見せかけたものをマウントするディレクトリ。ここではプロセスや場合によってはカーネルの情報が置かれる。

/root rootユーザのホームディレクトリ。
/sbin システム管理関係のコマンド実行ファイルが置かれる。
/tmp 一時的に利用するファイル置き場。システムを再起動したときには消去されている。
/usr マルチユーザで共有可能なリソース、アプリケーションが置かれるディレクトリ。
/usr//bin /binに置かれなかったコマンドが置かれる。すなわちシングルユーザモードでは必要ないようなもの。
/usr/local ユーザがインストールしたソフトウェア等が置かれるディレクトリ。
/var 内容が変化する可変データが置かれるディレクトリ。ログファイルやアプリケーションキャッシュなど。

 

この他にもディストリビューションやOSごとに固有のディレクトリだったり、インストールしたサブシステムによって追加されるディレクトリがあるようです。自分のCentOSではselinuxという強制アクセス制御のためのディレクトリ等もありました。


 

補足

■initrdとはなんぞや

聞いたことがあってもよくわかっていなかったものの一つです。Wikipediaさん曰く次の通りらしいです。

初期RAMディスク(initial ramdisk)はLinuxカーネルブート時に一時的なルートファイルシステムをメモリに読み込むための方式。

initrd - Wikipedia

カーネルのbootにはファイルシステムを参照しないといけないが、ファイルシステム構築にはカーネルが必要という矛盾があり、これを打開するため、カーネルブート時には一時的なファイルシステムをメモリ上に展開するということでしょうか…?

うーん確信が持てない…ということでさらに調べていくとめちゃくちゃわかりやすく解説されていらっしゃるサイト様がありましたので、リンクを張っておきます。

Linuxのinitrdファイルの作成

つまりポイントは以下

  • 現状のLinuxでは、カーネルはモジュール化により各種ドライバを内包していない。なぜなら、ドライバをすべてカーネルに内包させると容量が肥大化するため。現在は必要に応じてモジュールをカーネルに組み込む形を取っている。
  • つまりブート時にカーネル単体をメモリ上に展開しても、ドライバがないのでHDDを認識できない問題が起こる。
  • initrdはブートする際に必要なHDDドライバなどのモジュールを、カーネルと一緒にメモリに展開するために記述されるファイル

モノリシックカーネルとドライバのモジュール化についても勉強になりましたので、ブートの仕組みやこれらについても後で改めて別記事にまとめようと思います。