Linux のディレクトリ構造

#はじめに
Linuxのディレクトリ構造はFHS(Filesystem Hierarchy Standard)という規格にしたがってつくられており、歴史があるものらしいので自分なりに調べてみました。
詳しく知りたいよという人はこちらを参照ください。
→[Filesystem Hierarchy Standard](https://refspecs.linuxfoundation.org/fhs.shtml)

#基本編
現在のFHS（FHS 3.0）で規定された、ルートディレクトリ直下のディレクトリで必須とされているものは、「/bin」「/boot」「/dev」「/etc」「/lib」「/media」「/mnt」「/opt」「/run」「/sbin」「/srv」「/tmp」「/usr」「/var」の14個です（「/home」「/root」についてはオプションとして規定）。

|ディレクトリ|役割|
|:------:|:------------:|
|/|ルートディレクトリ。ここが階層の起点。         |
|/bin|シングルユーザーモードでシステムの起動や修理を行う際に必要な実行形式ファイルが含まれる。例えば、cat、cp、ls、more、tarなどの実行ファイル。         |
|/boot|Linuxのカーネルやブートマネージャーなどが含まれる。 このディレクトリにはブートプロセスの間に必要なファイルだけが置かれる。         |
|/dev|物理デバイスを参照しているコンピューターに接続されたデバイス(マウスやキーボード、ディスク等)のスペシャルファイルやデバイスファイルの置き場所。         |
|/etc|ほとんどのシステム設定ファイルが入っているディレクトリ。また、サブディレクトリの/etc/rc.dには初期化スクリプトが入っている。         |
|/lib|システムの起動時に必要な共有ライブラリや、 ルートファイルシステムでコマンドを実行するのに必要な共有ライブラリがおかれる場所。         |
|/media| CD-ROMやフロッピーディスクなどの外付けメディア用のマウントポイント。        |
|/mnt|一時的にマウントされるファイルシステムのマウントポイント。         |
|/opt|アドオンパッケージの静的なファイルが置かれる。         |
|/run|実行中のプロセスに関連するデータが置かれる。         |
|/sbin|/bin と同様に、 このディレクトリにはシステムの起動に必要なコマンドが含まれる。 ただしここには、一般ユーザーは通常実行しないコマンドが置かれる。         |
|/srv|定期的なジョブによって、またはシステム起動時に、 無条件に削除して構わない一時的なファイルが置かれる。         |
|/tmp|定期的なジョブによって、またはシステム起動時に、 無条件に削除して構わない一時的なファイルが置かれる。         |
|/usr|ユーザが独自にインストールするファイル類がおかれる。ルート直下と同様の構造が作成されている。         |
|/var|スプールファイルやログファイルのような、 サイズが変化するファイルが置かれる。         |

実際に以下のコマンドをUbuntuでたたいてみると下のようなディレクトリ構造が表示される。

```
tree -d -L 2
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365885/f4e9d42b-63af-b70b-d264-a577812ebcbd.png)

#発展編
ここではルートディレクトリ直下のディレクトリ(オプション含む)について詳しく解説する。
###/bin：必須のユーザーコマンドバイナリを置いている
システム管理者とユーザーの両方が使用できるコマンドが含まれる。
他のファイルシステムがマウントされていない場合（シングルユーザーモードなど）に必要。また、スクリプトによって間接的に使用されるコマンドが含まれる場合もある。

コマンドがうまく動かなくなったりするので、サブディレクトリを作ってはいけない。

以下のコマンドを保存している。

|コマンド|説明|
|:------:|:------------:|
|cat|ファイルを標準出力に連結するユーティリティ         |
|chgrp|ファイルグループの所有権を変更するユーティリティ         |
|chmod|ファイルのアクセス許可を変更するユーティリティ         |
|chown|ファイルの所有者とグループを変更するユーティリティ         |
|cp|ファイルとディレクトリをコピーするユーティリティ         |
|date|システムデータと時刻を印刷または設定するユーティリティ        |
|dd|ファイルを変換してコピーするユーティリティ         |
|df|ファイルシステムのディスク容量使用量を報告するユーティリティ         |
|dmesg|カーネルメッセージバッファを印刷または制御するユーティリティ         |
|echo|テキスト行を表示するユーティリティ         |
|false|偽。何もしないユーティリティ         |
|hostname|システムのホスト名を表示または設定するユーティリティ         |
|kill|プロセスに停止のシグナルを送信するユーティリティ         |
|ln|ファイル間のリンクを作成するユーティリティ         |
|login|システムでセッションを開始するユーティリティ         |
|ls|ディレクトリの内容を一覧表示するユーティリティ         |
|mkdir|ディレクトリを作成するユーティリティ         |
|mknod|ブロックまたは文字の特殊ファイルを作成するユーティリティ         |
|more|テキストをページングするユーティリティ         |
|mount|ファイルシステムをマウントするユーティリティ         |
|mv|ファイルを移動/名前変更するユーティリティ         |
|ps|プロセスステータスを報告するユーティリティ         |
|pwd|現在の作業ディレクトリの名前を出力するユーティリティ         |
|rm|ファイルまたはディレクトリを削除するユーティリティ         |
|rmdir|空のディレクトリを削除するユーティリティ         |
|sed|「sed」ストリームエディタ         |
|sh|POSIX互換のコマンドシェル         |
|stty|端末回線設定を変更および印刷するユーティリティ         |
|su|ユーザーIDを変更するユーティリティ         |
|sync|ファイルシステムバッファをフラッシュするユーティリティ         |
|true|真。何もしないユーティリティ         |
|umount|ファイルシステムをアンマウントするユーティリティ         |
|uname|システム情報を印刷するユーティリティ         |

###/boot：ブートローダーの静的ファイルを置いている
起動時に不要な設定ファイルとマップインストーラを除いて、起動プロセスに必要なすべてが置いてある。したがってカーネルがユーザーモードプログラムの実行を開始する前に使用されるデータも格納されており、保存されたマスターブートセクターとセクターマップファイルが含まれる場合がある。

ブートローダーがファイルを起動できるようにするために必要なプログラムは、/sbinに配置されている。また起動時に不要なブートローダーの構成ファイルは、/etcに配置されている。

###/dev：デバイスファイルを置いている
特に深掘りすることなし。

###/etc：ホスト固有のシステム構成ファイルを置いている
システム構成ファイルは、プログラムの動作を制御するために使用されるローカルファイル。静的である必要があり、実行可能なバイナリにすることはできない。
ちなみに/etcにシステム構成ファイルを置く場合は直下ではなく 、サブディレクトリに保存するのが普通。

/etc対応するサブシステムがインストールされている場合は以下のようなディレクトリが作られ、中に設定ファイルが保存される。(またはディレクトリへのシンボリックリンクがある。)

|ディレクトリ|説明|
|:------:|:------------:|
|/etc/opt|Cシェルログイン用のシステム全体の初期化ファイル         |
|/etc/X11|NFSファイルシステムのアクセス制御リスト         |
|/etc/sgml|ファイルシステムに関する静的情報         |
|/etc/xml|XML の設定ファイル群が置かれるディレクトリ         |


また/etc対応するサブシステムがインストールされている場合は、次のファイルが/etcに保存される。(またはディレクトリへのシンボリックリンクがある。)

|ファイル|説明|
|:------:|:------------:|
|csh.login|Cシェルログイン用のシステム全体の初期化ファイル         |
|exports|NFSファイルシステムのアクセス制御リスト         |
|fstab|ファイルシステムに関する静的情報         |
|ftpusers|FTPデーモンのユーザーアクセス制御リスト         |
|gateways|ルーティングされたゲートウェイをリストするファイル         |
|gettydefs|gettyが使用する速度と端末の設定         |
|group|ユーザーグループファイル         |
|host.conf|リゾルバー構成ファイル         |
|hosts|ホスト名に関する静的情報         |
|hosts.allow|TCPラッパーのホストアクセスファイル         |
|hosts.deny|TCPラッパーのホストアクセスファイル         |
|hosts.equiv|rlogin、rsh、rcpの信頼できるホストのリスト         |
|hosts.lpd|lpdの信頼できるホストのリスト         |
|inetd.conf|inetdの構成ファイル         |
|inittab|initの構成ファイル         |
|issue|ログイン前のメッセージと識別ファイル         |
|ld.so.conf|共有ライブラリを検索するための追加ディレクトリのリスト         |
|motd|その日のファイルのログイン後のメッセージ         |
|mtab|ファイルシステムに関する動的情報         |
|mtools.conf|mtoolsの構成ファイル         |
|networks|ネットワーク名に関する静的情報         |
|passwd|パスワードファイル         |
|printcap|lpdプリンター機能データベース         |
|profile|shシェルログイン用のシステム全体の初期化ファイル         |
|protocols|IPプロトコルリスト         |
|resolv.conf|リゾルバー構成ファイル         |
|rpc|RPCプロトコルリスト         |
|securetty|rootログインのTTYアクセス制御         |
|services|ネットワークサービスのポート名         |
|shells|有効なログインシェルのパス名         |
|syslog.conf|syslogdの構成ファイル         |

###/home：ユーザーのホームディレクトリ（オプション）
特に深掘りすることなし。

###/lib：必須の共有ライブラリとカーネルモジュールを置いている
システムを起動し、ルートファイルシステムでコマンドを実行するのに必要な共有ライブラリが置かれている。
以下のようなファイルが置かれる。

|ファイル|説明|
|:------:|:------------:|
|libc.so.*|動的にリンクされたCライブラリ         |
|ld*|実行時リンカー/ローダー         |

/lib対応するサブシステムがインストールされている場合は、以下のようなディレクトリが作られ、中にモジュールが保存される。(またはディレクトリへのシンボリックリンクがある。)

|ディレクトリ|説明|
|:------:|:------------:|
|modules|ロード可能なカーネルモジュール         |

###/media：リムーバブルメディアのマウントポイント
フロッピーディスク、CD-ROM、zipディスクなどのリムーバブルメディアのマウントポイントとして使用されるサブディレクトリが置かれている。

/media対応するサブシステムがインストールされている場合は、以下のようなディレクトリが作られ、中にモジュールが保存される。(またはディレクトリへのシンボリックリンクがある。)

|ディレクトリ|説明|
|:------:|:------------:|
|floppy|フロッピードライブ         |
|cdrom|CD-ROMドライブ         |
|cdrecorder|CDライター         |
|zip|Zipドライブ         |
|iso|isoドライブ         |

###/mnt：一時的にマウントされたファイルシステムのマウントポイント
特に深掘りすることなし。

###/opt：アドオンアプリケーションソフトウェアパッケージを置いている
アドオンアプリケーションソフトウェアパッケージのインストール用に予約されているディレクトリ。
ディレクトリの構成は/opt/bin、/opt/docｍ、/opt/include、 /opt/info、/opt/lib、および /opt/man。

ユーザーが呼び出すプログラムは、ディレクトリ/opt/<package>/binまたは/opt/<provider>階層の下に配置する必要がある。
(パッケージにUNIXマニュアルページが含まれている場合は/opt/<package>/share/man、/opt/<provider>階層内または階層の下に配置すおよび/usr/share/man以下のディレクトリ構造と同じ下部構造にする必要がある。)
またホスト固有の構成ファイルを/etc/optにインストールする必要がある。

可変（通常の操作での変更）のパッケージファイルは、/var/optにインストールする。

###/proc：バーチャルファイルシステム用の特別なディレクトリ
特に深掘りすることなし。

###/root：rootユーザーのホームディレクトリ（オプション）
特に深掘りすることなし。

###/run：実行時変数データを置いている
起動後のシステムを説明するシステム情報データが含まれている。このディレクトリの下のファイルは、起動プロセスの開始時にクリア（必要に応じて削除または切り捨て）される。

###/sbin：システムバイナリファイルを置いている
システム管理に使用されるバイナリに加えて、システムの起動、復元、回復、および/または修復に不可欠なバイナリが置かれている。

コマンドがうまく動かなくなったりするので、サブディレクトリを作ってはいけない。

以下のコマンドを保存している。

|コマンド|説明|
|:------:|:------------:|
|fastboot|ディスクをチェックせずにシステムを再起動します         |
|fasthalt|ディスクをチェックせずにシステムを停止します         |
|fdisk|パーティションテーブルマニピュレータ         |
|fsck|ファイルシステムのチェックと修復ユーティリティ         |
|fsck.*|特定のファイルシステムのファイルシステムチェックおよび修復ユーティリティ         |
|getty|ゲッティプログラム        |
|halt|システムを停止するコマンド         |
|ifconfig|ネットワークインターフェイスの構成         |
|init|初期プロセス         |
|mkfs|ファイルシステムを構築するコマンド         |
|mkfs.*|特定のファイルシステムを構築するコマンド         |
|mkswap|スワップ領域を設定するコマンド         |
|reboot|システムを再起動するコマンド         |
|route|IPルーティングテーブルユーティリティ         |
|swapon|ページングとスワッピングを有効にする         |
|swapoff|ページングとスワッピングを無効にする         |
|update|ファイルシステムバッファを定期的にフラッシュするデーモン         |

###/srv：このシステムが提供するサービスのデータを置いている
HTTP、FTPなどのサービス用のデータが入っているディレクトリ。

###/sys：デバイスの情報を置いている
特に深掘りすることなし。

###/tmp：一時ファイルを置いている
一時ファイルを必要とするプログラムのために利用できるように提供されているディレクトリ。

###/usr：大部分のマルチユーザ（全ユーザのための）ユーティリティとアプリケーションを置いている
X Window Systemなどの多くのブログラムがサブディレクトリに格納されている。

ホスト固有の情報や時間の経過に伴い変化する情報は他の場所に保存される（前者は /etc、後者は /var の下）。

以下のようなディレクトリがある。

|ディレクトリ|説明|
|:------:|:------------:|
|/usr|X Window Systemなどの多くのブログラムがサブディレクトリに格納されている。        |
|/usr/bin|Linuxオペレーティングシステムのコア以外の多くの実行ファイルを置いている。        |
|/usr/include|CやC++などのヘッダーファイルを置いている。         |
|/usr/lib|/usr/bin/ や /usr/sbin/ にある実行ファイルの基本となるライブラリ (library) 群(CやC++などのライブラリファイル)を置いている。         |
|/usr/sbin|基本的でないシステム実行ファイル群(管理用コマンド)を置いている。例えば、各種ネットワークサービス用デーモンなど。         |
|/usr/share|デフォルト設定ファイル、イメージ、ドキュメントなどの共有ファイルを置いている。         |
|/usr/src|Linuxカーネルのソースコードを置いている。例えば、カーネルのソースコードとそのヘッダファイル群など。         |
|/usr/X11R6|X Window System, Version 11 Release 6のアプリケーションが置いてある。         |
|/usr/local|/usrディレクトリと似ていてローカルファイルを置いている。         |

###/var ：ログ、メール、プリントスプールなどのいろいろなシステムファイルを置いている

以下のようなディレクトリがある。

|ディレクトリ|説明|
|:------:|:------------:|
|/var|ログ、メール、プリントスプールなどのいろいろなシステムファイルが格納されている。        |
|/var/cache|アプリケーションのキャッシュデータを置いている。        |
|/var/lib|アプリケーションのステータスに関する情報を置いている。         |
|/var/lock|二重起動などをチェックするロックファイルを置いている。         |
|/var/log|ログファイルを置いている。         |
|/var/mail|ユーザの電子メールデータを置いている。         |
|/var/opt|/optｄｈディレクトリにあるパッケージのデータを置いている。         |
|/var/run|起動してからのシステムデータを置いてある。         |
|/var/spool|プロセス待機中のデータを置いている。         |
|/var/tmp|システムリブート用の一時ファイルを置いている。         |

#参考にした、参考になるサイト
- [Linux豆知識 173-FHS（Filesystem Hierarchy Standard）](https://linuc.org/study/knowledge/503/)
- [Filesystem Hierarchy Standard](https://refspecs.linuxfoundation.org/fhs.shtml)
- [hier - 約束事その他の説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/h/hier.7.html)
- [Linuxのディレクトリ構造の一覧](https://gigazine.net/news/20080104_linux_directory_structure/)