Linuxのファイルシステム階層に関する世界観です。
ディレクトリの階層構造。
ルートディレクトリには以下のようなディレクトリツリーがある。
ディレクトリ | 説明 |
---|---|
/ | ルートディレクトリ。 |
/home | ユーザーのホームディレクトリ。たとえば/home/schwarz/.bashrcなどとなります。 |
/root | rootのホームディレクトリ。 |
/bin | OSの基本プログラム。アプリケーションのプログラムは/usr/binにあります。 基本的に、/binは起動に最低限必要なUNIXのプログラムが入るためにあるが、 最近は/binを/usr/binのシンボリックリンクにする場合もある。 これはハードディスクが大きなサイズになって、 /usrは破損したが/binは残っているなどという状況がレガシーなものになってきたためである。 |
/sbin | OSのシステムプログラム。アプリケーションのシステムプログラムは/usr/sbinにあります。 基本的に、rootユーザーでしか実行できないシステムプログラムは/sbinや/usr/sbinに入れられます。 |
/usr | アプリケーションなどのファイル。あとで記述するように、さらに階層があります。 /usrは「ユーザー」と読む人も多いが、 「UNIXシステムリソース」あるいは「UNIXサービスとルーチン」などの略だとされている。 このディレクトリにはUNIXシステムのさまざまな場所から使われるシステムリソースを置く。 |
/etc | 設定ファイル。使っていてもファイルのサイズが変化しないファイルを置く。 設定ファイルである*.confファイルや*.iniファイルはだいたいここに置かれる。 /etc/fstabのようなシステムに必要な設定ファイルのほか、 apache, php, aptなどランタイムレベルで必要なあらゆる設定ファイルが置かれる。 システムを管理する上で非常に重要なディレクトリ。 設定ファイルを自分で書き替える時、 デフォルトの設定ファイルを*.origなどの名前でバックアップを取っておく習慣をつけるとなおよい。 コマンド名と/etcさえ覚えてしまえばLinuxの最低限の管理はできるかもしれない。 |
/var | ログなどの使っていて変化するファイルを置く。 たとえばApacheのHTMLファイルを置くドキュメントルートは/var/www/htmlに設定されていることが多い。 このような時は、/var/www/htmlの所有者を自分(一般ユーザー)にする選択肢もある。 スプールファイルやログファイルも置かれるため、システム管理における重要なディレクトリ。 |
/tmp | 一時的なディレクトリ。一時ファイルが置かれる場所。 |
/dev | デバイスファイル。 /udevによって自動的に作成されるデバイスファイルがあります。 特にファイルシステムを/mnt以下にマウントする時や、パーティションを切る時などには必須のディレクトリ。 |
/mnt | デバイスをマウントするためのディレクトリ。 /mediaはホットプラグデバイスを自動でマウントしてくれますが、 たとえば別のLinuxが入ったパーティションなどを/mnt/redhatなどに手動でマウントする際には/mntを使います。 |
/proc | システム情報。 そもそもはデバッグのための仕組みで、プロセスをファイルとして表現したもの。 最近はカーネルの情報を参照するためにも使われる。 |
/sys | sysfsをマウントするディレクトリ。 従来/procにあった情報のうちプロセスとは無関係のものを/sysに移動した。 |
/lib | 共有ライブラリ。ダイナミックリンクされる*.soファイルがある。 |
/boot | OSのブート用ファイル。 基本的にカーネルとブートローダのみが置かれ、壊れにくいext2でフォーマットされる。 |
また、/usr以下にはアプリケーションをパッケージ管理システムでインストールした時のアプリケーションの構成ファイルの入るサブディレクトリツリーがある。
ディレクトリ | 説明 |
---|---|
/usr/bin | アプリケーションの基本プログラム。沢山のプログラムがあります。 コマンドラインプログラムもGUIのプログラムも、区別せずに全部/usr/binに導入されます。 パッケージ管理システムによって管理されるため、 自分で変更したり削除したりするのは非推奨。 複数バージョンのアプリケーションを同時に入れることが困難なのがたまに傷。 |
/usr/sbin | アプリケーションのシステムプログラム。 特にroot権限が必要なプログラムが置かれます。 |
/usr/lib | アプリケーションのライブラリ。 システムに必要な*.soファイルがある。 最近の64bitシステムでは/usr/lib64を/usr/libの代わりに使う。 /usr/lib/systemdにはsystemdのデフォルトのUnitファイルがあり、 /usr/lib/udev/rules.dにはデフォルトのudevルールがあります。 |
/usr/share | ドキュメントなど、アーキテクチャに依存しないファイル。 基本的に、プログラムのうち実行可能ファイルやx86などのアーキテクチャに依存するファイルは/usr/binや/usr/libに置き、 アーキテクチャに依存しないファイルは/usr/shareに置く。 |
/usr/include | C言語用ヘッダファイル。 たとえばgccやmakeでGTKアプリのビルドがしたいなら、ここにヘッダファイルが必要。 ヘッダファイルはパッケージ管理システムで-develパッケージをインストールすれば導入できます。 |
/usr/local | アプリケーションのローカルなインストール場所。 /usr/localはパッケージ管理システムによって管理されないため、自分で好きなように使ってよい。 使う時は/usr/local/binなどにPATHが入っているかを確認しておこう。 /usr/local/mysqlのようにさらに深いディレクトリを作ってもよいし、 自分で使うだけなら/usrを使わずprefixを/home以下にしてもよい。 |
後日注記:/usrと/varのワークステーション的な使い方として、/usrをNFSで共有し、/varでマシン個別のファイルを置いたりすることが考えられる。全てのネットワーク上のマシンで同一環境を共有出来て便利。
後日注記:/usrには、システムから利用され、システム全体で共有されるシステムリソースを置く。プログラムだけではなく、ライブラリ、ドキュメント、設定ファイルのひな形やデフォルトの設定、参照されるさまざまなリソース、あるいは辞書やフォントなどさまざまなシステムリソースすべてがここにある。UNIXはネットワークで繋がることもあり、そのような時には/varを個別のマシンごとのリソースの置き場に使う。また、アプリケーションによっては、システム管理者が/usr以下にあるデフォルトの設定を上書き設定するために/etc以下に必要なファイルを/usrからコピーして書き換えたり、さまざまなファイルが存在する/usr以下から特定のファイルをコピーあるいはシンボリックリンクして/etcに置くこともある。
詳しくは以下の書籍・ページが参考になります。
アプリケーションのインストール先の違いは、以下のようになります。
ディレクトリ | 説明 |
---|---|
/bin と /sbin | システムの最低限の起動、操作、管理に必要なバイナリファイル。 最近は/usr/binにリンクが張られていることもある。 |
/usr/bin | 通常のアプリケーションのインストール先。 パッケージ管理システムでインストールしたディストリビュータ公式の配布ファイルがインストールされる。 |
/usr/local/bin | システムの管理者が、ソースコードをコンパイルしてインストールしたバイナリファイル。 |
/opt | Google Chromeのように、ディストリビューション公式ではない配布ファイルや、オープンソースでない配布ファイルなど。 システムによって/optディレクトリの用途が違う。 |
/home/hoge/bin | hogeユーザーが自分で入れたバイナリファイル。 |
最近はAppImageのように、ディストリビューションによらない、共通の簡単インストールの可能な仕組みも用意されています。Windowsのフリーソフトようにダウンロードして簡単に実行出来るようになっていくでしょう。
Linuxでは、様々なファイルシステムが利用出来ます。
パーティションを分けると、その部分のディレクトリ以下が別パーティションとしてマウントされる。
たとえば、/と/usrを分けると、/binや/sbinは/パーティションの中に、/usr/binや/usr/sbinなどは/usrパーティションの中に出来る。
これによって、大量のファイルがある場合などに、/homeのようなデータを分けることで、/homeだけを使いまわしたり、バックアップをしたり、障害があった時にシステムが起動不可能にならないようにするなどの対応がしやすくなる。
だが、今日のLinuxデスクトップの用途では、ハードディスクを一時的にメモリの代わりに使うswapパーティションを作り、/bootパーティションをext2で保持し、それから/パーティションぐらいの、最低限の分け方をしていれば、問題になることは少ない。
このようなディレクトリ編成になっている理由は、いくつかあります。
まずひとつは、上に書いたように、パーティションで簡単にディレクトリを分けることができます。/homeや/varや/etcを簡単に/と分けられるほか、それぞれに独自のファイルシステムを適用することもできます。
そして、もうひとつは、コマンドで操作しやすい、ということが挙げられます。たとえば、ソースコードだけを編集したいなら、find /usr/src | xargs sed -iなどで簡単にソースコードだけを自動編集できます。
さらに言えば、シェルから見て、PATHなどを設定する都合が良いということが言えます。シェルはPATHのような環境変数から、システムにある全てのバイナリへと簡単にアクセスできます。
反面、難点としては、「パッケージをさくっと削除できない」というのが挙げられます。もし/usr/firefox/binのようなディレクトリ構成をしていれば、firefoxディレクトリだけを簡単に削除できます。ですが、そのためにRed HatはRPMというパッケージ管理システムを作りました。そのため、Windowsよりもはるかに簡単にパッケージを依存関係を含めて管理・更新できるようになっています。
/var/spoolにはスプールファイルやキューファイルが置かれる。
スプールとは、コンピュータよりも速度の遅いプリンターへの印刷ジョブの転送のように、転送に時間がかかる場合にデータをスプールファイルというファイルに書き出した上で、徐々に転送する仕組み。
後日注記:/varは頻繁に書き換えられるファイルを置きます。共有することは非推奨です。たとえば、/var/spool/mailにはメールボックスが置かれる。/var/runにはサーバのプロセスIDがPIDファイルとして置かれる(起動時に保存し、終了時に破棄される)。/var/logにはログが記録される。
詳しくは以下の書籍を参照のこと。
2023.01.17-18編集
/srvはサービス用のデータを格納するディレクトリ。たとえばApache用のHTMLコンテンツは/var/www/htmlとか/usr/local/apache2/htdocsとか/home/www/htdocsなどに置かれることが多いが、これらの代わりに/srvに格納することもできる。
Apacheも参照のこと。
/usr/libexecは/usr/binのコマンドなどから呼ばれる補助コマンドが置かれるディレクトリ。
多くがシステムの背後で動くようなサービスやデーモン関連のプログラム。BSD系のシステムにおけるディレクトリだそうである。
Debianなどでps axをすると、/usr/libexecに置かれているプログラムのプロセスがたくさんあって、知らない人は驚かれるかもしれない。
initとデーモンも参照のこと。
2023.01.23
Filesystem Hierarchy Standardからの脱却を目指すディストリビューション。「ファイルシステムがパッケージ管理データベース」であることを目指している。GoboLinuxを参照のこと。
デバイスファイルを参照のこと。
systemdを参照のこと。
UNIXシステム管理(システムロガー)を参照のこと。