Linuxのディレクトリ構造は「Filesystem Hierarchy Standard(FHS)」という標準規格で定義されているいます。これを理解しているかどうかで、トラブルシューティングの速度やシステム管理の質が大きく変わります。
この記事では、実務で頻繁に触れるディレクトリを中心に、なぜそこに配置されるのか、現場でどう使われているのかを徹底的に解説します。教科書的な知識だけでなく、現場で死なないための実践知識を身につけてほしい。
目次
- 1 FHS(Filesystem Hierarchy Standard)とは
- 2 ルートディレクトリ(/)配下の主要ディレクトリ
- 3 /etc – 設定ファイル
- 4 実務の落とし穴
- 5 まとめ
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 ...ls、cp、catなど、シングルユーザーモードでも使える必須コマンドがここに入っています。すべてのユーザーが使用できるという点が重要です。
現場での注意点
最近のディストリビューション(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 ...shutdown、reboot、iptablesなど、システム全体に影響を与えるコマンドがここに入っています。
/binと/sbinの使い分け
/bin: 一般ユーザーも使う基本コマンド(ls、catなど)/sbin: root権限が必要な管理コマンド(shutdown、iptablesなど)
ただし、この区別も絶対的なものではなく、最近は/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 – 手動インストール用
パッケージマネージャー(yumやapt)でインストールしたソフトウェアは/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-amd64vmlinuz-*: 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/cpuinfoCPUの情報が表示されます。
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: プロセス情報(仮想ファイルシステム)
この知識があれば、トラブルシューティング時にどこを見ればいいかが即座にわかります。設定ファイルの配置場所も迷わなくなるでしょう。
