【初学者向け】Linuxのファイル構造についてまとめてみた

# はじめに
Ubuntu（および多くのLinuxディストリビューション）のディレクトリ構成に関する概要です。
ちなみに、Dockerコンテナは通常、必要最低限のコンポーネントのみで構成されます。これは、コンテナのサイズを小さく保ち、起動時間を短縮するために行われます。
「ファイル・ディレクトリの一覧」は、実際にそのディレクトリに対して lsコマンドを実行した結果です。

# /（ルート）
すべてのファイルとディレクトリの基点です。


# /root (rootユーザー)
`/root`ディレクトリは、システム管理者（rootユーザー）のホームディレクトリです。
rootユーザーのファイルやデータを保存する場所です。

<details><summary>ファイル・ディレクトリの一覧</summary>

.bashrc  .profile
</details>


# /home (ホームディレクトリ)
`/home`ディレクトリは、ユーザーごとの個人ディレクトリが入っているフォルダです。ユーザーが作成したファイルやデータを保存する場所です。`/home`ディレクトリには、以下のような特徴があります。

- ユーザーごとのディレクトリ: `/home`ディレクトリは、システム上の各ユーザーのホームディレクトリを格納します。通常、ホームディレクトリの名前はユーザー名になります。たとえば、新しいユーザーのユーザー名が `taro` の場合、そのホームディレクトリは `/home/taro` になります。

- 個人設定とデータ: ユーザーのホームディレクトリには、個人設定ファイルやデータファイルが保存されます。設定ファイルは通常、ファイル名がピリオド（`.`）で始まる隠しファイルや隠しディレクトリとして保存されます。これにより、ユーザーは各アプリケーションやサービスに関する個人設定を管理できます。

- ユーザー権限: 各ユーザーは、自分のホームディレクトリ内でファイルやディレクトリを自由に作成、編集、削除できます。ただし、他のユーザーのホームディレクトリへのアクセスは、通常、制限されています。これにより、ユーザーのデータが他のユーザーから保護されます。

- 簡易なパス表記: シェルでは、ユーザーのホームディレクトリを示す短縮表記として、チルダ（`~`）が使用できます。たとえば、現在のユーザーのホームディレクトリにある `documents` ディレクトリにアクセスするには、`~/documents` という表記を使用できます。

<details><summary>新しくユーザを作成した場合の、homeディレクトリ以下の構成はどのようになるか</summary>

新しいユーザーを作成すると、そのユーザーのホームディレクトリが `/home`ディレクトリの下に作成されます。新しいユーザーのホームディレクトリは、通常、そのユーザー名と同じ名前が付けられます。
新規ユーザーのホームディレクトリの初期構成は、通常、システム上の `/etc/skel` ディレクトリの内容がコピーされます。`/etc/skel` には、ユーザーのホームディレクトリに最初に配置されるべきデフォルトの設定ファイルやディレクトリが含まれています。
具体的な内容はディストリビューションによって異なりますが、一般的には以下のようなファイルやディレクトリが含まれていることが多いです。

- `.bashrc`: Bashシェルの設定ファイル。シェルが開始されるたびに読み込まれ、エイリアスや環境変数などの設定が記述されています。
- `.bash_profile`: ユーザーがログインしたときに実行されるシェルスクリプト。環境変数やパスなど、ログイン時の設定を行います。
- `.bash_logout`: ユーザーがログアウトする際に実行されるシェルスクリプト。ログアウト時のクリーンアップ作業などを行うことができます。

また、デスクトップ環境がインストールされている場合、以下のようなディレクトリがデフォルトで作成されることがあります。

- `Desktop`: デスクトップに配置されるファイルやショートカットを格納するディレクトリ。
- `Documents`: ユーザーのドキュメントを保存するディレクトリ。
- `Downloads`: ユーザーがダウンロードしたファイルを保存するディレクトリ。
- `Music`: 音楽ファイルを保存するディレクトリ。
- `Pictures`: 画像ファイルを保存するディレクトリ。
- `Videos`: 動画ファイルを保存するディレクトリ。
</details>


# /bin (binaries: 2進数・機械語・バイナリ)
`/bin`ディレクトリは、重要なシステムプログラムやコマンドが入っているフォルダです。一般のユーザーでも実行可能な基本的なコマンドが含まれています。
bashコマンドをはじめ、ls、pwd、echo などのコマンドが含まれています。

:::note info
これらコマンドを"/bin/ls"のようにフルパスで指定しなくても使用できるのは「PATHを通している」からです。
:::

<details><summary>ファイル・ディレクトリの一覧</summary>

bash, bunzip2, bzcat, bzcmp, bzdiff, bzegrep, bzexe, bzfgrep, bzgrep, bzless, bzmore, bzip2, bzip2recover, cat, chgrp, chmod, chown, cp, dash, date, dd, df, dir, dmesg, dnsdomainname, domainname, echo, egrep, false, fgrep, findmnt, grep, gunzip, gzexe, gzip, hostname, kill, ln, login, ls, lsblk, mkdir, mknod, mktemp, more, mount, mountpoint, mv, nisdomainname, pidof, ps, pwd, rbash, readlink, rm, rmdir, run-parts, sed, sh, sh.distrib, sleep, stty, su, sync, tar, tempfile, touch, true, umount, uname, uncompress, vdir, wdctl, which, ypdomainname, zcat, zcmp, zdiff, zegrep, zfgrep, zfor, zgrep, zless, zmore, znew
</details>


# /sbin (system binaries)
`/sbin`ディレクトリは、システム管理用のコマンドやプログラムが入っているフォルダです。
一般的なユーザーは、これらのコマンドを実行する権限を持っていないことが多く、通常、rootユーザーまたはsudoコマンドを使用した管理者権限で実行されます。

<details><summary>ファイル・ディレクトリの一覧</summary>

agetty, badblocks, blkdiscard, blkid, blockdev, cfdisk, chcpu, ctrlaltdel, debugfs, dumpe2fs, e2fsck, e2image, e2label, e2undo, fdisk, findfs, fsck, fsck.cramfs, fsck.ext2, fsck.ext3, fsck.ext4, fsck.minix, fsfreeze, fstab-decode, fstrim, getty, hwclock, initctl, installkernel, isosize, killall5, ldconfig, ldconfig.real, logsave, losetup, mkfs, mkfs.bfs, mkfs.cramfs, mkfs.ext2, mkfs.ext3, mkfs.ext4, mkfs.minix, mke2fs, mkhomedir_helper, mkswap, pam_extrausers_chkpwd, pam_extrausers_update, pam_tally, pam_tally2, pivot_root, raw, resize2fs, runuser, sfdisk, shadowconfig, start-stop-daemon, sulogin, swaplabel, swapoff, swapon, switch_root, sysctl, tune2fs, unix_chkpwd, unix_update, wipefs, zramctl
</details>


# /dev (devices: 装置)
`/dev`ディレクトリは、システムのデバイスファイルが保存されているフォルダです。これには、ハードディスクやキーボード、マウスなどのハードウェアデバイスが含まれます。
Linuxでは、デバイス（ハードウェアや仮想デバイス）をファイルのように扱うことができます。これを「すべてはファイル」と言います。デバイスファイルは、デバイスを制御するためのインターフェースとして機能し、システムがデバイスと通信するための手段を提供します。デバイスファイルには、通常、次の2つのタイプがあります。

1. ブロックデバイス：ブロックデバイスは、データをブロック単位で読み書きするデバイスです。HDDやSSD、CD-ROMドライブなどがこれに該当します。

2. キャラクタデバイス：キャラクタデバイスは、データをバイト単位で読み書きするデバイスです。マウス、キーボードなどがこれに該当します。

`/dev`ディレクトリ内には、他にも特殊なデバイスファイルが存在します。例えば、`/dev/null`（データを破棄するデバイス）、`/dev/zero`（ゼロで埋められたデータを生成するデバイス）、`/dev/random`（疑似ランダムなデータを生成するデバイス）などがあります。

<details><summary>ファイル・ディレクトリの一覧</summary>

console, core, fd, full, mqueue, null, ptmx, pts, random, shm, stderr, stdin, stdout, tty, urandom, zero
</details>


# /media (メディアデバイス)
`/media`ディレクトリは、一時的にマウントされるリムーバブルデバイス（外付けハードディスク、USBフラッシュドライブ、CD-ROM、DVDなど）のマウントポイントを提供するディレクトリです。リムーバブルデバイスが接続されたとき、システムは通常、/mediaディレクトリの下に新しいディレクトリを作成し、そのデバイスをマウントします。
/mediaディレクトリを利用することで、リムーバブルデバイスのファイルやディレクトリにアクセスでき、データの読み書きが可能になります。


# /mnt (mount: 取り付ける)
`/mnt`ディレクトリは、一時的に他のファイルシステム（別のディスクやネットワークストレージなど）をマウントするためのディレクトリです。
ファイルシステムのマウントとは、ストレージデバイス上のファイルシステムを、システムのディレクトリツリーに取り込むことを指します。マウントを行うことで、そのデバイス上のファイルやディレクトリにアクセスできるようになります。

:::note info
なお、`/media`ディレクトリも、一時的にファイルシステムをマウントするためのディレクトリですが、`/media`は主に自動マウントされるリムーバブルデバイスに対して使用されます。一方、`/mnt`ディレクトリは、システム管理者が手動でマウント操作を行う際に使用されることが一般的です。
:::


# /sys (system)
/sysディレクトリは、sysfsと呼ばれる仮想ファイルシステムがマウントされるディレクトリで、カーネルが管理するデバイスやドライバの情報を提供します。

:::note info
/dev と /sys の違い
/devディレクトリはデバイスへのアクセスポイントを提供し、/sysディレクトリはそれらのデバイスに関する情報や設定を提供する役割があります。
:::

<details><summary>ファイル・ディレクトリの一覧</summary>

block, bus, class, dev, devices, firmware, fs, hypervisor, kernel, module, power
</details>


# /etc (et cetera, 設定)
`/etc`ディレクトリは、システム全体の設定ファイルが入っているフォルダです。アプリケーションやサービスの設定ファイルもここに保存されます。`/etc`ディレクトリの主な特徴は以下の通りです。

- システム全体の設定: `/etc`ディレクトリは、システム全体に影響する設定情報を管理するための場所です。各ユーザーの個別の設定は、ユーザーのホームディレクトリ内の隠しファイルや隠しディレクトリに格納されます。

- アプリケーションの設定: インストールされたアプリケーションは、独自の設定ファイルや設定ディレクトリを`/etc`ディレクトリに格納することが一般的です。例えば、Apache Webサーバーの設定は`/etc/apache2`ディレクトリに格納されます。他にも nginxやMySQLなどの設定ファイルやディレクトリもここです。

<details><summary>ファイル・ディレクトリの一覧</summary>

adduser.conf, alternatives, apt, bash.bashrc, bindresvport.blacklist, cloud, cron.daily, debconf.conf, debian_version, default, deluser.conf, dpkg, environment, fstab, gai.conf, group, gshadow, host.conf, hostname, hosts, init.d, issue, issue.net, kernel, ld.so.cache, ld.so.conf, ld.so.conf.d, legal, libaudit.conf, login.defs, logrotate.d, lsb-release, machine-id, mke2fs.conf, mtab, networks, nsswitch.conf, opt, os-release, pam.conf, pam.d, passwd, profile, profile.d, rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d, rcS.d, resolv.conf, rmt, securetty, security, selinux, shells, skel, subgid, subuid, sysctl.conf, sysctl.d, systemd, terminfo, update-motd.d
</details>


# /usr
/usrディレクトリは、システム全体で共有されるアプリケーション、ライブラリ、ドキュメントなどを格納する場所です。アプリケーションのインストール先や、共有ライブラリなどがここに入ります。`/usr`ディレクトリは、いくつかのサブディレクトリに分かれています。

:::note info
/usrディレクトリは、もともと"user"を意味していましたが、現在ではその役割が変化し、システム全体で共有されるアプリケーションやリソースを格納する場所として機能しています。一方、/homeディレクトリは、各ユーザーのホームディレクトリを格納する場所として使われており、各ユーザーはこのディレクトリ内で個別のデータや設定ファイルを保存することができます。従って、ユーザーと関連する情報は、現在では主に/homeディレクトリに存在します。
:::

<details><summary>ファイル・ディレクトリの一覧</summary>

bin, games, include, lib, local, sbin, share, src
</details>


# /boot (起動)
`/boot`ディレクトリは、Linuxの起動に必要なファイルが格納されているディレクトリです。
Linuxが起動する際に、LILO(Linux Loader)などのブートローダーがこのディレクトリのファイルを使用してカーネルをロードし、システムの初期化プロセスを開始します。通常、システムの起動時にのみ使用されます。


# lib(ライブラリ)
`/lib`ディレクトリは、32ビットアーキテクチャ用の共有ライブラリとカーネルモジュールを格納する場所です。
複数のアプリケーションが同じコードを使用できるようにすることで、ディスク容量やメモリ使用量を節約し、アプリケーションの実行を効率化します。

<details><summary>ファイル・ディレクトリの一覧</summary>

init, lsb, systemd, terminfo, udev, x86_64-linux-gnu
</details>


# lib64
`/lib64`ディレクトリは、64ビットアーキテクチャ用の共有ライブラリとカーネルモジュールを格納する場所です。
複数のアプリケーションが同じコードを使用できるようにすることで、ディスク容量やメモリ使用量を節約し、アプリケーションの実行を効率化します。

<details><summary>ファイル・ディレクトリの一覧</summary>

ld-linux-x86-64.so.2
</details>


# /proc (process)
/procディレクトリは、実行中のプロセスやシステム情報を表現する仮想ファイルシステムです。このフォルダは、メモリ上に存在し、ディスクには保存されません。
/procディレクトリには、実行中の各プロセスに対応するディレクトリが存在します。これらのディレクトリは、プロセスID（PID）と同じ名前が付けられており、そのプロセスに関連する情報が含まれます。また、/procディレクトリ内には、システム全体に関わる情報を提供するファイルも存在します。
いくつかの主要な/procディレクトリ内のファイルとディレクトリの例：

- /proc/cpuinfo: CPUに関する情報（モデル名、クロック速度など）が含まれます。
- /proc/meminfo: システムのメモリ使用状況に関する情報が含まれます。
- /proc/(数字): 実行中のプロセスに対応するディレクトリで、プロセスID（PID）と同じ名前が付けられています。各ディレクトリには、そのプロセスに関する情報が含まれています。

<details><summary>ファイル・ディレクトリの一覧</summary>

1, 24, bus, consoles, diskstats, execdomains, interrupts, kallsyms, kmsg, loadavg, modules, net, slabinfo, sys, timer_list, vmallocinfo, cgroups, cpuinfo, dma, fb, iomem, kcore, kpagecgroup, locks, mounts, pagetypeinfo, softirqs, sysrq-trigger, tty, vmstat, acpi, cmdline, crypto, docker, filesystems, ioports, key-users, kpagecount, meminfo, mpt, partitions, stat, sysvipc, uptime, zoneinfo, buddyinfo, config.gz, devices, driver, fs, irq, keys, kpageflags, misc, mtrr, self, swaps, thread-self, version

  ※ 24はlsコマンドを実行するたびに数字が上がっていました
</details>


# /run (run time)
`/run`ディレクトリは、システムが起動してからシャットダウンするまでの期間（ランタイム）に利用される一時的なファイルを格納する場所です。このディレクトリは、デーモンやサービスがランタイム中に必要とするデータを保持するために使用されます。また、プロセス間通信（IPC）のためのソケットファイルや、プロセスのロックファイルなども、`/run`ディレクトリ内に配置されることがあります。
`/run`ディレクトリは、tmpfs（一時ファイルシステム）としてマウントされており、メモリ上に配置されます。これにより、ディスク上に永続的なデータを書き込まずに、アクセス速度の速い一時的なデータ領域が提供されます。システムが再起動されると、`/run`ディレクトリ内のデータは自動的にクリアされるため、永続的なデータ保存には適していません。

:::note info
ロックファイルとは
ロックファイル（lock file）は、オペレーティングシステムやアプリケーションが、リソースへの同時アクセスを制御するために使用するファイルです。ロックファイルは通常、一時的に作成され、リソースが使用されている間に存在します。リソースが解放されると、ロックファイルは削除され、他のシステムやアプリケーションがアクセス可能な状態となります。
:::

<details><summary>ファイル・ディレクトリの一覧</summary>

lock, mount, systemd, utmp
</details>


# /tmp (temporary)
`/tmp`ディレクトリは、一時的なファイルを保存するための場所です。アプリケーションやプログラムは、一時的なデータ、キャッシュ、ロックファイル、ソケットファイルなどのファイルを`/tmp`ディレクトリに保存します。これらのファイルは、プログラムの実行中や特定のタスクを実行する際に必要とされるが、永続的に保存する必要のないものです。
永続的なデータやアプリケーションの設定ファイルなどは、`/tmp`ディレクトリではなく、他の適切なディレクトリ（`/home`ディレクトリや`/var`ディレクトリ）に保存するべきです。


# /var (variable)
`/var`ディレクトリは、システムの実行中に変更される可能性があるデータが格納されるディレクトリです。これには、ウェブサイト（/var/www）、データベース（/var/lib）、ログファイル（/var/log）、キャッシュデータ（/var/cache）、プリントジョブ（/var/spool）などが含まれます。

<details><summary>ファイル・ディレクトリの一覧</summary>

backups, cache, lib, local, lock, log, mail, opt, run, spool, tmp
</details>


# /srv (service)
`/srv`ディレクトリは、サーバーが提供するデータやサービスに関連するファイルを格納する場所です。
例えば、WebサーバーやFTPサーバーのようなネットワークサービスが実行されている場合、そのサービスが提供するファイル（HTMLファイル、画像ファイル、アプリケーションファイルなど）が、/srvディレクトリ内の適切なサブディレクトリに配置されることがあります。具体的には、/srvディレクトリ内には以下のようなサブディレクトリが存在することがあります。

- /srv/www：Webサーバーが提供するWebページやアプリケーションのファイルが格納されます。
- /srv/ftp：FTPサーバーが提供するファイルが格納されます。

ただし、`/srv`ディレクトリの使用方法は、実際のシステムやサービスの構成によって異なります。また、/srvディレクトリは、システム管理者がデータの整理や管理を容易に行うための標準化された場所を提供する目的で存在しています。システム管理者は、/srvディレクトリ内にサービスごとにサブディレクトリを作成し、サービスが提供するデータを保存・管理することが一般的です。


# /opt (optional)
`/opt`ディレクトリは、任意の追加アプリケーション（Chrome, Slack, VSCode, Zoom, Steam など）をインストールするために使用されるディレクトリです。これらのアプリケーションは、システムの標準のパッケージ管理システムを介さずにインストールされることが多く、システムの基本的な機能には必須ではありません。
特に大規模なソフトウェアやサードパーティ製のソフトウェア、商用ソフトウェアなどをインストールする際に役立ちます。これらのソフトウェアは、各自のディレクトリ（例：/opt/(ベンダー)/(ソフトウェア) ）にまとめてインストールされ、他のシステムファイルと混在しないように管理されます。