# Linux 目录结构

URL: https://caijiao.org/linux/file-system/directory-structure
Source: docs/linux/file-system/directory-structure.md
Description: 详细介绍Linux操作系统的目录结构和文件系统层次标准(FHS)，包括各主要目录的用途、内容和最佳实践。

Linux 文件系统采用单一的树状层次结构，从根目录 `/` 开始，所有其他目录都是根目录的子目录。理解 Linux 目录结构对于高效使用和管理 Linux 系统至关重要。

## 文件系统层次标准 (FHS)

### FHS 简介
文件系统层次标准（Filesystem Hierarchy Standard，FHS）定义了 Linux/Unix 系统中目录结构和内容的标准布局。其目的是确保不同 Linux 发行版之间的兼容性和一致性。

### 最新版本
- FHS 3.0 是当前最新的主要版本，发布于 2015 年
- 许多现代 Linux 发行版都遵循这一标准或其变体

## 主要目录详解

### 根目录 `/`
根目录是整个文件系统的起点，所有其他目录都是它的子目录。在 FHS 中，根目录的大小应保持精简，只包含必要的目录。

### `/bin` - 基本命令
包含基本的系统命令二进制文件，这些命令在单用户模式下也可用，所有用户都可以执行。

**主要内容：**
- 基本的 shell 命令（如 `bash`, `sh`）
- 文件操作命令（如 `cp`, `mv`, `rm`）
- 文本处理命令（如 `cat`, `echo`）
- 系统命令（如 `kill`, `ps`）

```bash
# 查看 /bin 目录中的命令示例
ls -la /bin | head -10
```

### `/boot` - 引导文件
包含启动 Linux 系统所需的文件，如内核映像、引导加载程序配置和初始化 RAM 磁盘。

**主要内容：**
- 内核文件（如 `vmlinuz-<version>`）
- 初始 RAM 磁盘（如 `initrd.img-<version>` 或 `initramfs-<version>.img`）
- GRUB 引导加载程序配置和文件

```bash
# 查看 /boot 目录内容
ls -la /boot
```

### `/dev` - 设备文件
包含代表系统设备的特殊文件，Linux 通过这些文件与硬件设备进行通信。

**主要内容：**
- 块设备（如硬盘分区 `/dev/sda1`）
- 字符设备（如键盘 `/dev/input/event0`）
- 伪终端（如 `/dev/pts/0`）
- 系统设备（如随机数生成器 `/dev/random`）

```bash
# 列出所有磁盘设备
ls -la /dev/sd*
```

### `/etc` - 配置文件
包含系统和应用程序的配置文件。这是系统管理的核心目录之一。

**主要内容：**
- 系统配置文件（如 `fstab`, `hosts`）
- 服务配置（如 `/etc/ssh/`, `/etc/apache2/`）
- 用户和组配置（`passwd`, `group`）
- 网络配置（`network/interfaces`, `resolv.conf`）
- 启动脚本和初始化配置

```bash
# 查看重要的系统配置文件
ls -la /etc | grep -E 'fstab|hosts|passwd|group'
```

### `/home` - 用户主目录
包含所有普通用户的主目录，每个用户在 `/home` 下有一个以其用户名命名的子目录。

**主要内容：**
- 用户文件和目录
- 用户配置文件（如 `.bashrc`, `.profile`）
- 用户数据和文档

```bash
# 查看用户主目录
ls -la /home
```

### `/lib` 和 `/lib64` - 库文件
包含系统和应用程序运行所需的共享库文件和内核模块。`/lib64` 专门用于 64 位库。

**主要内容：**
- C 标准库（如 `libc.so`）
- 内核模块（在 `/lib/modules/<kernel-version>/` 目录）
- 应用程序依赖库

```bash
# 查看内核模块目录
ls -la /lib/modules/$(uname -r)/
```

### `/media` - 可移动媒体
用于挂载可移动媒体设备（如 CD-ROM、USB 驱动器等）的挂载点。

**主要内容：**
- 自动挂载的可移动设备目录

### `/mnt` - 临时挂载
用于临时挂载文件系统的目录，通常由系统管理员手动使用。

### `/opt` - 可选软件
用于安装第三方软件包或大型应用程序。这些软件通常不会被包管理器更新。

### `/proc` - 进程信息
虚拟文件系统，提供关于系统和进程的实时信息，不占用实际磁盘空间。

**主要内容：**
- 进程信息（如 `/proc/<PID>/`）
- 系统信息（如 `cpuinfo`, `meminfo`）
- 内核参数和统计信息

```bash
# 查看 CPU 信息
cat /proc/cpuinfo
# 查看内存使用情况
cat /proc/meminfo
```

### `/root` - 管理员主目录
root 用户的主目录，不同于普通用户的 `/home` 目录。

### `/run` - 运行时数据
包含系统运行时的进程数据，如进程 ID 文件和 socket 文件。在系统重启后重新创建。

### `/sbin` - 系统命令
包含仅供系统管理员使用的系统管理命令。

**主要内容：**
- 分区和格式化命令（如 `fdisk`, `mkfs`）
- 文件系统维护命令（如 `fsck`）
- 系统管理命令（如 `ifconfig`, `route`）

```bash
# 查看 /sbin 目录中的命令示例
ls -la /sbin | head -10
```

### `/srv` - 服务数据
包含系统提供的各种服务的数据文件，如 Web 服务器的文档根目录。

### `/sys` - 系统信息
虚拟文件系统，提供关于设备、内核模块和系统功能的信息，与 `udev` 结合使用。

**主要内容：**
- 设备信息（如 `/sys/class/`）
- 内核参数（如 `/sys/module/`）
- 电源管理信息

```bash
# 查看块设备信息
ls -la /sys/block/
```

### `/tmp` - 临时文件
用于存储临时文件的目录，系统重启后通常会清空。所有用户都可以在此创建文件。

### `/usr` - 用户程序和数据
包含大多数用户工具和应用程序，是系统中最大的目录之一。

**主要内容：**
- `/usr/bin`：非基本用户命令
- `/usr/sbin`：非基本系统管理命令
- `/usr/lib`：库文件
- `/usr/include`：C/C++ 头文件
- `/usr/share`：架构无关的数据文件
- `/usr/src`：源代码（如内核源码）

```bash
# 查看 /usr 目录结构
ls -la /usr
```

### `/var` - 可变数据
包含系统运行时会改变的数据，如日志文件、缓存和数据库。

**主要内容：**
- `/var/log`：日志文件
- `/var/spool`：打印和邮件队列
- `/var/cache`：应用程序缓存
- `/var/lib`：状态信息和数据库
- `/var/run`：运行时变量（部分发行版链接到 `/run`）

```bash
# 查看系统日志目录
ls -la /var/log
```

## 目录结构的组织原则

### 静态与动态内容分离
- **静态内容**：不经常变化的数据，如可执行文件、库文件（在 `/bin`, `/sbin`, `/lib`, `/usr` 等）
- **动态内容**：经常变化的数据，如日志、缓存、临时文件（在 `/var`, `/tmp`, `/run` 等）

### 可共享与不可共享资源分离
- **可共享资源**：可以在网络上共享的数据，如 `/usr`, `/srv`
- **不可共享资源**：特定于单个系统的数据，如 `/etc`, `/var/run`

### 只读与读写目录分离
- **只读目录**：如 `/usr`（可以挂载为只读以提高安全性）
- **读写目录**：如 `/var`, `/home`, `/tmp`

## 目录管理最佳实践

### 命名约定
- 避免在目录名中使用空格和特殊字符
- 使用小写字母和短横线（-）分隔单词
- 保持目录名简洁明了

### 权限管理
- 正确设置目录权限，遵循最小权限原则
- 对于系统目录，限制写入权限
- 为用户数据目录设置适当的所有权

```bash
# 设置目录权限示例
sudo chmod 755 /some/directory  # 所有者可读写执行，其他用户可读执行
sudo chown user:group /some/directory  # 设置目录所有权
```

### 磁盘空间管理
- 监控重要目录的磁盘使用情况
- 定期清理临时文件和旧日志
- 考虑将大型数据目录挂载到单独的分区

```bash
# 查看大目录
du -h --max-depth=1 / | sort -hr
```

## 自定义目录结构

### 在 `/opt` 中安装第三方软件
```bash
# 示例：安装自定义应用到 /opt
sudo mkdir -p /opt/myapp
# 将应用文件复制到 /opt/myapp
```

### 在 `/usr/local` 中安装本地编译软件
```bash
# 编译安装软件时指定安装路径
./configure --prefix=/usr/local
sudo make install
```

### 创建自定义挂载点
```bash
# 创建数据目录
sudo mkdir -p /data
# 编辑 /etc/fstab 添加挂载配置
sudo nano /etc/fstab
# 添加类似行：/dev/sdb1 /data ext4 defaults 0 2
```

## 常见问题排查

### 目录权限问题
```bash
# 检查目录权限
ls -la /path/to/directory
# 修复权限
chmod 755 /path/to/directory
```

### 磁盘空间不足
```bash
# 查找占用大量空间的目录
du -h --max-depth=1 / | sort -hr | head -10
# 清理日志文件
find /var/log -name "*.log.*" -delete
```

通过理解 Linux 的目录结构，您可以更有效地导航文件系统、管理系统配置和排查问题。遵循 FHS 标准有助于保持系统的一致性和可维护性。
