🐧
Linuxのディレクトリ構造ガイド
Linuxのファイルシステムは、FHS(Filesystem Hierarchy Standard)という標準に基づいて設計されています。本記事では、主要ディレクトリの役割と代表的な中身、実務での使い方や注意点、ディストリビューション差や近年の変化(/usr マージなど)まで、まとめて解説します。
注意:
- ルート階層(/)直下は、システムが期待する構造です。用途に応じて正しい場所を選びましょう。
- 設定は基本 /etc、ログは /var/log、ユーザーのデータは /home、管理者の tools は /usr/local や /opt が基本です。
ルート(/)
- すべてのパスの起点(ルートディレクトリ)。
- ここにある各サブディレクトリはシステムの役割別に分かれています。
- 直接ファイルを置くことは通常ありません(メンテ用一時ファイルは /root か /tmp などへ)。
/bin, /sbin, /usr/bin, /usr/sbin(実行ファイル)
- /bin: 一般ユーザー・シングルユーザーモードでも必要な基本コマンド(例: sh, ls, cp)
- /sbin: 主に管理者向けの基本管理コマンド(例: ip, mount, fsck)
- /usr/bin: 一般的なアプリケーションの大半(例: git, python, gcc)
- /usr/sbin: 管理者向けコマンド(例: nginx, apachectl, useradd)
近年の変化(/usr マージ):
- 多くのディストリビューションで /bin → /usr/bin、/sbin → /usr/sbin などへ統合(シンボリックリンク化)。
- 目的: 重複解消と単純化、initramfs などの事情での一貫性向上。
- 見かけは残っていても実体は /usr 側、という環境が増えています。
/usr(ユーザー空間の読み取り専用相当)
- OS ベンダー提供のアプリケーションやライブラリ、ドキュメントなどが集約。
- 代表的な下位ディレクトリ:
- /usr/bin, /usr/sbin: 実行ファイル
- /usr/lib, /usr/lib64: ライブラリ、プラグイン、pkgconfig など
- /usr/include: ヘッダファイル
- /usr/share: アーキ非依存データ(man, locale, icons など)
- /usr/local: 管理者が独自に入れるもの(下記参照)
- 原則、パッケージマネージャで管理され、手動編集は最小限に。
/usr/local(ローカルインストール領域)
- 管理者がパッケージ管理外で導入するソフトのための領域。
- 下位構造は /usr と同様(bin, sbin, lib, include, share 等)。
- 利点:
- パッケージ配布物(/usr)と明確に分離できる
- バックアップや移行の単位にしやすい
/lib, /lib64(コアライブラリ)
- 重要な共有ライブラリやローダ(ld-linux)など。
- マルチアーキテクチャの環境では /lib, /lib64, /lib/x86_64-linux-gnu などのサブディレクトリ構成もあります。
- カーネルモジュールは通常 /lib/modules/<kernel-version>/ に配置。
/etc(設定ファイル)
- システム全体の設定を格納。原則テキスト、ホスト固有。
- 代表例:
- /etc/hostname, /etc/hosts, /etc/resolv.conf(名前解決関係)
- /etc/fstab(ファイルシステムのマウント設定)
- /etc/passwd, /etc/group, /etc/shadow(ユーザー・認証)
- /etc/ssh/, /etc/nginx/, /etc/systemd/(各サービス設定)
- テンプレートは /usr/share を参照することも。初期ユーザースケルトンは /etc/skel。
- バージョン管理(例: git)や変更履歴の運用を推奨。
/home(一般ユーザーのホーム)
- 各ユーザーのデータと設定(ドットファイル)を格納。
- バックアップの中心。共有ストレージや暗号化(eCryptfs/LUKS/FSレベル)も検討対象。
- 大人数環境ではクォータやスナップショット(btrfs/ZFS)運用が有効。
/root(root ユーザーのホーム)
- 管理者(root)専用のホームディレクトリ。
- セキュリティ上、~/bin など PATH の取り扱いには注意。大事なスクリプトは /usr/local/bin 等へ。
/var(可変データ)
- 動的に増減するデータ群。
- 代表例:
- /var/log: ログ(rsyslog/journald、アプリログ)。ローテーション設定は /etc/logrotate.d/ 等
- /var/lib: アプリの状態データ(例: dpkg, rpm, databases, containers)
- /var/spool: メール、印刷キュー、cron 等のスプール
- /var/cache: キャッシュ(安全に削除できる場合があるが、アプリ仕様に依存)
- /var/tmp: 再起動をまたぐ一時領域(/tmp との違いに注意)
- 容量監視必須(/var/log, /var/lib/dockerなどは肥大化しやすい)。
/tmp と /var/tmp(一時ファイル)
- /tmp: 一時ファイル置き場。多くの環境で起動時にクリア(tmpfs のことも多い)
- /var/tmp: 長めに保持される一時ファイル(再起動をまたぐことが前提)
- セキュリティ: sticky bit(t)により他ユーザーのファイルを削除できないよう保護。
/dev(デバイスファイル)
- デバイスにアクセスするための特殊ファイル(ブロック/キャラクタ)。
- 代表例: /dev/sdX(SCSI/SATAディスク), /dev/tty, /dev/null, /dev/random, /dev/urandom
- udev/systemd-udevd により動的生成。シンボリックリンク(/dev/disk/by-uuid 等)で識別安定化。
/proc(プロセス・カーネル情報:仮想FS)
- 仮想ファイルシステム(procfs)。実体はメモリ上。
- 代表例:
- /proc/<pid>/: プロセス別情報、fd, environ, status など
- /proc/cpuinfo, /proc/meminfo, /proc/cmdline, /proc/modules
- 直接編集する場面は稀。読み取りでの診断に有用。
/sys(デバイス・カーネル情報:仮想FS)
- sysfs。デバイスやドライバ、電源管理などのモデルを公開。
- /sys/class, /sys/block, /sys/devices など。sysfs 経由の設定反映もあり(エコーベース)。
/run(揮発性のランタイム状態)
- 早期ブートから利用可能なランタイムデータ(PIDファイル、ソケット、ロックなど)。通常 tmpfs。
- 代表例:
- /run/systemd/, /run/user/<uid>/(ユーザーセッション)
- /var/run は /run の互換リンクになっていることが多い。
/boot(ブートローダ・カーネル関連)
- カーネル(vmlinuz)、初期 RAM ディスク(initrd/initramfs)、ブートローダ(GRUB)ファイル。
- 暗号化やLVM環境では /boot はプレーンで別パーティションにすることが一般的。
- カーネル更新により肥大化しがち。不要な古いカーネルの整理を。
/opt(オプションソフトウェア)
- ベンダー/アプリ単位のディレクトリでインストール(例: /opt/<vendor>/<product>)。
- /usr/local との使い分け:
- /usr/local: 手作業や独自ビルドでシステムに統合して使うもの
- /opt: 独立した配布物/バイナリ配布(アプリごとに閉じて管理)
/srv(サービスデータ)
- サービスが外部に提供するデータ置き場(例: /srv/www, /srv/ftp)。
- ディストリや運用方針により使わないことも。HTTP は /var/www に置く文化も残るが、FHS的には /srv が推奨。
/media と /mnt(マウントポイント)
- /media: リムーバブルメディアの自動マウント(USB, CD-ROM など)
- /mnt: 一時的な手動マウント用。サブディレクトリ切って用途ごとに利用(/mnt/backup など)
/lost+found(ext系ファイルシステム)
- fsck(ファイルシステムチェック)で復旧された断片ファイルの保管場所。
- ext2/3/4 などでパーティション直下に自動生成。通常は気にしない。
ディストリビューション固有/近年のディレクトリ
- /snap(Ubuntu系): Snap パッケージのマウントポイントやデータ
- /var/lib/flatpak(Flatpak)
- /run/lock(旧 /var/lock): ロックファイル
- /lib/udev, /etc/udev: udev ルール
- /etc/systemd, /usr/lib/systemd: systemd ユニット
- /var/lib/systemd, /run/systemd: ランタイム/状態
- /sys/firmware/efi: UEFI ブート環境関連
実務のベストプラクティス
- 設定は /etc に集約し、差分はバージョン管理(例: git)で追跡
- 独自ツールは /usr/local/{bin,lib,share} か /opt/<app> に配置
- データとログは /var/{lib,log}、キャッシュは /var/cache、スプールは /var/spool に分離
- /tmp は揮発性(再起動で消える前提)、長期は /var/tmp
- /home は定期バックアップ。サーバーでは別パーティションやスナップショットの活用
- /boot は容量監視(古いカーネル削除)、/var はログ/コンテナで肥大化しやすいので監視・ローテート
- 権限と所有者の管理(特に /etc, /var, /usr/local)は厳密に
- SELinux/AppArmor を使う環境ではコンテキストも意識
- コンテナ(Docker/Podman)環境では /var/lib/docker 等の容量計画が重要
よくある質問(FAQ)
- どこに独自のスクリプトを置くべき? → /usr/local/bin。PATH によっては ~/.local/bin も選択肢(ユーザー単位)。
- nginx の設定は? → /etc/nginx/ 以下。サイトごとに /etc/nginx/sites-available と symlink で sites-enabled が一般的(ディストリによる)。
- ログはどこ? → /var/log。systemd 環境では journalctl(/var/log/journal)も併用。
- 一時ファイルは? → /tmp(短期、揮発)か /var/tmp(長期)。
- USB メモリはどこにマウントされる? → /media/<ユーザー名>/<ラベル>(自動化環境)か手動で /mnt/xxxx。
このガイドを参考に、用途に応じて正しい場所へファイルを配置し、予期せぬトラブル(権限・バックアップ漏れ・容量不足)を防ぎましょう。
Discussion