Linux 的文件系统层级结构

Linux 的文件系统层级结构标准 (Filesystem Hierarchy Standard, FHS)提供了一个标准化的、有组织的系统来存放文件。在 Linux 中,FHS 确保了无论是软件开发者还是系统管理员,都能在可预期的位置找到需要的文件,也保证了不同 Linux 发行版之间具有良好的一致性。
可以形象的比喻,整个 Linux 文件系统是一棵巨大的倒置树,树根就是 / (根目录)。

/ (根目录 - Root Directory)

根目录是整个文件系统层级结构的起点,所有其他目录和文件都位于这个目录之下。它包含了启动和运行系统所必需的核心目录。一个重要的原则是,根目录本身应该保持整洁,只存放必要的目录,一般不直接存放普通文件。

一级目录:核心系统与启动关键

这些是直接位于根目录 / 下的最关键目录,它们包含了系统启动、修复、基本操作和管理所必需的文件。

目录 全称 功能与详解
/bin Binaries (二进制文件) 存放所有用户(包括普通用户和超级用户)都可执行的基本命令。这些命令是系统在单用户模式或紧急修复模式下所必需的,不依赖于 /usr 目录。典型内容: ls, cp, mv, cat, bash现代变化:在多数新发行版中,此目录为指向 /usr/bin 的符号链接,以实现二进制文件的统一管理。
/sbin System Binaries (系统二进制文件) 存放仅限系统管理员 (root) 使用的系统管理和维护命令。用于启动、配置和修复系统。典型内容: fdisk, reboot, ifconfig, mkfs现代变化:与 /bin 类似,普遍成为 /usr/sbin 的符号链接。
/etc Etcetera (等等) 系统的心脏,存放所有系统级和应用程序的全局配置文件。这些文件几乎都是纯文本,定义了系统的行为。命名来源: "Etcetera" (等等),表示存放各种杂项配置文件。典型内容: /etc/passwd, /etc/fstab, /etc/hosts, /etc/ssh/sshd_config
/lib, /lib64 Libraries (库文件) 存放 /bin/sbin 目录下的程序所依赖的共享库文件 (shared libraries) 和内核模块。/lib64 是在64位系统上专门存放64位库的目录。这些库对于启动系统和执行根文件系统中的命令至关重要。现代变化:同样,这些目录也经常被链接到 /usr/lib/usr/lib64
/boot Boot Loader Files (启动加载文件) 存放与系统启动过程相关的所有文件,包括 Linux 内核 (vmlinuz)初始化内存盘 (initrd.img 或 initramfs) 以及启动加载器 (如 GRUB) 的配置文件。这是系统能够启动的根本,至关重要。
/dev Devices (设备文件) 在 Linux "一切皆文件" 的哲学下,此目录存放代表物理和虚拟硬件设备的文件。对这些文件的读写操作,就是与对应硬件的直接交互。典型内容: /dev/sda (硬盘), /dev/tty1 (终端), /dev/null (黑洞设备)。

/bin (User Binaries - 用户二进制文件)

  • 功能: 存放所有用户(包括普通用户和超级用户)都可以执行的基本命令。这些命令是单用户模式(一种用于系统维护的最小化模式)下所必需的。
  • 特点: 这里的命令都是系统正常运行和修复所依赖的基础工具。它们不依赖于其他目录下的库文件(例如 /usr/lib),因为在系统出现问题时,那些目录可能无法被挂载。
  • 典型内容: ls (列出文件), cp (复制), mv (移动), rm (删除), cat (查看文件), bash (Shell解释器), ping (网络测试)。
  • 现代变化: 在许多现代 Linux 发行版中 (如 Ubuntu, Fedora),/bin 实际上是一个指向 /usr/bin 的符号链接(软链接)。这样做是为了简化目录结构,将所有二进制文件统一管理。你可以通过 ls -l / 命令看到 bin -> usr/bin 的字样。

/sbin (System Binaries - 系统二进制文件)

  • 功能: 存放只有系统管理员 (root 用户) 才能执行的系统管理和维护命令。
  • 特点: 这些命令通常用于启动、关闭系统,或者配置网络、管理磁盘分区等。与 /bin 类似,它们也是系统基础运行所必需的。
  • 典型内容: ifconfig/ip (网络配置), fdisk (磁盘分区), reboot (重启), shutdown (关机), mkfs (创建文件系统)。
  • 现代变化:/bin 类似,/sbin 现在也普遍成为 /usr/sbin 的符号链接。

/etc (Etcetera - 配置文件)

  • 功能: 存放整个系统范围内的所有配置文件。这是 Linux 系统中最重要的目录之一。
  • 特点: 该目录下的文件几乎都是纯文本文件,可以直接使用文本编辑器 (如 vim, nano) 查看和修改。修改这些文件会改变系统或应用程序的行为。它不应该包含任何二进制文件。
  • 命名来源: "Etcetera" (等等) 的缩写,表示存放各种杂项配置文件。
  • 典型内容:
    • /etc/passwd: 用户账户信息。
    • /etc/shadow: 用户密码(加密后的)信息。
    • /etc/fstab: 系统启动时自动挂载的文件系统列表。
    • /etc/network/interfaces/etc/sysconfig/network-scripts/: 网络配置。
    • /etc/ssh/sshd_config: SSH 服务的配置文件。
    • /etc/hosts: 本地主机名到 IP 地址的映射。

/lib (Libraries - 库文件)

  • 功能: 存放系统核心二进制文件 (/bin/sbin 目录下的命令) 在启动和运行时所必需的基础共享库 (shared libraries) 文件
  • 特点: 这个目录的重要性等同于 /bin/sbin。如果此目录中的库文件丢失或损坏,系统可能无法启动,或者基础命令将无法执行。这些库必须存在于根文件系统中,以确保在 /usr 分区无法挂载的紧急情况下,系统依然可以进行基本的维护操作。
  • 典型内容:
    • ld-linux.so.\*: 动态链接器/加载器,它是程序执行的入口点,负责在程序运行前加载所有其他所需的共享库。
    • libc.so.\*: C语言标准库,几乎所有程序都依赖它来提供基本的 I/O、字符串处理、内存管理等功能。
    • libpthread.so.\*: POSIX 线程库,为程序提供多线程支持。
    • libm.so.\*: 数学库,提供数学计算功能。
    • 同时还包含一个 modules 子目录,存放可加载的内核模块 (drivers),这些模块通常是启动过程中必需的硬件驱动(如硬盘驱动)。
  • 现代变化:/bin/sbin 的趋势一致,在许多现代 Linux 发行版中,/lib 也被实现为一个指向 /usr/lib 的符号链接,目的是将所有库文件整合到 /usr 目录下,简化文件系统结构。你可以通过 ls -l / 命令查看 lib -> usr/lib

/lib64 (64-bit Libraries - 64位库文件)

  • 功能:64位 (x86_64) 架构的 Linux 系统上,专门用于存放 64 位版本的核心共享库文件。
  • 特点: 这是为了解决在同一系统上同时支持 32 位和 64 位应用程序的需求(多架构支持,Multi-arch)。64 位程序链接到 /lib64 中的库,而 32 位程序则链接到 /lib 中的库。这样可以避免同名库文件因架构不同而产生的冲突。如果系统是纯 64 位的,/lib 可能只包含少量文件,或者直接链接到 /lib64
  • 典型内容: 内容与 /lib 目录类似,但均为 64 位编译版本,例如 64 位的 libc.so.*, ld-linux-x86-64.so.2 等。
  • 现代变化: 同样地,在统一文件系统结构的趋势下,/lib64 在很多现代发行版中也成为了一个指向 /usr/lib64(或在某些系统中是 /usr/lib)的符号链接。

/boot (Boot Loader Files - 启动加载文件)

  • 功能: 存放启动 Linux 系统所需的一切核心文件。这个目录的内容是计算机加电后,在操作系统内核完全接管之前,由启动加载器 (Boot Loader) 使用的。
  • 特点: 这是整个系统中至关重要的目录,如果它被损坏,系统将无法启动。它通常被建议放在一个独立的小分区上(例如 200MB - 500MB),这样做的好处是即使根分区 (/) 文件系统损坏,只要 /boot 分区完好,依然有可能引导系统进入修复模式。该目录的内容一般不应由用户随意改动。
  • 典型内容:
    • vmlinuz-version: 这是 Linux 内核的可执行文件。"vm" 代表 "Virtual Memory"(虚拟内存),"z" 表示它是经过压缩的。
    • initrd.img-versioninitramfs-version.img: 这是初始化内存盘 (Initial RAM Disk)。它是一个小型的根文件系统,包含了在真正的根文件系统被挂载前,内核所需要访问的驱动程序和工具(例如硬盘驱动 SATA/NVMe 或文件系统驱动 ext4/xfs)。
    • config-version: 编译指定版本内核时的配置文件,记录了该内核启用了哪些功能和模块。
    • System.map-version: 内核符号表,它是一个内核函数名与内存地址的映射表,用于内核调试。
    • grub/grub2/ (子目录): 存放 GRUB (GRand Unified Bootloader) 启动加载器的配置文件,例如 grub.cfg,这个文件定义了启动菜单的选项、等待时间以及如何加载内核和 initrd 文件。
  • 现代变化: 该目录的结构和作用几十年来一直保持相对稳定,因为它的功能是底层且基础的。主要的变化在于启动加载器从传统的 LILO/GRUB Legacy 演进到了更强大、更安全的 GRUB2,以及 initrd 越来越多地被功能更强的 initramfs 所取代。

/dev (Device Files - 设备文件)

  • 功能: 存放代表硬件设备的文件。在 Linux 中,“一切皆文件”,硬件设备也不例外。
  • 特点: 这是一个非常特殊的目录。它下面的文件不是普通文件,而是指向物理设备(如硬盘、鼠标、声卡)或虚拟设备的接口。对这些文件进行读写操作,就相当于在与对应的硬件设备进行交互。
  • 典型内容:
    • /dev/sda, /dev/sdb: 代表第一块、第二块 SATA/SCSI 硬盘。
    • /dev/sda1: 代表第一块硬盘的第一个分区。
    • /dev/tty1: 代表第一个虚拟终端。
    • /dev/null: 一个特殊的“黑洞”设备,任何写入它的数据都会被丢弃。
    • /dev/zero: 一个产生无限 0 字符的设备。
    • /dev/random, /dev/urandom: 提供随机数的设备。

一级目录:用户数据与可变数据

目录 全称 功能与详解
/home Home Directories (用户主目录) 存放普通用户的个人数据和用户级的配置文件。每个用户在此有一个以其用户名命名的子目录(如 /home/alice)。最佳实践: 将 /home 挂载到独立分区,以便在重装系统时保留用户数据。
/root Root User's Home 超级用户 (root) 的主目录。其位置独立于 /home,是为了在 /home 分区出现问题时,root 用户依然能登录并进行系统维护。
/var Variable Files (可变文件) 存放内容在系统运行过程中会持续变化的文件。此目录经常增长,也建议挂载到独立分区。关键子目录:
- /var/log: 系统和应用日志文件,排错必看。
- /var/cache: 应用程序的缓存数据。
- /var/spool: 邮件、打印任务等队列数据。
- /var/lib: 应用程序的状态信息,如数据库文件。
/tmp Temporary Files (临时文件) 用于存放临时文件。所有用户都可在此目录中创建文件。系统会定期(通常在重启时)清理此目录的内容。

/home (Home Directories - 用户主目录)

  • 功能: 存放普通用户的个人数据和配置文件。
  • 特点: 每个用户在该目录下都有一个与自己用户名同名的子目录。例如,用户 alice 的主目录就是 /home/alice。这是用户登录后默认进入的目录。
  • 内容: 用户的文档、图片、音乐,以及用户个人应用程序的配置文件 (通常是隐藏文件,以 . 开头,如 .bashrc, .vimrc)。将 /home 放在独立分区是最佳实践,这样即使重装系统,用户的个人数据也能完好无损。
  • 注意: 超级用户 (root) 的主目录不是 /home/root,而是 /root

/root (Root User's Home - 超级用户主目录)

  • 功能: 存放超级用户 (root) 的个人数据和配置文件。它是 root 用户登录系统后的默认工作目录。
  • 特点: 将 root 的主目录与普通用户的 /home 目录分开,是出于系统稳定性和安全性的考虑。如果 /home 是一个独立的挂载分区,当该分区出现故障或无法挂载时,root 用户仍然可以成功登录系统(因为 /root 位于根分区),从而进行紧急修复。普通用户默认无法访问此目录下的内容。
  • 典型内容: 与普通用户主目录类似,包含 root 用户的个人配置文件 (如 .bashrc, .vimrc)、为 root 用户安装的软件的配置、重要的系统管理脚本或日志文件。

/var (Variable Files - 可变数据文件)

  • 功能: 存放内容在系统正常运行过程中会持续变化的文件。
  • 特点: 这个目录的大小会动态增长,因此有时会将其挂载到一个独立的分区上,以防其占满根分区的空间导致系统崩溃。
  • 典型内容 (子目录):
    • /var/log: 日志文件。系统和各种服务的运行日志都在这里,是排查问题的首选之地(如 /var/log/syslog, /var/log/auth.log)。
    • /var/spool: 存放各种队列数据,如邮件队列 (/var/spool/mail)、打印任务队列。
    • /var/cache: 应用程序的缓存数据,如 apt 包管理器的缓存。
    • /var/lib: 应用程序的状态信息,如数据库文件。
    • /var/tmp: 系统重启后不应被删除的临时文件。

/tmp (Temporary Files - 临时文件)

  • 功能: 用于存放应用程序和用户创建的临时文件。
  • 特点: 这是一个“世界可写”的目录,意味着所有用户都有权在此目录下创建文件。为了安全,/tmp 目录通常设置了粘滞位 (Sticky Bit) 权限。这意味着虽然大家都可以往里面放东西,但每个用户只能删除或修改自己创建的文件,无法删除别人的文件。此目录的内容通常在系统重启时会被自动清空。
  • 典型内容: 应用程序运行时产生的临时数据、会话文件、锁文件 (.lock) 以及用户临时存放的无需长期保留的文件。

/usr 目录:用户安装的软件与只读系统数据

/usr (Unix System Resources) 是 Linux 系统中占用空间最大的目录,用于存放系统安装后由用户和软件包管理器安装的程序和数据。它的内容在正常操作下应为只读,不受系统管理员的直接修改。

/usr 子目录 功能与详解
/usr/bin 存放绝大多数用户应用程序的二进制文件。与 /bin 不同,这里的命令不是系统启动所必需的。例如,firefox, gcc, python 等。
/usr/sbin 存放非系统启动所必需的系统管理命令。例如,Web 服务器、数据库服务器的管理程序。
/usr/lib, /usr/lib64 存放 /usr/bin/usr/sbin 中程序所依赖的共享库
/usr/include 存放 C/C++ 等语言的头文件 (.h 文件),用于程序编译。
/usr/share 存放体系结构无关的共享数据。例如,文档 (/usr/share/doc)、图标、man 帮助页 (/usr/share/man)。
/usr/local 本地安装目录。这是为系统管理员保留的,用于手动从源码编译和安装软件。安装到这里的软件不会被系统的包管理器覆盖。其下也遵循 bin, lib, share 等结构。
/usr/src 存放内核源代码或一些软件的源代码。

/usr/bin

  • 功能: 存放绝大多数用户应用程序的可执行文件。这些是构成系统功能主体的程序,但并非系统启动和修复所必需。
  • 特点: 这是普通用户 PATH 环境变量中的核心路径,包含了日常使用的大部分命令。
  • 典型内容: python3, gcc, git, code (VS Code), firefox 等几乎所有你通过包管理器 (如 apt, yum) 安装的图形化或命令行应用程序。

/usr/sbin

  • 功能: 存放非系统启动所必需的、供系统管理员使用的管理程序。
  • 特点: 这些程序通常用于管理网络服务或系统中的特定功能,普通用户一般无需使用。
  • 典型内容: 各种网络服务的后台守护进程和管理工具,如 httpd (Apache Web 服务器), sshd (SSH 服务), nfsd (NFS 服务)。

/usr/lib & /usr/lib64

  • 功能: 存放位于 /usr/bin/usr/sbin 中程序所依赖的共享库文件。
  • 特点: 这些库文件使得程序不必在自己的可执行文件中包含所有代码,从而减小了程序体积,也方便库的统一更新。/lib64 是在64位架构的系统上专门存放64位库的目录。
  • 典型内容: 大量的共享对象文件,如 libjpeg.so, libpython3.10.so.1.0

/usr/local

  • 功能: 为系统管理员保留的、用于手动安装软件的目录。
  • 特点: 当你从源代码编译安装软件时,默认的安装路径就是 /usr/local。这样做的好处是,将手动安装的软件与系统包管理器安装的软件隔离开,避免了未来系统升级时可能发生的冲突。它内部也遵循 bin, lib, share 等类似的层级结构。
  • 典型内容: 管理员自己编译的 nginx、特定版本的 node.js、或不受官方仓库支持的第三方工具。

/usr/share

  • 功能: 存放体系结构无关的共享数据。
  • 特点: 这里的文件不依赖于特定的CPU架构(如 x86_64 或 ARM),可以在不同架构的机器之间共享。
  • 典型内容: man 帮助文档 (/usr/share/man)、程序文档 (/usr/share/doc)、图标、字体、系统声音文件以及应用程序所需的通用数据文件。

/usr/src

  • 功能: 用于存放源代码。
  • 特点: 最常见的是存放 Linux 内核的源代码和头文件,这对于编译内核模块或某些需要与内核交互的驱动程序至关重要。
  • 典型内容: linux-headers-<kernel-version> 目录。

一级目录:可选软件与挂载点

目录 全称 功能与详解
/opt Optional (可选应用) 用于存放第三方、可选的大型商业或非开源软件包。每个软件包通常安装在以其名字命名的子目录中,如 /opt/google/chrome。这使得管理这些独立软件变得容易。
/mnt Mount (挂载) 一个通用的、临时的挂载点,供系统管理员手动挂载临时文件系统(如网络共享、另一块硬盘)。
/media Media Devices (媒体设备) 现代 Linux 系统中,用于自动挂载可移动媒体设备,如 U 盘、光盘、移动硬盘。系统会自动在此目录下为每个设备创建一个子目录。
/srv Service Data (服务数据) 存放一些系统提供的网络服务所需的数据。例如,Web 服务器的网站文件可以放在 /srv/www,FTP 服务的文件可以放在 /srv/ftp。其目的是将服务所需数据与配置文件 (/etc) 和可变数据 (/var) 分离。

/opt (Optional - 可选应用软件包)

  • 功能: 用于安装来自第三方供应商的、可选的、独立的软件包。
  • 特点: 这里的软件通常是“自成一体”的,会将其所有文件(二进制文件、库、文档等)都放在一个以其软件名命名的子目录中。这种方式便于管理和卸载(有时直接删除目录即可),也避免了将其文件散布到 /usr 的各个角落。
  • 典型内容: Google Chrome (/opt/google/chrome), Slack, Zoom, MATLAB, 以及一些大型商业软件或游戏。

/mnt (Mount - 临时挂载点)

  • 功能: 为系统管理员提供一个临时挂载文件系统的通用挂载点。
  • 特点: 这是一个历史悠久的占位符目录,主要用于手动、临时地挂载设备。例如,当你需要临时访问另一块硬盘的分区或一个网络共享时,可以手动将其挂载到 /mnt 下的一个子目录中。它本身默认是空的。
  • 典型内容: 通常为空,等待管理员手动挂载设备。例如:mount /dev/sdb1 /mnt

/media (Media - 可移动媒体)

  • 功能: 现代 Linux 系统中用于自动挂载可移动媒体设备的标准位置。
  • 特点: 与 /mnt 的手动、临时性质不同,/media 是为自动化设计的。当你插入一个 U 盘、SD 卡或外置硬盘时,系统会自动识别并在 /media 下以你的用户名或设备卷标创建一个目录,然后将设备挂载到该目录上。这为用户提供了即插即用的便利。
  • 典型内容: 以用户名和设备卷标命名的子目录,如 /media/alice/KINGSTON_USB

/srv (Service Data - 服务数据)

  • 功能: 存放本机为网络提供的特定服务所需的数据文件。
  • 特点: FHS 标准规定此目录用于存放“服务数据”。其目的是将一个网络服务(如网站)的数据内容与其配置文件 (/etc) 和日志文件 (/var/log) 分离开来,使目录结构更加清晰。
  • 典型内容: 网站的根目录 (/srv/www/srv/htdocs),FTP 服务对外共享文件的根目录 (/srv/ftp),或版本控制系统 (如 Git、SVN) 的仓库数据。

伪文件系统 (Pseudo Filesystems)

这些文件系统不实际存在于磁盘上,它们是内核数据在内存中的一种映射,允许用户通过文件接口来查看和修改内核的运行时状态。

目录 全称 功能与详解
/proc Processes(进程) 提供对内核数据结构和实时进程信息的访问接口。内容是动态生成的。关键内容
1. 以 PID 命名的数字目录,包含对应进程的全部信息。
2. 系统信息文件,如 /proc/cpuinfo, /proc/meminfo
/sys System 一个比 /proc 更现代、更结构化的虚拟文件系统,主要用于展示内核识别的设备树模型管理系统设备udev 服务依赖它来管理 /dev

/proc (Process Information Filesystem - 进程信息文件系统)

  • 功能: 这是一个虚拟文件系统,提供了对内核数据结构和进程信息的实时访问接口。
  • 特点: 它的内容是动态生成的,存储在内存中。当你 ls /proc 时,看到的文件和目录并不在硬盘上。当你读取其中一个文件时,内核会动态生成内容并返回给你。
  • 典型内容:
    • 数字目录: 每个正在运行的进程都有一个以其进程ID (PID) 命名的目录,如 /proc/1234。里面包含了该进程的所有信息,如 cmdline (启动命令), status (状态), maps (内存映射)。
    • 系统信息文件:
      • /proc/cpuinfo: CPU 的详细信息。
      • /proc/meminfo: 内存使用情况。
      • /proc/version: Linux 内核版本。
      • /proc/uptime: 系统已运行时间。

/sys (System Filesystem - 系统文件系统)

  • 功能: 另一个主要的虚拟文件系统,比 /proc 更加结构化,主要用于展示内核所识别的设备树模型和管理系统设备。
  • 特点: 它的层级结构非常清晰,反映了设备之间的连接关系。它也是 udev(现代 Linux 系统中负责管理 /dev 目录的后台服务)获取设备信息的主要来源。通过修改 /sys 下的某些文件,可以直接控制硬件设备的行为(例如,调整屏幕亮度)。
  • 典型内容 (子目录):
    • /sys/class: 按设备类别(如 net, sound, input)组织。
    • /sys/bus: 按总线类型(如 pci, usb)组织。
    • /sys/block: 块设备信息(如硬盘)。
    • /sys/devices: 系统中所有设备的层级视图。

总结

目录 类别 功能描述
/ 整个文件系统的起点
/bin, /sbin 核心系统 系统启动和修复所必需的基础命令
/etc 核心系统 全局配置文件
/lib, /lib64 核心系统 核心命令依赖的基础共享库
/boot 核心系统 内核及启动加载器文件
/home, /root 用户数据 普通用户和 root 用户的个人数据
/var 可变数据 日志、缓存、队列等动态变化的文件
/tmp 可变数据 临时文件,重启后清空
/usr 用户软件与只读数据 系统安装的绝大部分软件、库和共享数据
/opt 可选软件 第三方大型可选软件包
/mnt, /media 挂载点 临时手动挂载和可移动媒体自动挂载点
/srv 服务数据 系统提供的网络服务所需的数据
/dev 设备文件 硬件及虚拟设备的接口文件
/proc, /sys 伪文件系统 内核与进程的实时信息接口

参考文章

Linux 系统目录结构

Linux文件系统的层次结构

Linux文件系统层次结构标准FHS

posted @ 2025-06-04 00:10  phen  阅读(393)  评论(0)    收藏  举报