寒月記

住みにくいところをどれほどか寛容て

Filesystem Hierarchy Standard (FHS) かんたんなまとめ

TL;DR

  • FHS は UNIX 系 OS のファイル・ディレクトリ配置のガイドライン
    • FHS によりソフトウェアやユーザーはファイル, ディレクトリの位置などを推測できる
    • OS のディストリビューションやバージョンによって一部仕様は異なる
  • 各種ファイル配置などを考える上で開発者は読んでおいた方が良さそう
  • ユーザーも /etc が設定ファイル, /var がログなど動的に更新される可変データ, /usr が read-only の第二の階層, /usr/local がホスト固有のデータを格納する第三の階層, というくらいは覚えておいてよい
  • 正直原典の PDF は後で読めばよい, 先に wiki なり RedHat の記事なり LPIC で勉強するなりがお勧め

Introduction

 Linux を触り始めて、まず戸惑うことの一つが、「どこに何があるかわからない」ではないでしょうか。
私はそうでした。というか恥ずかしながらちょっと前までそうでした。
 初めのうちは、業務で触るファイル類は決まったものが多く、それらの場所さえ覚えておけば意外と何とかなります。
しかし、より少し大きめのソフトウェアなり開発なりに携わるようになると、そうも言ってられなくなります。
障害調査やデバッグなどで, OS のログやファイル類を追うことも珍しくありません。

そんなとき, Linux のディレクトリ階層がどうなっているかを知っていると, どこを調べればよいかの見当がつきやすく, 非常に役立ちます。

そこで, 今回 UNIX 系 OS のファイル・ディレクトリ階層の標準を定義している, Filesystem Hierarchy Standard (FHS) を読んでみました。
2019/10/28 現在の最新版は 2015/6/3 にリリースされた FHS 3.0 です。

重要と思った点や雑感なんかを書き留めておきます。

Linux教科書 LPICレベル1 Version5.0対応

Linux教科書 LPICレベル1 Version5.0対応

[試して理解]Linuxのしくみ ?実験と図解で学ぶOSとハードウェアの基礎知識

[試して理解]Linuxのしくみ ?実験と図解で学ぶOSとハードウェアの基礎知識

FHS 3.0 の内容

FHS とは

 Introduction でも書きましたが, 改めて FHS とは,

  • UNIX 系 OS のファイル・ディレクトリ階層の標準を定義
  • 様々なソフトウェア・ハードウェアベンダ*1から構成された非営利組織である Linux Foundation が策定

といったものです。

公式サイト*2 (https://refspecs.linuxfoundation.org/fhs.shtml) から PDF, HTML, テキストなどの形式で入手可能です。

FHS では, ファイルを shearable vs. unshearable * static vs. variable の 2 × 2 = 4象限で区別しています。
shearable は複数ホスト間で共有できるもの, variable は動的に内容が書き換わるようなもの, といったイメージでまずは良いかと思います。

目次

FHS 3.0 の目次は次のようになっています。

  1. Introduction
  2. The Filesystem
  3. The Root Filesystem
  4. The /usr Hierarchy
  5. The /var Hierarchy
  6. Operating System Specific Annex
  7. Appendix

各大項目の下に中小項目があるのですが, きりがないのであまり深く追いません。
主要なところだけ挙げておくと, 3, 4, 5 ではそれぞれ /, /usr, /var 配下のサブディレクトリ, ファイルなどについて解説しています。
/usr, /var に一章ずつ割いており, 重要なディレクトリであることが分かります。

本記事では全てを拾い上げず, 一部抜粋して紹介します。

3. The Root Filesystem

 第3章の The Root Filesystem では, / 配下のディレクトリの機能について説明しています。
この章で, / の直下には次のディレクトリが必須と書かれています*3

  • / 直下の必須ディレクトリ:
    • bin: 主要コマンドのバイナリ
      • e.g., cat, ls
    • boot: ブートローダの静的ファイル
      • e.g., grub/, vmlinuz-4.4.0-166-generic
    • dev: デバイスファイル
      • e.g., null, zero, sda
    • etc: ホスト固有のシステム設定ファイル
      • e.g., hosts, networks
    • lib: 重要な標準ライブラリ及びカーネルモジュール
    • media: リムーバブルメディアのマウントポイント
      • e.g., cdrom/
    • mnt: 一般的なファイルシステムのマウントポイント
    • opt: オプションでインストールしたアプリケーションソフトウェアパッケージ
    • run: 実行中プロセスの関連データ
    • sbin: システム管理に用いるシステムバイナリ
      • e.g., fdisk, lvm, mdadm
    • srv: システムによって提供されるサービスのデータ
    • tmp: 一時ファイル
    • usr: 第二の階層, read-only の共有可能ファイル
    • var: 動的に内容が変化するファイル
      • e.g., log/

/bin/etc, /sbin は例を見ると分かりやすいのではないでしょうか。
いくつか, 名が体を表すものもあります。
/etc は名前から推測しづらいですが, 基本的に静的な設定ファイルを置く場所です。

手元の Ubuntu 16.04 と比べてみる

 説明だけでは想像しづらい部分は, 手元の Ubuntu 16 と比べてみます。
私の Ubuntu では, / 直下には以下ディレクトリが存在します*4

[kangetsu@ubuntu16 ~ Mon Oct 28 22:37:23]
$ ls -lAF / | grep -e '^d' | awk '{print $9}'
bin/
boot/
dev/
etc/
home/
lib/
lib64/
lost+found/
media/
mnt/
opt/
proc/
root/
run/
sbin/
snap/
srv/
sys/
tmp/
usr/
var/
[kangetsu@ubuntu16 ~ Mon Oct 28 22:38:35]

確かに, 必須と書かれたものはすべて存在しました。
ただ, 他にもいくつかディレクトリが存在しています。
これは FHS でも説明はされていて, 「必須ではないがオプションとして作成してもよいもの」や, 第6章で 「OS 固有のディレクトリ」などとして紹介されているものもあります。

/usr

続いて, 「第二の階層」などという分かりづらい必須ディレクトリ, /usr の中身を見てみます。

[kangetsu@ubuntu16 ~ Mon Oct 28 23:16:35]
$ tree -L 1 /usr
/usr
├── bin
├── games
├── include
├── lib
├── local
├── sbin
├── share
└── src

8 directories, 0 files
[kangetsu@ubuntu16 ~ Mon Oct 28 23:16:46]

ここには /bin, lib, sbin など, 見慣れたディレクトリが存在します。
ただし, これらの中身は / 直下にあった同名ディレクトリとは異なります。

例えば, cat ls/bin にあり, sshxargs/usr/bin 以下にあります。
より具体的に説明すると, /bin にはシングルユーザーモードで利用するコマンドを置く と定義されます。
シングルユーザーモードとは, システムメンテナンスなどで利用する, 必要最小限のデーモンや機能だけを動かした状態で操作するモードです。
設定ミスや, インストールしたアプリケーションのバグなどで OS が通常起動では正常に動かない場合など, このモードを使ってメンテナンスします。
このときに, /bin 以下のコマンドは使え, /usr/bin 以下のコマンドは使えない, ということになります。

/usr/local

続いて, 「第三の階層」と言われる /usr/local ディレクトリです。

[kangetsu@ubuntu16 ~ Tue Oct 29 00:10:34]
$ tree -L 1 /usr/local
/usr/local
├── bin
├── etc
├── games
├── include
├── lib
├── man -> share/man
├── sbin
├── share
└── src

9 directories, 0 files
[kangetsu@ubuntu16 ~ Tue Oct 29 00:30:07]

再び binsbin, etc なんかが存在します。
こちらは, 「公式パッケージ管理されない, ローカルにインストールしたファイル類」を置きます。
つまり, /usr/local/bin の場合なら, yumapt などでインストールしない, 自作コマンドなどが一例となります。
apt 以外でソフトウェアインストールなどしていないので, 現在の私の Ubuntu 16 ではこれらサブディレクトリの中身はほとんど空でした((会社のマシンでは PG が作成したコマンドやツールが山ほどあるため, むしろ /usr/local ディレクトリ下を操作することがほとんどです))。

/var

/var も重要なディレクトリで, variable = 内容が変化するようなファイルを置きます。

[kangetsu@ubuntu16 ~ Tue Oct 29 01:27:36]
$ tree -L 1 /var
/var
├── backups
├── cache
├── crash
├── lib
├── local
├── lock -> /run/lock
├── log
├── mail
├── opt
├── run -> /run
├── snap
├── spool
└── tmp

13 directories, 0 files
[kangetsu@ubuntu16 ~ Tue Oct 29 01:29:11]

例えばサブディレクトリとして log/ がありますが, ログファイルはアプリケーションが動作している間中書き込みが続くものなので variable と言えます。
lock ファイルも, ここではシンボリックリンクになっていますが, プログラムの状態によって変わる, variable なファイルですね。

まとめ・雑感

以上, ごく簡単にですが FHS の内容に触れました。
「Linux のどこに何があるか, どこに何を置くべきかわからない」という方は, こうした標準が定められていることだけでも覚えておくと, 必要になったときに深く調べられると思います。

また, 開発者だけでなくユーザーとしても,

  • /etc に設定ファイルがある
  • /var にログなどの可変ファイルがある
  • /usr, /usr/local が第二, 第三の階層として利用される

といったことを覚えておくと調査時にスムーズになるし, ファイルの配置も記憶に残りやすいと思います。

ところで, ここまで FHS の原文と言えるものを読んだ結果を紹介していますが, 現時点の私の感想としては, 「FHS の原文を急いで読む必要はなさそう」というものです。
確かにこれが一次文献と呼べるもので網羅的でもあるのですが, 「解説」という観点からは少し物足りなさがあります。
あくまで使用を記載した文書であり, 「実際にはどう使われているか」「それぞれの類似したディレクトリの差異は」などに文字数を割いているわけでは必ずしもありません。
このため, とりあえず実務で役立つ知識として学びたい, という方は、まずは LPIC などの教材, Linux Foundation に参加している企業が個別に書いている解説記事*5, wiki なんかを見てからでも良いと思います。
「解説」という意味では, かえってこれらの方が頭に入りやすいものになっていたりすると感じます。

もちろん, すでにバリバリ実装や勉強していて基本はばっちり, という方が読む分には, 一次文献なので多くの発見もあると思います。

以上, 少々尻切れトンボ感はありますが, FHS の紹介でした。
文中で紹介したリンクから入手できるので, 興味のある方は 2章まではすぐ読めると思うのでざっと目を通してみるとおもしろいと思います。

*1:日本企業も結構な数が参加しています。https://www.linuxfoundation.org/membership/members/

*2:配付ページは, え, 公式? というくらいシンプルなデザインですが, ここなんです。https://wiki.linuxfoundation.org/lsb/fhs-30 から飛べます

*3:ディレクトリの説明は分かりやすさ優先で意訳しています。また, 例が分かりやすいものは例示しています

*4:ディレクトリのみ抽出

*5:例えば RedHat が出しているものはすぐ見つかると思います