1. ホーム
  2. コース一覧
  3. LinuC Level1 v10.0 対策コース(パート1)
  4. FHSとディレクトリ構造

中級

LinuC Level1 v10.0 対策コース(パート1)

LinuC Level1 v10.0 対策コース(パート1)24/39

FHSとディレクトリ構造

こちらの記事ではLinuxにおけるファイルシステム階層構造について解説します。

FHS

FHSFilesystem Hierarchy Standard)は、Linuxファイルシステムの階層構造の標準仕様です。

※ ディスクに保存しているデータをファイルとして管理するシステムのことをファイルシステムといいます。

Linuxディストリビューションは数多く存在し、各ディストリビューションには多少の差異はあるものの、基本的なファイルシステムの構成はどれも同じとなっています。それは、全てのシステムがこのFHSという標準化された仕様に基づいて構築されているからです。

FHSはいくつかのバージョンがありますが、現時点(2022.05.20)での最新バージョンは3.0です。FHSが策定されるまでには、次のような背景がありました。

歴史的変遷

現在のようなディレクトリ構造は、もともとUnix系OSに存在していました。しかし、それらはあくまで慣習のうちのひとつであり、標準的に決まった形はありませんでした。

その結果、ディストリビューションによってどのディレクトリにどんなファイルが配置されているのかが異なっていました。そのような状況では、ディレクトリ構成が分かりにくく、結果的に使いづらくなってしまうという問題が生じていました。

さらには、ソフトウェアのインストールにおける不具合も発生していました。どのディレクトリ配下にインストールされたのかがディストリビューションによってバラバラであったため、インストールが上手くいかない、またはできてもソフトウェアが動作しないということが起こっていました。

そこで、何かしらの標準仕様が必要になりました。はじめはFSSTNDという標準仕様が策定されました。しかし、何度か改訂されていく中でFHSに至りました。

ツリー構造

FHSのもとでは、木構造(ツリー構造)というディレクトリ構造が採用されています。

木を逆さにしたように、頂上に根元(root, ルート)が存在し、その配下に複数のディレクトリやファイルが置かれ、さらにそれらのディレクトリ配下にというように連鎖的に続いていきます。

ツリー構造自体は、Linuxのディレクトリ構造だけでなく、WindowsやMacのディレクトリ構造にも採用されている普遍的な構造です。ツリー構造は、ファイルとディレクトリ(またはフォルダ)を整理し管理するための一般的な方法で、ほとんどの現代のオペレーティングシステムで採用されています。

パーティション

PCには、HDDやSSDなどのディスクドライブ(物理的な記憶領域)が内蔵されています。

ただし、内蔵されているディスクドライブは1台でも、実際にソフトウェア(OS)からHDDやSSDを利用するには、これを パーティション(partition) という論理的な区画に分割して使用します。

さらに、パーティションの中にファイルシステムを作り、そのファイルシステムをマウントします。

※ ソフトウェア(OS)がデバイスを認識し、利用可能な状態にすることを「マウントする」といいます。上記の「ファイルシステムをマウントする」というのは、ソフトウェア(OS)がファイルシステムを通して、ディスクのデータを利用できるようにすることを指します。

パーティションの種類は、コンピュータのブートローダー方式(BIOSまたはUEFI)によって変わります。

BIOSベースのコンピュータ(システム)

ディスクには、最大4つの基本パーティションが作成できます。基本パーティションにはファイルシステムを格納できます。この中で作成可能なデバイスファイル名は、ハードディスクの場合、/dev/sda1/dev/sda4です。

そして、その基本パーティションのうちのひとつを拡張パーティションに割り当てることができます。拡張パーティションには、ファイルシステムではなく、論理パーティションを格納します。

論理パーティションで作成可能なデバイスファイル名は、ハードディスクの場合、/dev/sda5以降になります。

UEFIベースのコンピュータ(システム)

こちらでは、拡張パーティションや論理パーティションを使用しません。他のパーティション管理を目的とする EFIシステムパーティション(ESP) と基本パーティションを利用します。ESPには、ブートローダも含まれています。(後でご紹介します)

ルートディレクトリ (Root directory)

ツリー(階層)構造の頂点に位置するディレクトリです。ツリー(木)構造の根元(root)であるため、ルートディレクトリと呼ばれます。ルートディレクトリは、/ (スラッシュ)で表されます。

また、ルートディレクトリを含むファイルシステムをルートファイルシステムといいます。

Linuxでは、耐障害性などの観点から、異なるパーティションに特定のディレクトリを割り当てることがよく行われます。以下は、ルートディレクトリ直下に存在する主要なディレクトリと、それらがどのような役割を果たしているかについて説明します。

/bin

/bin には、システム管理者や一般ユーザー、もしくはスクリプト内から実行できるコマンドのバイナリ(実行ファイル)が配置されています。

このディレクトリ内にはサブディレクトリ(ディレクトリ内に作成されるディレクトリ)を作成してはならないことになっています。

さらに、以下のようなコマンドが格納されていることを必須としています。

cat, chgrp, chmod, chown, cp, date, dd, df, dmesg, echo,
hostname, kill, ln, login, ls, mkdir, more, mount, mv, ps,
pwd, rm, rmdir, sed, sh, stty, su, sync, true, umount, uname...

/sbin

/sbin には、システム(ファイルシステム)管理やブートローダに関する必須コマンドのバイナリ(実行ファイル)が配置されています。

shutdown, fdisk, fsck, ifconfig,
init, mkfs, mkswap, reboot, route...

/sbin ディレクトリには、PCの起動時に重要な役割を果たすブートローダに関するコマンドが含まれています。PCを起動するときには、まず電源を入れます。

次にブートローダ(boot loader)というソフトウェアを起動し、HDDやSSDなどのディスクデバイスに保存されているカーネルをメモリ上に読み出します。

この時点でファイルシステムが利用可能な状態になるので、カーネルは最初のプロセス(PID: 1)としてinit(もしくはsystemd)を実行します。init(systemd)は、後続する必要な子プロセスを実行します。

/boot

/boot には、システムの起動に必要なファイルが含まれています。これには、Linuxカーネル(vmlinuz)、初期RAMディスクイメージ(initrd)、ブートローダ(たとえばGRUB)の設定ファイルなどがあります。

/dev

/dev には、Linuxシステム上のすべてのデバイスを表す特殊なファイル、通常「デバイスファイル」と呼ばれるものが配置されています。これには、ハードドライブ、端末デバイス、音声デバイスなど、システム上のほぼすべてのハードウェアデバイスが含まれます。

※ デバイスファイルやスペシャルファイルに関しましては『Linux基礎コース > 権限管理の基本』の記事の中で解説しています。そちらも是非ご覧ください。

/etc

/etc には、システム全体の設定ファイルやスクリプトが保存されます。ただし、実行可能なバイナリファイルは、原則としてこのディレクトリには含まれません。また、/etc ではサブディレクトリにファイルを格納することが推奨されています。

/opt の設定ファイルは、/etc/opt に置かれています。

/home

/home は各ユーザーのホームディレクトリを格納する場所で、個々のユーザーが自由にファイルを保存できます。ユーザーごとのアプリケーション設定は、「ドットファイル」と呼ばれる、名前が"."で始まるファイルに保存されます。また、多数の設定ファイルを持つアプリケーションは、「ドットディレクトリ」("."で始まるディレクトリ)を作成し、その中に設定ファイルを格納することもあります。これらのファイルやディレクトリは通常、lsコマンドなどで隠されています。

/lib

/lib には、システムを起動するために必要な共有ライブラリが保存されます。さらに、一部のシステムでは、'/lib<qual>'という命名規則でディレクトリが存在します。ここで、'<qual>'はシステムアーキテクチャを表し、'32'や'64'などの数値が入ります。これらのディレクトリには、該当するビット数のシステムで使用される特定の共有ライブラリが保存されます。

※ 共有ライブラリとは、プログラム実行時に読み込まれる、複数プログラム間で共有されるライブラリのことです。共有ライブラリは、lib.◯◯.so.△△というファイル名です。

lddコマンドを使用することで、どのプログラムがどのような共有ライブラリを読み込むのかを調べることもできます。

# catコマンド(実行ファイル)を例に見てみましょう。
# まず、実行ファイルのパスを調べます。
which cat
/usr/bin/cat
# lddコマンドで検索します。
# 実行結果: [共有ライブラリ名] => [ライブラリの絶対パス] (16進数のアドレス)
ldd /usr/bin/cat
linux-vdso.so.10x00007fffbcdae000libc.so.6 => /lib/x86_64-linux-gnu/libc.so.60x00007f5bad467000/lib64/ld-linux-x86-64.so.20x00007f5bad672000

実行結果から、catコマンドは linux-vdso.so.1, libc.so.6, /lib64/ld-linux-x86-64.so.2 を参照していることが分かります。

/media

/media は、USBドライブ、外付けハードドライブなどのリムーバブルメディアデバイスのマウントポイントが配置されています。

/mnt

一時的にファイルシステムをマウントするポイントとなるディレクトリで、必要に応じて利用されます。

/opt

追加のアプリケーションソフトウェアパッケージをインストールするための場所です。システムのパッケージ管理ツール(APT、RPM、yum など)で管理されていないサードパーティーのアプリケーションやソフトウェアパッケージのためのものです。

/root

rootユーザーのホームディレクトリです。

/run

システムが起動した時点からの情報が格納されるディレクトリです。かつては/var/runがこの役割を担っていましたが、現在では/var/runは/runのシンボリックリンクとなり、主に/runが利用されます。また、PIDファイル(<プログラム名>.pid)もこのディレクトリに格納されます。

/srv

Webサーバーのデータやスクリプト、FTPサーバーが提供するデータ、バージョン管理システムのリポジトリなど、このシステムが提供するサイト固有のデータを格納しています。

/tmp

一時的(temporary)なファイルを配置するためのディレクトリです。ここに格納されている一時ファイルは、システムを再起動すると消去されます。

なお、/tmp では、システム内の全ユーザーが読み書き権限を持つことが可能です。

/proc

カーネルやメモリ、プロセス(process)情報が保存されるディレクトリです。

/proc配下に作成されるファイルは、ファイルシステム上ではなく、メモリ上に作成される仮想的なファイルで、ここにはプロセス情報をはじめとした、CPU情報(/proc/cpuinfo)、デバイス情報(/proc/devices)、メモリ情報(/proc/meminfo)などのさまざまなシステム情報が格納されます。

/usr

/usr は、ファイルシステムにおいて非常に重要なディレクトリで、ここには読み取り専用(read-only)のシステム内の共通プログラムが配置されています。

また、以下のようなサブディレクトリが必須とされています。

サブディレクトリ説明
/usr/binユーザーが利用するコマンド
/usr/libライブラリ
/usr/localローカルで管理するファイル
/usr/sbinシステム管理用のコマンド
/usr/shareアーキテクチャに依存しないデータ

ほとんどの場合、一般ユーザーが実行するコマンド(実行ファイル)は/usr/binに配置されています。

/var

システムが起動している最中に書き込みが行われるファイルが配置されるディレクトリです。

また、以下に挙げるようなサブディレクトリも必須とされています。

サブディレクトリ説明
/var/cacheアプリケーションプログラムのキャッシュ
/var/libライブラリ
/var/localローカルで管理するファイル
/var/lockロックファイル
/var/logログファイル
/var/opt可変データ
/var/runPIDやその他システム情報
/var/spoolスプールデータ
/var/tmp一時ファイル

まとめ

ここでは、FHSについて詳細に解説しました。FHSは、Linuxにおけるディレクトリ構成やファイルシステムの理解に不可欠です。

それぞれのディレクトリがどのような役割を担い、どこに配置されているのかを理解することが重要です。実際に各ディレクトリを探索してみることで、より深い理解を得ることができるでしょう。

記事の内容は理解できましたか?