Linuxとかの、/etcとか/var/logとかいうディレクトリってなんだ？

# はじめに

Linux等の、\*Nix系OSを使い始めた人向けに。

Linuxを初めて触った時や、まだ慣れない時に、「なにがどこにあるかよくわからない」とか「そもそもなにがあるかわからない」とか、「ログを読め」とか言われるけどログってどこにあるの？？？とか思うことがあると思います。

で、慣れてくると「なんかログは`/var/log`ディレクトリにあるらしい」とか、「設定ファイルは`/etc`にあるらしい」とかをなんとなく知ったり、覚えたりしていきます。

このディレクトリについてのお話。


# Filesystem Hierarchy Standard

これ、「Filesystem Hierarchy Standard」という名前で標準化されています。

[Filesystem Hierarchy Standard / Wikipedia](https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard)

Wikipediaより。

> Filesystem Hierarchy Standard(ファイルシステム・ヒエラルキー・スタンダード、FHS、ファイルシステム階層標準）は、Linuxを含むUNIX系オペレーティングシステムでの主なディレクトリとその内容を定めたものである。

現在のFilesystem Hierarchy Standardのバージョンは、3.0です。

[Filesystem Hierarchy Standard Specifications Archive](http://refspecs.linuxfoundation.org/fhs.shtml)

[The Filesystem Hierarchy Standard (FHS)](https://wiki.linuxfoundation.org/lsb/fhs)

[Filesystem Hierarchy Standard](http://www.pathname.com/fhs/)

バージョン 3.0の仕様から、いくつか見てみましょう。

[Filesystem Hierarchy Standard Version 3.0](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html)

* `/` … ルートファイルシステム [The Root Filesystem](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03.html)
* `/home` … ユーザーのホームディレクトリ [User home directories (optional)](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s08.html)
* `/etc` … 設定ファイルを置くディレクトリ [Host-specific system configuration](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s07.html)
* `/bin` … すべてのユーザーで必要となるコマンドを置くディレクトリ[Essential user command binaries (for use by all users)](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s04.html)
* `/usr/bin` … 多くのユーザーが使うコマンドを置くディレクトリ [Most user commands](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch04s04.html)
* `/var/log` … ログファイルを置くディレクトリ [Log files and directories](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch05s10.html)

などなど。

この仕様書の目次（の他にも、Wikipediaなど）に書かれているディレクトリをさらっと眺めてみるだけでも、「このディレクトリ、見たことある」といった印象を持ったりするのではないでしょうか？

また、`yum`や`apt`といった、各Linuxディストリビューションのパッケージマネージャーを使ってインストールされるパッケージなどもFilesystem Hierarchy Standardに従ったものが多いので、これに慣れるとなんとなく「設定ファイルは`/etc/foo`にあるんだろう」とか、「ログは`/var/log/bar`にあるんだろう」といった推測が立てられるようになり、理解が早くなりますね。

自分でファイルを置いたり作ったりする場合も、このあたりのディレクトリ構成を意識するようにすると、他の人が後から見ても意図が伝わりやすかったりするでしょう。


# 環境変数`PATH`

ここからは、少しオマケ的に。

よく「`PATH`を通す」とか言われるやつですね。この環境変数に`:`区切りで設定したディレクトリ内にあるコマンドは、シェルがパスを解決することができます。

例えばVagrantで起動した仮想マシン（CentOS 7）ですが、環境変数`PATH`の内容を表示してみます。

```shell
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin
```

これを見ると、`/usr/local/bin`や`/usr/local/sbin`配下にもパスが通っていて、デフォルトではこれらのディレクトリ内にはなにもないのですが、ユーザーがコマンドを配置することで全体で使える共通的なコマンドをインストールすることができます。

```shell
$ ll /usr/local/bin
total 0
```

`docker-compose`とかが、`/usr/local/bin`ディレクトリを使ったインストール例になっていますね。

[Install Docker Compose](https://docs.docker.com/compose/install/)

```shell
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

一般ユーザーに、どのようなパスが設定されるのかは`$HOME/.bashrc`、`$HOME/.bash_profile`、`/etc/bashrc`、`/etc/profile`などを見ることになります。

ところで、`root`ユーザーだと環境変数`PATH`に設定されている内容が、少し変わります。

```shell
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
```

このあたりですね。

```shell
/sbin
```

これは、`/sbin`がシステム管理者用のコマンドを置くディレクトリだからですね。

[System binaries](http://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s16.html)

あとは、`/usr/local/sbin`が`/usr/local/bin`の前にあるなど、細かく違ったりもします。

```shell
/usr/local/sbin:/usr/local/bin
```


# `systemctl` / `journalctl`でサービスの状態やログを見る

ログファイルを見る以外にも、サービス（デーモンプロセス）の状態を確認したり、システムのログを確認したりすることが`systemctl`、`journalctl`を使って行うことができます。

サービスの状態を確認する。

```shell
$ sudo systemctl status [ユニット名]
```

サービスやOSの出力したログを確認する。

```shell
# サービスユニットを指定してログを見る
$ sudo journalctl -u [ユニット名]

# カーネルログを見る
$ sudo journalctl -k

# 全ログを出力
$ sudo journalctl
```

このあたりの情報を押さえつつ、ログを見たりしつつ、少しずつLinuxに慣れて強くなっていくとよいでしょう。

そして、より強い相手に立ち向かっていきましょう。