在 Linux 操作系统中,文件系统采用统一的目录树结构,所有的文件和目录都以根目录 (/) 为起点。为了保持系统的一致性、可维护性和互操作性,Linux 社区制定了文件系统层级标准 (Filesystem Hierarchy Standard, FHS)。FHS 规定了系统中所有主要目录的用途和内容,使得不同的发行版能够遵循相同的约定,方便用户和开发者理解文件布局。本文将详细解读 Linux 系统中各个重要目录的功能。

核心思想:遵循 FHS,将文件和目录组织成逻辑结构,区分系统核心、用户数据、临时文件等,以提高系统的健壮性、安全性和可管理性。


一、文件系统层级标准 (FHS)

FHS 定义了 Linux 文件系统根目录下各个子目录应包含的内容。它旨在确保 Linux 和其他类 Unix 系统之间的互操作性,让用户和管理员能够更容易地找到文件,并保证软件能够正确地安装在期望的位置。

FHS 将目录分为两类:

  1. 静态 (Static)可变 (Variable)
    • 静态文件:在系统重启或服务停止后保持不变,不随系统运行而改变(例如,/bin 中的程序二进制文件)。
    • 可变文件:在系统运行过程中会不断变化(例如,/var/log 中的日志文件)。
  2. 可共享 (Shareable)不可共享 (Unshareable)
    • 可共享文件:可以在多台主机之间共享的文件(例如,/usr 中的大部分内容)。
    • 不可共享文件:特定于某台主机的文件(例如,/etc 中的配置文件)。

二、根目录 (/)

根目录是 Linux 文件系统层次结构的起点,所有其他目录都直接或间接的挂载在根目录下。

三、主要目录功能详解

以下是根据 FHS 标准,Linux 系统中常见的顶级目录及其主要功能:

3.1 /bin (Binary)

  • 功能:存放所有用户(包括 root 用户)都可以使用的基本命令,这些命令在系统启动和修复模式下也是必需的。
  • 特性
    • 不可共享 (Unshareable)
    • 静态 (Static)
    • 包含单用户模式下所需的工具。
  • 常见内容ls, cp, mv, rm, cat, mkdir, echo, bash 等。

3.2 /sbin (System Binary)

  • 功能:存放只有系统管理员 (root) 或需要特殊权限才能执行的基本系统管理命令。这些命令同样在系统启动和修复模式下是必需的。
  • 特性
    • 不可共享 (Unshareable)
    • 静态 (Static)
    • 包含单用户模式下所需的工具。
  • 常见内容fdisk, reboot, shutdown, mount, fsck, ifconfig (在某些系统上已被 ip 取代) 等。

3.3 /etc (Editable Text Configuration)

  • 功能:存放所有系统级别配置文件。这些文件控制着整个系统的行为,以及各种服务和应用程序的配置。
  • 特性
    • 不可共享 (Unshareable)
    • 静态 (Static)
    • 通常是 ASCII 文本文件,可以直接编辑。
  • 常见内容passwd, shadow, fstab, resolv.conf, hosts, nginx.conf, Apache/Nginx 配置目录 (/etc/apache2/, /etc/nginx/), systemd 配置文件 (/etc/systemd/) 等。

3.4 /dev (Device)

  • 功能:存放所有的设备文件。在 Unix/Linux 系统中,设备被抽象为文件,通过读写这些文件来与硬件设备进行交互。
  • 特性
    • 不可共享 (Unshareable)
    • 动态 (Variable) (由内核和 udev 动态维护)
  • 常见内容
    • 块设备:sda, sdb (硬盘), sdb1 (硬盘分区)
    • 字符设备:tty (终端), lp0 (打印机), null, zero, random 等。

3.5 /proc (Process Information)

  • 功能:这是一个虚拟文件系统,不存储在磁盘上,而是由内核动态生成,用于提供进程信息以及内核和系统参数
  • 特性
    • 不可共享 (Unshareable)
    • 动态 (Variable)
    • 每次访问时都会实时生成。
  • 常见内容
    • 每个正在运行的进程都有一个以其 PID 命名的目录 (/proc/1234),包含 cmdline, status, fd 等信息。
    • cpuinfo, meminfo (CPU 和内存信息)
    • filesystems (当前支持的文件系统)
    • sys (通过修改 /proc/sys 下的文件可以实时调整内核参数)。

3.6 /sys (System Information)

  • 功能:这也是一个虚拟文件系统,由内核动态生成,用于暴露内核对象 (kernel objects) 的属性,如设备、驱动、文件系统等,提供一个统一的接口来访问和修改内核的内部状态。
  • 特性
    • 不可共享 (Unshareable)
    • 动态 (Variable)
  • 常见内容class, bus, devices 等,用于管理硬件设备和驱动。

3.7 /var (Variable)

  • 功能:存放可变数据,即在系统正常运行期间内容会不断变化的文件。它包含了日志文件、邮件队列、打印队列、运行时数据等。
  • 特性
    • 不可共享 (Unshareable)
    • 可变 (Variable)
    • 通常建议单独挂载一个分区,以防止日志文件填满根分区。
  • 常见子目录
    • /var/log:系统和应用程序日志文件(如 syslog, auth.log, Web 服务器访问日志)。
    • /var/mail:用户邮箱。
    • /var/spool:打印队列、crontab 任务队列等。
    • /var/tmp:比 /tmp 更持久的临时文件,通常不会在系统重启时删除。
    • /var/lib:服务或应用运行时需要修改的状态数据(如数据库数据)。
    • /var/www:Web 服务器的默认根目录(特定发行版和配置)。
    • /var/run:自 FHS 2.3 后已被 /run 取代。

3.8 /tmp (Temporary)

  • 功能:存放系统和用户创建的临时文件
  • 特性
    • 不可共享 (Unshareable)
    • 可变 (Variable)
    • 通常在系统每次重启时都会被清空,或由系统定期清理。
  • 常见内容:各种应用程序运行时的临时文件。

3.9 /usr (Unix System Resources)

  • 功能:存放绝大多数用户级应用程序和文件,包括非必要的二进制文件、库、文档和源代码。
  • 特性
    • 可共享 (Shareable)
    • 只读 (Read-only) (在正常运行期间,内容不应被编辑,因此可以被多台主机挂载为只读)
  • 常见子目录
    • /usr/bin:非必要的用户命令(不属于 /bin 中的基本命令)。
    • /usr/sbin:非必要的系统管理命令(不属于 /sbin 中的基本命令)。
    • /usr/local:本地安装软件的目录,用于存放那些不通过发行版包管理器安装的软件。通常包含 bin, sbin, lib, etc 等子目录。
    • /usr/lib:非必要的共享库。
    • /usr/share:与架构无关的共享数据,如文档、man 页、字体、图标等。
    • /usr/include:C/C++ 头文件。
    • /usr/src:内核源代码。

3.10 /opt (Optional)

  • 功能:存放可选的第三方应用程序软件包。这些软件包通常独立于系统,并安装在自己的子目录下。
  • 特性
    • 可共享 (Shareable)
    • 只读 (Read-only)
    • 通常用于商业软件或自行编译的大型应用。
  • 常见内容/opt/google/chrome, /opt/spotify 等。

3.11 /home (Home)

  • 功能:存放普通用户的家目录。每个用户通常都有一个独立的子目录,用于存储用户的个人配置文件、文档、图片、下载等数据。
  • 特性
    • 不可共享 (Unshareable) (用户数据通常特定于主机)
    • 可变 (Variable)
  • 常见内容/home/username/ 包含 .bashrc, .profile, .config, Documents, Downloads 等。

3.12 /root (Root’s Home)

  • 功能Root 用户的家目录。与普通用户的目录 /home/username 不同,root 用户的家目录直接位于根目录下。
  • 特性
    • 不可共享 (Unshareable)
    • 可变 (Variable)
    • /home 分区不可用时,root 用户仍然能够正常登录和工作。

3.13 /lib/lib64 (Library)

  • 功能:存放基本共享库,这些库是 /bin/sbin 中的二进制程序所必需的。
  • 特性
    • 不可共享 (Unshareable)
    • 静态 (Static)
    • /lib64 用于 64 位系统中的 64 位库。
  • 常见内容ld-linux.so, libc.so.6 等。

3.14 /media

  • 功能:用作可移动媒体 (如 USB 驱动器、CD/DVD-ROM) 的挂载点。
  • 特性
    • 不可共享 (Unshareable)
    • 动态 (Variable)
    • 通常由桌面环境或 udev 自动管理。

3.15 /mnt (Mount)

  • 功能:传统的临时文件系统挂载点。通常用于手动临时挂载其他文件系统(例如,临时挂载另一个硬盘分区或网络共享)。
  • 特性
    • 不可共享 (Unshareable)
    • 动态 (Variable)

3.16 /boot (Boot)

  • 功能:存放引导加载程序 (boot loader) 所需的文件,如内核 (vmlinuz)、初始化内存盘 (initramfsinitrd) 以及引导加载程序配置文件 (grub.cfg)。
  • 特性
    • 不可共享 (Unshareable)
    • 静态 (Static)
    • 独立于其他文件系统分区,通常很小,只包含启动相关数据。
  • 常见内容/boot/vmlinuz-*, /boot/initramfs-*, /boot/grub/

3.17 /srv (Service Data)

  • 功能:存放服务相关的数据。例如,如果运行一个 FTP 服务器,其数据可能存放在 /srv/ftp;如果运行一个 Web 服务器,其数据可能存放在 /srv/www
  • 特性
    • 不可共享 (Unshareable)
    • 可变 (Variable)
    • 通常用于特定于站点提供的数据。
  • 常见内容/srv/www (Web 服务数据), /srv/ftp (FTP 服务数据)。

3.18 /run (Runtime Variable Data)

  • 功能:存放系统启动以来生成的运行时可变数据。这是现代 Linux 系统用来取代 /var/run 的目录。它是一个内存文件系统 (tmpfs),因此在系统重启时会被清空。
  • 特性
    • 不可共享 (Unshareable)
    • 可变 (Variable)
    • 临时性 (重启清空)
  • 常见内容:进程 ID 文件 (.pid 文件)、套接字 (.sock 文件)、锁文件等。

四、理解和记忆目录结构的技巧

  • binsbin 家族:记住它们是“二进制文件” (Binary) 和“系统二进制文件” (System Binary),分别对应用户和管理员的基本命令。前面不带 usr 的 (/bin, /sbin) 是系统启动和修复所“必须”的。带有 usr 的 (/usr/bin, /usr/sbin) 是系统正常运行时“非必须”的。
  • /etc:发音像 “et cetera” (等等,及其他),但实际是 “editable text configuration” (可编辑的文本配置)。
  • /var:Var-iable,可变的数据。
  • /usr:过去曾代表 “User’s programs” (用户程序),现在更像是 “Unix System Resources” (Unix 系统资源),存放大部分应用程序和共享数据。
  • /proc/sys:它们是虚拟文件系统,由内核动态生成,用于进程和系统信息。
  • /tmp/var/tmp:都是临时文件,但 /tmp 重启清空,/var/tmp 则更持久。
  • /lib/usr/lib/lib64lib 是 Library (库文件),用于存放二进制程序所需的共享库。

五、总结

Linux 的文件系统目录结构通过遵循 FHS 标准,提供了一个清晰、逻辑化的文件组织方式。这不仅有助于系统管理员进行维护和故障排除,也为应用程序的安装和运行提供了统一的环境。理解和掌握这些目录的功能是有效管理 Linux 系统,以及进行系统编程和自动化运维的基础。通过这些约定,Linux 系统能够维持其强大的灵活性和稳定性。