Linux 目录结构:从 FHS 3.0 看懂每个目录的作用
初次接触 Linux 时,根目录下的一长串目录很容易显得杂乱:/bin、/etc、/usr、/var……其实它们并不是随意命名的。 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准) 为 Unix-like 系统约定了文件与目录的放置规则,让软件、运维工具和文档能在不同发行版之间保持更好的兼容性。
本文以 FHS 3.0 为主线,结合常见 Linux 发行版的实际情况,说明这些目录应当存放什么、为什么这样划分,以及日常排查时应优先去哪里找文件。
理解目录用途时,可以先问两个问题:文件是静态的还是会变化的?是可被多台主机共享的还是机器专属的?例如,程序文档通常静态且可共享,日志则持续变化且与当前主机有关。
根目录 /
/ 是所有绝对路径的起点。无论磁盘、分区或网络存储如何挂载,最终都会出现在 / 以下的某个挂载点。根文件系统需要在系统启动的早期可用,因此其中保留了启动、修复和挂载其他文件系统所必需的内容。
可以用下面的命令查看当前系统的顶层目录与挂载关系:
1 | ls -la / |
顶层目录
| 目录 | 核心作用 | 常见内容或场景 |
|---|---|---|
/bin |
所有用户都可能需要的基础命令 | sh、ls、cp 等;现代发行版常链接到 /usr/bin |
/boot |
启动加载器使用的静态文件 | 内核、initramfs、GRUB 配置 |
/dev |
设备文件 | 磁盘、终端、伪设备,如 /dev/sda、/dev/null |
/etc |
本机级系统配置 | 服务配置、账户相关配置、网络配置 |
/home |
普通用户的家目录 | /home/alice 中的个人文件和用户配置 |
/lib |
启动与基础命令所需的库和内核模块 | 动态链接库、/lib/modules;常链接到 /usr/lib |
/media |
可移动介质的挂载点 | U 盘、光盘等自动挂载位置 |
/mnt |
临时手动挂载的挂载点 | 排障时临时挂载一个分区 |
/opt |
附加、第三方应用软件包 | 自包含商业软件或大型附加软件 |
/root |
root 用户的家目录 |
管理员私有配置和文件 |
/run |
本次启动期间的运行时数据 | PID、套接字、会话和服务状态;重启后通常消失 |
/sbin |
系统管理所需的基础命令 | 启动、修复、挂载等管理程序;常链接到 /usr/sbin |
/srv |
本机对外提供服务的数据 | 网站、FTP 或版本库服务的数据根目录 |
/tmp |
短期临时文件 | 程序临时文件,通常允许所有用户写入 |
/usr |
大部分用户空间程序与只读共享资源 | 命令、库、文档、语言数据等 |
/var |
经常变化的持久数据 | 日志、缓存、队列、数据库状态等 |
启动与运行基础
基础命令与库
传统 FHS 将能让系统进入可用状态的最小集合放在根文件系统中:
/bin放置所有用户都可能需要的基本命令;/sbin放置系统管理和修复所需的基本管理命令;/lib放置这些命令运行所需的共享库,以及内核模块。
这个划分的历史原因是:早期系统可能需要在 /usr 尚未挂载时完成启动或修复。如今许多发行版采用 usr merge:/bin、/sbin 和 /lib 实际上是指向 /usr 下对应目录的符号链接。这不代表它们失去意义,而是把原先分开的层级合并实现,同时保留兼容路径。
1 | ls -ld /bin /sbin /lib /lib64 |
路径中的 /bin 并不保证文件一定是可执行程序,/dev 中的条目也不是普通文件。排查时可使用 file、stat 和 readlink -f 查看真实类型及最终位置。
/boot:启动文件
/boot 保存启动加载器和内核启动所需的静态内容,常见文件包括内核镜像 vmlinuz-*、初始内存盘 initramfs-* 或 initrd-*,以及引导器相关文件。某些加密或多系统安装会将它作为独立分区挂载。
不要把日常数据或应用程序放进 /boot;空间往往较小,内核更新也会直接使用这里。
/run:运行时数据
/run 保存运行时可变数据,例如服务 PID、Unix socket、锁、登录会话和临时状态。它通常由内存文件系统承载,因此重启后内容不会保留。FHS 3.0 还规定旧路径 /var/run 应当兼容到 /run。
常见位置包括:
/run/user/<UID>:某个登录用户的运行时目录;/run/systemd/:systemd 的运行时状态;/run/<service>/:服务自身的 PID、socket 或状态文件。
配置、用户与设备
/etc:系统配置
/etc 存放主机专属的系统配置文件。它不应用来放置可执行程序、普通数据文件或临时文件。实际排查服务时,通常可从这里开始:
1 | ls /etc |
常见示例:
/etc/passwd、/etc/group:账户与用户组的基础信息;/etc/fstab:文件系统的静态挂载配置;/etc/hosts、/etc/resolv.conf:本机名称解析相关配置;/etc/systemd/system/:管理员创建的 systemd 单元或覆盖配置;/etc/opt/:安装在/opt中的软件的配置。
/home 与 /root:用户目录
/home 通常包含普通用户的家目录;个人文件、Shell 配置、SSH 配置和桌面应用配置大多位于此处,例如 ~/.bashrc、~/.config/、~/.ssh/。/root 则是超级用户 root 的家目录。
将 /root 与 /home/root 区分开来有实际意义:当 /home 是独立文件系统且尚未挂载时,管理员仍能登录并修复系统。
/dev:设备文件
/dev 里的条目多数是设备节点或由内核、udev 动态创建的伪设备,不是保存真实数据的普通文件。例如:
/dev/sda、/dev/nvme0n1:块设备;/dev/tty、/dev/pts/*:终端设备;/dev/null:丢弃写入数据的伪设备;/dev/random、/dev/urandom:随机数接口。
通常不要手工删除或随意创建 /dev 中的条目;应该通过设备管理机制或相应的系统工具处理。
/media 与 /mnt:挂载点
/media 用于可移动介质,例如桌面环境自动挂载的 U 盘;/mnt 则是管理员临时手动挂载文件系统的传统位置。长期使用的数据盘更适合选择语义明确的挂载点,并通过 /etc/fstab 或 systemd mount unit 管理。
1 | sudo mount /dev/sdb1 /mnt |
/usr:用户空间软件
/usr 不是“用户个人目录”的缩写。它是系统中大部分可共享、相对静态的用户空间内容所在的层级。发行版通过包管理器安装的程序、库、文档、字体、翻译和图标,常常位于这里。
| 子目录 | 作用 |
|---|---|
/usr/bin |
大多数用户命令 |
/usr/sbin |
非启动关键的系统管理命令 |
/usr/lib |
程序库、包私有支持文件等 |
/usr/libexec |
由其他程序调用、通常不供用户直接执行的辅助程序 |
/usr/include |
C/C++ 等开发所用的头文件 |
/usr/share |
与 CPU 架构无关的共享静态数据,如文档、图标、locale、时区数据 |
/usr/src |
源代码,常见于内核源码或相关构建内容 |
/usr/local |
本机管理员自行安装的软件,避免与发行版包文件混在一起 |
/usr/local 与 /opt:如何选择
两者都常用于非发行版自带的软件,但组织方式不同:
- 选择
/usr/local:本机自行编译或安装、希望融入系统目录布局的软件。例如程序放在/usr/local/bin,库放在/usr/local/lib。 - 选择
/opt/<vendor-or-package>:软件作为相对独立的软件包发布,拥有自己的bin、lib、share等子目录。其主机配置通常放在/etc/opt/<package>,可变数据放在/var/opt/<package>。
由发行版包管理器管理的文件尽量保持在包的默认位置;手工安装的软件集中在 /usr/local 或 /opt。这样升级、卸载和排查文件归属时更清晰。
/var:可变持久数据
与偏静态的 /usr 相对,/var 用于程序运行后不断改变的数据。它们往往需要跨重启保留,因此不要把 /var 与 /run 混为一谈。
| 子目录 | 作用 | 典型内容 |
|---|---|---|
/var/cache |
可再生成的缓存 | 包管理器缓存、应用缓存 |
/var/lib |
程序的持久状态 | 数据库、包管理器状态、服务元数据 |
/var/log |
日志文件和目录 | 系统日志、服务日志、审计日志 |
/var/lock |
锁文件 | 设备或资源占用标记;常兼容到 /run/lock |
/var/mail |
用户邮箱文件 | 本地邮件投递数据 |
/var/opt |
/opt 软件的可变数据 |
附加软件的状态或数据 |
/var/spool |
等待后续处理的队列数据 | 打印、邮件、定时任务队列 |
/var/tmp |
跨重启保留更久的临时文件 | 长时间任务的临时产物 |
排查磁盘空间时,/var/log、/var/lib 和 /var/cache 往往是首选检查点:
1 | sudo du -xhd1 /var | sort -h |
/var/cache 中的数据通常可以由程序重新生成,但清理前仍应使用对应包管理器或应用提供的命令;/var/lib 往往是关键业务状态,不能因为“文件很多”就直接删除。
虚拟文件系统
FHS 重点规定文件与目录的布局;现代 Linux 还广泛使用由内核提供的虚拟文件系统。它们看似位于根目录下,却不是普通磁盘目录。
| 目录 | 作用 | 使用提醒 |
|---|---|---|
/proc |
进程和内核状态接口 | 如 /proc/cpuinfo、/proc/<PID>;内容动态生成 |
/sys |
sysfs,暴露设备、驱动和内核对象 | 可查看硬件与设备属性,写入会影响内核行为 |
/sys/fs/cgroup |
cgroup 资源控制接口 | systemd、容器和资源限制常会使用 |
/lost+found |
ext 文件系统修复时恢复孤立文件的地方 | 通常只在该文件系统根部出现,不是通用应用目录 |
不要对 /proc 或 /sys 使用不加限制的 du、递归备份或批量修改命令;它们可能包含动态、无限或具有控制作用的节点。
临时与运行时文件
| 位置 | 是否应跨重启保留 | 适合存放 |
|---|---|---|
/tmp |
不应依赖保留;系统可能随重启或定期任务清理 | 短生命周期的临时文件 |
/var/tmp |
设计上比 /tmp 保留更久,可跨重启 |
较长任务需要恢复的临时产物 |
/run |
不保留,通常在启动时创建 | 本次启动的 PID、socket、状态文件 |
/tmp 一般带有 sticky bit:所有人都可创建文件,但只有文件所有者、目录所有者或 root 能删除自己的条目。应用写临时文件时应使用安全的随机文件名和正确权限,不要根据可预测的文件名直接创建文件。
文件定位
遇到一个软件或服务时,可以按下面的顺序寻找:
- 程序从哪里来:
command -v <命令>,以及包管理器的文件清单。 - 配置在哪里:优先查看
/etc/<软件名>/、/etc/<软件名>.conf,再检查用户目录中的~/.config/。 - 运行状态在哪里:查看
/run/<软件名>/、/var/lib/<软件名>/与/var/log/<软件名>/。 - 软件是否手工安装:检查
/usr/local/、/opt/,而不是立刻修改/usr中的发行版文件。
1 | command -v nginx |
为什么不能简单地认为“程序都在
可执行文件还可能在 /usr/sbin、/usr/local/bin、/opt/<package>/bin,或者隐藏在容器、虚拟环境与用户目录中。并且很多服务真正执行的是 /usr/libexec 下的辅助程序。因此,优先使用 command -v、包管理器查询和 systemd 单元文件追踪,而不是只靠猜路径。
小结
Linux 的目录布局本质上是一套“文件该放在哪里”的协作约定:/etc 放配置,/usr 放大部分静态软件资源,/var 放持续变化的数据,/run 放本次启动的状态,/home 放普通用户文件。掌握这条主线后,无论是安装软件、排查服务、清理磁盘,还是阅读部署文档,都能更快定位到正确的位置。
本文目录职责以随文提供的《Filesystem Hierarchy Standard》Version 3.0(Linux Foundation,2015)为依据;可阅读 FHS 3.0 官方原文。发行版可能因 usr merge、systemd、容器环境或兼容需求而以符号链接和具体实现作出调整。
- 标题: Linux 目录结构:从 FHS 3.0 看懂每个目录的作用
- 作者: Lei
- 创建于 : 2026-07-30 00:10:00
- 更新于 : 2026-08-01 11:04:25
- 链接: https://steins.top//linux-filesystem/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。