Linuxのディレクトリ構造(FHS)完全ガイド

Linuxのディレクトリ構造は「Filesystem Hierarchy Standard(FHS)」という標準規格で定義されているいます。これを理解しているかどうかで、トラブルシューティングの速度やシステム管理の質が大きく変わります。

この記事では、実務で頻繁に触れるディレクトリを中心に、なぜそこに配置されるのか現場でどう使われているのかを徹底的に解説します。教科書的な知識だけでなく、現場で死なないための実践知識を身につけてほしい。

FHS(Filesystem Hierarchy Standard)とは

FHSは、Linuxおよびその他のUnix系OSにおけるディレクトリ構造の標準規格です。Red Hat系、Debian系を問わず、ほぼすべてのLinuxディストリビューションがこの規格に準拠しています。

この標準があるおかげで、異なるディストリビューションでも「設定ファイルは/etcにある」「ログは/var/logにある」という共通認識が成り立ちます。これがなければ、ディストリビューションごとに構造を覚え直す羽魔になっていただろう。

なぜFHSを学ぶ必要があるのか

理由は明確です。実務では「どこに何があるか」を知っていることが前提だからです。

  • 障害発生時、ログファイルの場所がすぐにわからなければ原因究明が遅れる
  • バックアップ対象のディレクトリを正しく選定できなければ、復旧不可能になる
  • 誤って重要なシステムファイルを削除すれば、OSが起動しなくなる

FHSを理解していれば、こうしたリスクを大幅に減らせます。

ルートディレクトリ(/)配下の主要ディレクトリ

Linuxのディレクトリ構造は、ルートディレクトリ(/を頂点とした階層構造になっています。ここから、各ディレクトリの役割を見ていきましょう。

/bin – 基本コマンド用バイナリ

/binには、システム起動時や緊急時に必要な基本コマンドが格納されています。

$ ls /bin
bash  cat  chmod  cp  date  echo  grep  ls  mkdir  mv  ps  rm  sh  ...

lscpcatなど、シングルユーザーモードでも使える必須コマンドがここに入っています。すべてのユーザーが使用できるという点が重要です。

現場での注意点

最近のディストリビューション(CentOS 7以降、Ubuntu 16.04以降など)では、/bin/usr/binへのシンボリックリンクになっています。これはUsrMergeと呼ばれる変更で、歴史的な理由で分かれていたディレクトリを統合する流れです。

$ ls -ld /bin
lrwxrwxrwx 1 root root 7 Jan 15 10:23 /bin -> usr/bin

とはいえ、/binという概念自体は依然として重要なので、両方の知識を持っておくべきです。

/sbin – システム管理用バイナリ

/sbinには、システム管理者(root)が使う管理用コマンドが格納されています。

$ ls /sbin
fdisk  fsck  halt  ifconfig  init  iptables  reboot  shutdown  ...

shutdownrebootiptablesなど、システム全体に影響を与えるコマンドがここに入っています。

/binと/sbinの使い分け

  • /bin: 一般ユーザーも使う基本コマンド(lscatなど)
  • /sbin: root権限が必要な管理コマンド(shutdowniptablesなど)

ただし、この区別も絶対的なものではなく、最近は/usr/sbinへのシンボリックリンクになっている場合が多い。

/etc – 設定ファイル

実務で最も頻繁に触れるディレクトリの一つ/etcです。システム全体の設定ファイルがここに集約されています。

$ ls /etc
fstab  group  hostname  hosts  passwd  ssh/  nginx/  cron.d/  ...

主要な設定ファイルを以下に示します。

ファイル/ディレクトリ役割
/etc/fstabファイルシステムのマウント設定
/etc/hostsホスト名とIPアドレスの対応表
/etc/passwdユーザーアカウント情報
/etc/groupグループ情報
/etc/ssh/SSH関連の設定
/etc/cron.d/cron定期実行の設定

現場での注意点

/etc配下の設定ファイルを編集する前には、必ずバックアップを取ることです。これは鉄則です。

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup_$(date +%Y%m%d)

また、設定ファイルの変更後は必ず構文チェックを行います。たとえばNginxなら以下のコマンドになります。

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

構文エラーがあるまま再起動すると、サービスが起動しなくなります。本番環境では致命的なので、必ずチェックする習慣をつけましょう。

/home – ユーザーのホームディレクトリ

各ユーザーの個人ファイルが格納される場所です。

$ ls /home
alice  bob  charlie

各ユーザーは/home/ユーザー名配下に自由にファイルを配置できます。一般ユーザーが書き込み権限を持つのは、基本的に自分のホームディレクトリと/tmpくらいです。

rootのホームディレクトリは/root

注意すべきは、rootユーザーのホームディレクトリは/home/rootではなく/rootであるという点です。

$ echo $HOME  # rootでログインしている場合
/root

これはセキュリティ上の理由で、root専用の領域として分離されています。

/var – 可変データ

/varは「variable(可変)」の略で、システム稼働中に内容が変化するデータが格納されます。

$ ls /var
cache  lib  lock  log  mail  run  spool  tmp

特に重要なのは以下のディレクトリです。

ディレクトリ役割
/var/log/各種ログファイル
/var/spool/メールやプリントジョブの一時保管
/var/lib/アプリケーションの状態データ
/var/cache/キャッシュデータ

/var/log – ログファイルの宝庫

トラブルシューティングの第一歩は、必ずログを見ることです。

$ ls /var/log
auth.log  dmesg  kern.log  messages  nginx/  syslog  ...

主要なログファイルは以下の通りです。

  • /var/log/messages(Red Hat系)または /var/log/syslog(Debian系): システム全般のログ
  • /var/log/auth.log: 認証関連のログ(SSH接続など)
  • /var/log/dmesg: カーネルのブートメッセージ
  • /var/log/nginx/: Nginxのアクセスログとエラーログ

実務の落とし穴: ログのディスク容量圧迫

/var/logは放置すると肥大化しやすい。ディスク容量を圧迫して障害を引き起こす典型的なパターンです。

$ du -sh /var/log/*
15G     /var/log/nginx
2.3G    /var/log/messages
512M    /var/log/auth.log

ログローテーション(logrotate)が正しく設定されているか、定期的に確認する必要があります。

cat /etc/logrotate.d/nginx

/tmp – 一時ファイル

/tmpは、一時ファイルを保存するための領域です。すべてのユーザーが書き込み可能ですが、システム再起動時にクリアされることが多い

$ ls -ld /tmp
drwxrwxrwt 12 root root 4096 Jan 31 10:00 /tmp

パーミッションの最後にあるtスティッキービットと呼ばれ、「自分が作成したファイルは自分しか削除できない」という制限を意味します。

現場での注意点

/tmpに重要なデータを置いてはいけません。再起動で消える可能性があります。また、ディスク容量が逼迫している場合、/tmpの肥大化が原因のこともあるので、定期的にチェックしましょう。

/usr – ユーザープログラム

/usrは「Unix System Resources」の略で、ユーザーがインストールしたプログラムやライブラリが格納されます。

$ ls /usr
bin  include  lib  lib64  local  sbin  share  src

主要なサブディレクトリは以下の通り。

ディレクトリ役割
/usr/bin/一般ユーザー向けコマンド
/usr/sbin/システム管理コマンド
/usr/lib/共有ライブラリ
/usr/local/管理者が手動でインストールしたソフトウェア

/usr/local – 手動インストール用

パッケージマネージャー(yumapt)でインストールしたソフトウェアは/usr/bin/usr/libに配置されます。一方、ソースからビルドしたソフトウェアは/usr/local配下に配置するのが慣例です。

./configure --prefix=/usr/local
make
sudo make install

こうすることで、「パッケージ管理されているもの」と「手動でインストールしたもの」を明確に区別できます。

/opt – オプションパッケージ

/optは、サードパーティ製のアプリケーションを丸ごと配置するためのディレクトリです。

$ ls /opt
google  aws  teamviewer

たとえば、Google Chromeや商用ソフトウェアがここにインストールされることが多いです。/usr/localとの違いは、/optアプリケーション単位でディレクトリを切るという点になります。

/boot – ブート関連ファイル

/bootには、システム起動に必要なファイルが格納されています。

$ ls /boot
grub/  vmlinuz-5.10.0-21-amd64  initrd.img-5.10.0-21-amd64
  • vmlinuz-*: Linuxカーネル本体
  • initrd.img-* または initramfs-*: 初期RAMディスク
  • grub/: GRUBブートローダーの設定

現場での注意点

/bootのディスク容量不足は、カーネルアップデートの失敗を引き起こします。古いカーネルが残り続けると容量を圧迫するので、定期的にクリーンアップが必要です。

$ df -h /boot
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       512M  320M  192M  63% /boot

使用率が80%を超えたら要注意です。古いカーネルを削除して空き容量を確保しましょう(ただし、現在使用中のカーネルは削除してはいけません)。

/dev – デバイスファイル

/devには、ハードウェアデバイスを表す特殊ファイルが格納されています。

$ ls /dev
sda  sda1  sda2  null  zero  random  urandom  tty  ...

主要なデバイスファイルは以下の通り。

デバイス役割
/dev/sda最初のSATA/SCSIディスク
/dev/sda1最初のディスクの第1パーティション
/dev/nullすべての出力を破棄するブラックホール
/dev/zero無限にゼロを出力
/dev/random乱数生成

現場での使用例

不要な出力を捨てたいときは/dev/nullにリダイレクトします。

command > /dev/null 2>&1

これは標準出力と標準エラー出力の両方を破棄する定番の書き方です。

/proc – プロセス情報

/procは、カーネルやプロセスの情報を提供する仮想ファイルシステムです。実際にディスク上にファイルが存在するわけではなく、カーネルが動的に生成しています。

$ ls /proc
1  100  2  3  cpuinfo  meminfo  uptime  ...

数字のディレクトリはプロセスID(PID)を表し、各プロセスの情報が格納されています。

よく使う/proc配下のファイル

cat /proc/cpuinfo

CPUの情報が表示されます。

cat /proc/meminfo

メモリの使用状況が表示されます。

$ cat /proc/uptime
123456.78 234567.89

システムの稼働時間(秒単位)が表示されます。

/sys – システム情報

/sys/procと同様に、カーネルやデバイスの情報を提供する仮想ファイルシステムです。

$ ls /sys
block  bus  class  dev  devices  firmware  kernel  module  power

主にデバイスドライバーやカーネルモジュールの情報を取得するために使われます。

/mnt と /media – マウントポイント

  • /mnt: 管理者が一時的にファイルシステムをマウントする場所
  • /media: USBメモリやCD-ROMなど、リムーバブルメディアが自動マウントされる場所
sudo mount /dev/sdb1 /mnt

このように、外部ディスクを一時的にマウントする際は/mntを使うことが多いです。

/srv – サービス用データ

/srvは、WebサーバーやFTPサーバーなど、各種サービスが提供するデータを配置する場所です。

$ ls /srv
www  ftp

ただし、実務では/var/wwwを使うことの方が多いです。FHSでは/srvが推奨されていますが、慣習的に/var/wwwが広く使われています。

実務の落とし穴

ここでは、初学者が陥りやすいディレクトリ関連のミスをまとめます。

1. /tmpに重要データを置いてしまう

最もよくあるミスです。/tmpは再起動でクリアされる可能性があるため、重要なデータは絶対に置いてはいけません。

一時的な作業ファイルであっても、消えては困るものは/home/ユーザー名配下に置くべきです。

2. ログローテーションの設定漏れ

/var/logのログファイルが肥大化し、ディスク容量を圧迫します。本番環境では致命的になります。

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   48G  2.0G  96% /

使用率が95%を超えたら即座に対処が必要です。logrotateの設定を見直し、古いログを削除またはアーカイブしましょう。

3. /etc配下の設定ファイルをバックアップせずに編集

バックアップなしで設定ファイルを編集するのは自殺行為です。

sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup

必ずバックアップを取ってから編集すること。さらに、バージョン管理システム(Git)で管理するのが理想です。

4. /usr/localと/optの使い分けができていない

  • ソースからビルド/usr/local
  • サードパーティ製パッケージ/opt

この使い分けができていないと、後からどこに何をインストールしたのか分からなくなります。

5. /bootの容量不足

カーネルアップデートが失敗する原因の大半は、/bootの容量不足です。

sudo apt autoremove  # Debian系
sudo yum autoremove  # Red Hat系

古いカーネルを削除して空き容量を確保しましょう。

まとめ

Linuxのディレクトリ構造(FHS)は、実務で確実に必要な知識です。この記事で解説した主要ディレクトリの役割を以下にまとめます。

  • /bin: 基本コマンド(一般ユーザーも使用)
  • /sbin: システム管理コマンド(root権限が必要)
  • /etc: システム全体の設定ファイル
  • /home: ユーザーのホームディレクトリ
  • /var: 可変データ(ログ、キャッシュなど)
  • /tmp: 一時ファイル(再起動で消える可能性あり)
  • /usr: ユーザープログラムとライブラリ
  • /opt: サードパーティ製アプリケーション
  • /boot: システム起動に必要なファイル
  • /dev: デバイスファイル
  • /proc: プロセス情報(仮想ファイルシステム)

この知識があれば、トラブルシューティング時にどこを見ればいいかが即座にわかります。設定ファイルの配置場所も迷わなくなるでしょう。