Linux 目录结构:从 FHS 3.0 看懂每个目录的作用

Lei

初次接触 Linux 时,根目录下的一长串目录很容易显得杂乱:/bin/etc/usr/var……其实它们并不是随意命名的。 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准) 为 Unix-like 系统约定了文件与目录的放置规则,让软件、运维工具和文档能在不同发行版之间保持更好的兼容性。

本文以 FHS 3.0 为主线,结合常见 Linux 发行版的实际情况,说明这些目录应当存放什么、为什么这样划分,以及日常排查时应优先去哪里找文件。

两个判断维度

理解目录用途时,可以先问两个问题:文件是静态的还是会变化的?是可被多台主机共享的还是机器专属的?例如,程序文档通常静态且可共享,日志则持续变化且与当前主机有关。

根目录 /

/ 是所有绝对路径的起点。无论磁盘、分区或网络存储如何挂载,最终都会出现在 / 以下的某个挂载点。根文件系统需要在系统启动的早期可用,因此其中保留了启动、修复和挂载其他文件系统所必需的内容。

可以用下面的命令查看当前系统的顶层目录与挂载关系:

1
2
ls -la /
findmnt

顶层目录

目录 核心作用 常见内容或场景
/bin 所有用户都可能需要的基础命令 shlscp 等;现代发行版常链接到 /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
2
ls -ld /bin /sbin /lib /lib64
readlink -f /bin
不要只凭路径判断文件类型

路径中的 /bin 并不保证文件一定是可执行程序,/dev 中的条目也不是普通文件。排查时可使用 filestatreadlink -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
2
ls /etc
systemctl cat sshd # 查看服务配置来源与覆盖项(以 SSH 服务为例)

常见示例:

  • /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
2
3
sudo mount /dev/sdb1 /mnt
findmnt /mnt
sudo umount /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>:软件作为相对独立的软件包发布,拥有自己的 binlibshare 等子目录。其主机配置通常放在 /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
2
sudo du -xhd1 /var | sort -h
sudo journalctl --disk-usage

/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 能删除自己的条目。应用写临时文件时应使用安全的随机文件名和正确权限,不要根据可预测的文件名直接创建文件。

文件定位

遇到一个软件或服务时,可以按下面的顺序寻找:

  1. 程序从哪里来:command -v <命令>,以及包管理器的文件清单。
  2. 配置在哪里:优先查看 /etc/<软件名>//etc/<软件名>.conf,再检查用户目录中的 ~/.config/
  3. 运行状态在哪里:查看 /run/<软件名>//var/lib/<软件名>//var/log/<软件名>/
  4. 软件是否手工安装:检查 /usr/local//opt/,而不是立刻修改 /usr 中的发行版文件。
1
2
3
4
command -v nginx
readlink -f "$(command -v nginx)"
systemctl status nginx
findmnt -T /var/log
为什么不能简单地认为“程序都在

可执行文件还可能在 /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 进行许可。
评论