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-version或initramfs-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: 系统已运行时间。
- 数字目录: 每个正在运行的进程都有一个以其进程ID (PID) 命名的目录,如
/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 |
伪文件系统 | 内核与进程的实时信息接口 |

浙公网安备 33010602011771号