1.5 Linux 文件系统结构

预计阅读时间:14 分钟

📖 目录

前置知识

学习目标

学完本章后,你将能够:

  • 理解 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准)的设计思想
  • 说出 /etc/var/home/usr/proc/dev 等核心目录各自存放什么
  • 区分绝对路径与相对路径(...~),并在两者之间自如切换
  • 理解家目录的典型结构(隐藏文件、.config 等)
  • 理解虚拟文件系统(/proc/sys/dev)与真实磁盘文件的区别
  • 在陌生系统上通过浏览目录结构快速判断它的用途和状态

知识关联

核心知识

  • FHS——Filesystem Hierarchy Standard,规定 Linux 目录体系的标准,让不同发行版保持一致的布局
  • 根目录(/)——目录树的起点,所有路径都从它开始
  • 绝对路径 vs 相对路径——绝对路径从 / 开始,相对路径从当前目录开始(...~
  • /etc——系统配置文件的集中存放地("神经中枢")
  • /var——运行时变化的数据:日志(/var/log)、缓存、队列
  • /home 与 /root——普通用户与 root 用户的家目录
  • /usr——系统安装的软件与库(可理解为"系统资源")
  • /proc、/sys、/dev——虚拟文件系统:内核状态、硬件设备在文件系统中的投影
  • /tmp——临时文件目录(重启后清空)

原理讲解

📝 为什么 Linux 只有一棵目录树?

Windows 用盘符(C:、D:)把磁盘分割成互不相干的"根",每个磁盘都有自己的顶层。Linux 则把所有磁盘分区都"挂载"(mount)到同一棵以 / 为根的树上——比如把第二个磁盘挂到 /data,把 U 盘挂到 /media/usb。这样做的好处:① 路径始终唯一,任何文件都可以用从 / 出发的路径定位,程序不需要关心文件在哪个磁盘;② 挂载是临时操作,同一个目录可以随时换成不同的磁盘。代价是需要理解"挂载点"这个概念——本章第 5 节会讲到。

1. FHS——文件系统层次结构标准

Linux 发行版有成百上千种,为什么你换了发行版还能找到 /etc/nginx?因为大家共同遵守 FHS(Filesystem Hierarchy Standard)。它不是法律,而是事实标准——绝大多数发行版都遵循它,把相同类型的文件放在相同位置:

目录一句话用途你的学习重点
/根目录,一切从这里开始不要随意在根目录直接放文件
/etc系统配置文件重点章(2.2:配置文件与系统设置 深入)
/var运行时的可变数据(日志等)/var/log 是排错第一站
/home普通用户的家目录你的所有私人文件
/rootroot 用户的家目录普通用户无权限进入
/usr系统软件与库命令大部分在这里
/opt第三方独立软件如 Google Chrome
/tmp临时文件重启清空,勿放重要数据
/boot内核与引导文件一般不需要动
/proc进程与内核状态(虚拟)查看系统信息的宝库
/sys设备与内核参数(虚拟)与 /proc 类似的虚拟文件系统
/dev设备文件一切皆文件的体现
/srv系统对外服务的数据(如网站文件)FHS 建议,实际常被忽略
/run运行时临时文件(内存中)系统服务运行时自动创建

2. 根目录纵览——ls / 走一遍

$ ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 逐个认识(前 10 个看用途,后面几个记住名字即可)
ls -l /           # 加 -l 看每个目录的详细信息

你会发现 /bin/lib/sbin/usr/bin/usr/lib/usr/sbin 的内容看起来重复——在 Ubuntu 24.04 上它们其实是符号链接:

$ ls -ld /bin /sbin /lib /lib64
lrwxrwxrwx 1 root root 7 2026-06-01 08:00 /bin -> usr/bin
lrwxrwxrwx 1 root root 7 2026-06-01 08:00 /sbin -> usr/sbin
lrwxrwxrwx 1 root root 7 2026-06-01 08:00 /lib -> usr/lib
lrwxrwxrwx 1 root root 7 2026-06-01 08:00 /lib64 -> usr/lib64

历史上 /bin/usr/bin 是分离的(/bin 放系统启动必需的命令),现代发行版已经把它们合并,保留顶层目录名只是兼容习惯。lscat 等命令你写 ls 还是 /bin/ls 都指向同一个文件。

3. 你的日常区域——/home、/root 与 /tmp

/home 下每个用户一个目录,你的家目录结构长这样:

$ ls -a ~
.  ..  .bashrc  .profile  .ssh/  .cache/  .config/  Documents/  Downloads/  Pictures/

# 以 . 开头的文件是隐藏文件(配置文件都在这里)
# .  = 当前目录,.. = 上级目录
  • . 开头的文件默认不显示(ls -a 查看)——它们是用户级配置文件(.bashrc.profile2.2:配置文件与系统设置 会讲)和程序数据目录(.config/.cache/
  • /root 是 root 用户的家目录——普通用户无法进入(权限,1.7:用户与权限管理 讲)
  • /tmp 所有用户可写,用于临时文件,系统重启时自动清空(/run 则是内存中的临时目录)
  • 系统中还有 /etc/skel/——新用户家目录的"模板":创建用户时,它的内容会被复制到新家目录

4. 系统程序与数据——/usr、/opt、/var

$ ls /usr/bin | head -5    # 系统命令:ls、cat、grep 都在这里
$ ls /usr/share | head -5  # 软件资源:文档、图标、区域设置
$ ls /var/log              # 系统日志:排错第一站
syslog  auth.log  apt/  dpkg.log  journal/

$ ls /opt                  # 第三方独立软件(如果装了的话)
google  

/usr(Unix System Resources)是系统软件的"大本营":/usr/bin 命令、/usr/lib 库、/usr/share 共享资源、/usr/local 手工编译安装的软件(apt 装到 /usr,手工装到 /usr/local,互不干扰)。/opt 放自包含的第三方商业软件(如 Chrome、JetBrains)。/var(variable)放运行时变化的数据:/var/log 日志、/var/cache 缓存、/var/lib 程序数据(如数据库文件)、/var/spool 待处理队列(邮件、打印任务)。

5. 虚拟文件系统——/proc、/sys、/dev

这三个目录里的"文件"不占磁盘空间,它们是内核和硬件在文件系统中的投影——读取它们就是在查询内核状态:

# /proc:进程与内核信息
ls /proc | head            # 数字目录 = 每个运行中的进程(PID)
cat /proc/meminfo | head -3   # 内存信息(free 命令的数据来源)
cat /proc/cpuinfo | grep "model name" | head -1   # CPU 型号
cat /proc/uptime           # 系统已运行秒数

# /sys:设备与内核对象(比 /proc 更有结构)
ls /sys/class/net          # 网络接口
ls /sys/class/block        # 块设备(磁盘)

# /dev:设备文件(一切皆文件的体现)
ls /dev/sda*               # 磁盘设备文件
ls /dev/null               # 黑洞设备(ch09 学过它的用法)

为什么文件大小是 0?

$ ls -l /proc/uptime
-r--r--r-- 1 root root 0 2026-08-01 08:00 /proc/uptime
# 大小 0 —— 数据是读取瞬间由内核动态生成的,不占磁盘

这也解释了 Linux 的一句话哲学:"一切皆文件"——硬件、内核状态都以文件的形式暴露,你不需要学习特殊的 API,用 catgrepecho 就能读写它们。

6. 绝对路径与相对路径——在目录树中定位自己

# 绝对路径:从 / 开始,任何时刻都唯一
cd /home/alice/Documents

# 相对路径:从当前目录开始
cd Documents              # 当前在 /home/alice 时,等价于上面
cd ../Downloads           # .. = 上级目录

# 三个特殊符号
.      # 当前目录        ./script.sh = 当前目录下的 script.sh
..     # 上级目录        ../../ = 上两级
~      # 家目录          ~/Documents 永远是你的 Documents

# 查看当前位置
pwd                      # 输出当前绝对路径
pwd -P                   # 显示真实路径(不显示符号链接)

判断该用哪种路径交互操作(自己敲命令)用相对路径最省事;写配置文件和脚本永远用绝对路径——脚本可能在任意目录被调用,相对路径会"找不到文件"。

# 容易混淆的例子
cd /home/alice            # 绝对路径:直接到家目录
cd home/alice             # 相对路径:找当前目录下的 home/alice —— 几乎肯定报错!

cd ~/Documents            # 家目录写法
cd "$HOME/Documents"      # 等价写法(脚本中推荐用 $HOME)

7. 挂载点——目录如何与磁盘关联

前面说过,Linux 的目录树横跨多个磁盘/分区。查看"哪个目录在哪个磁盘上":

$ df -h          # 查看磁盘使用情况(Filesystem 列 + Mounted on 列)
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       468G  127G  341G  28% /
/dev/sda1       511M  6.1M  505M   2% /boot/efi
tmpfs           3.8G     0  3.8G   0% /tmp
/dev/sdb1       917G  450G  421G  52% /data

$ lsblk           # 更直观的磁盘树状视图
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 476.9G  0 disk
├─sda1   8:1    0   511M  0 part /boot/efi
└─sda2   8:2    0 476.4G  0 part /
sdb      8:16   0 931.5G  0 disk
└─sdb1   8:17   0 931.5G  0 part /data

看懂这张表:/ 在磁盘 sda2 上,/data 在另一个磁盘 sdb1 上——但对用户来说,访问 /data/file.txt/etc/passwd 没有区别,路径就是路径。挂载是系统启动时自动完成的(/etc/fstab 定义),也可以手动 mount2.5:时间管理与日志 深入)。

示例代码

# 练习 1:走读根目录
ls /                        # 根目录下有哪些目录
ls -ld /etc /var /home /usr /proc /dev   # 一次看多个目录的详细信息

# 练习 2:探索 /proc
cat /proc/meminfo | head -5       # 内存信息
cat /proc/version                 # 内核版本
ls /proc/$(pgrep -x bash | head -1)/   # 某个 bash 进程的目录

# 练习 3:绝对路径与相对路径切换
cd ~
pwd                            # /home/alice
cd Documents
pwd                            # /home/alice/Documents
cd ../..                       # 上两级
pwd                            # /home
cd ~/Documents                 # 回到 Documents

# 练习 4:隐藏文件
ls -a ~                        # 家目录所有文件(含 . 开头的)
ls -la /etc | head             # 注意 . 和 .. 两个特殊目录

# 练习 5:查看磁盘与挂载
df -h
lsblk

# 练习 6:找"谁在用我的磁盘"
du -sh ~/* | sort -rh | head -10    # 家目录下最大的 10 项

常见错误

错误/误区解决方案
"把 /root 当成根目录 /"/ 是根目录;/root 是 root 用户的家目录。查看根目录用 ls /,不是 ls /root
"cd home/alice 报错"不带 /home/alice 是相对路径,从当前目录查找。想一步到家目录:cd /home/alicecd ~
"用 Windows 盘符思维找文件"Linux 没有盘符。所有磁盘都挂载在 / 树下(如 /data/mnt/usb)。用 lsblkdf -h 查看挂载关系。
"把临时文件放 / 或 /tmp 就忘了"/tmp 重启自动清空,放重要数据会丢。/ 根目录不应随手放文件——会弄乱系统布局,建议建 /data 或放家目录。
"在错误目录执行 rm -rf *"通配符 * 匹配当前目录所有内容。cd 后先用 pwd 确认位置,重要目录操作前先 ls 预览。用 rm -i 交互确认。
"试图直接编辑 /proc 下的文件"/proc/sys 是内核虚拟文件,大部分只读;即使可写(如 /proc/sys/)也只是运行时临时生效。系统参数修改应该用 sysctl2.2:配置文件与系统设置 讲)。

最佳实践

#建议说明
1脚本和配置文件中一律用绝对路径脚本可能在任意目录被调用,相对路径会"找不到文件"。交互操作才用相对路径。
2个人文件放家目录,数据放 /srv 或 /data别往 / 根目录、/usr 里塞个人文件——升级系统时可能被覆盖,而且会干扰系统布局。
3用 ~ 代替 /home/用户名家目录位置可能变化(如挂载到 /home 之外),~ 永远指向"当前用户的家"。
4掌握 lsblk 和 df -h 两个磁盘视角命令一台陌生服务器到手,先跑这两个命令——磁盘布局一目了然,这是最有效的"熟悉环境"方式之一。
5重要目录操作前先 pwd + ls 确认避免在错误目录执行 rm -rfmv 等破坏性操作。习惯性的"先确认再动手"能避免绝大多数事故。
6把 /var/log 当作排错第一站系统或服务出问题,先看 /var/log/syslog/var/log/auth.log(登录审计)——日志文件的位置是 FHS 给你最大的便利。

练习题

  1. (概念)FHS 是什么?为什么发行版不同,/etc/var 的用途却一样?
  2. (概念)绝对路径和相对路径的区别是什么?写配置文件和脚本时应该用哪种?为什么?
  3. (实操)用一条命令列出 /etc 下所有目录(不含文件)。提示:ls -d /etc/*/find /etc -maxdepth 1 -type d
  4. (实操)cat /proc/cpuinfo 查看你的 CPU 型号和核心数;用 cat /proc/meminfo 查看总内存。
  5. (实操)df -hlsblk 查看你的系统有哪些分区,每个分区挂载在哪里,用了多少空间。
  6. (实操)du -sh ~/* | sort -rh | head -5 找出家目录下最占空间的 5 个项目。
  7. (探究 🔍)研究 /etc/skel/ 目录的内容。创建一个新用户(sudo useradd -m testuser,学完 ch07 可以删掉它),用 sudo ls -a /home/testuser 对比 /etc/skel/ 的内容——理解"家目录模板"机制。
点击查看答案
  1. (概念)FHS 是文件系统层次结构标准,规定目录布局。发行版都遵循它,所以 `ls /etc`、`ls /var/log` 在任何 Linux 上看到的东西大致相同。这降低了学习成本和运维工具的跨发行版适配成本。
  2. (概念)绝对路径从 `/` 开始、永远唯一;相对路径依赖当前目录。配置文件和脚本要写绝对路径,因为脚本可能在任意位置被调用,相对路径解析会随调用位置改变而失效。
  3. (实操)`ls -d /etc/*/`(结尾的 / 匹配目录)。`find /etc -maxdepth 1 -type d` 是更严谨的写法。
  4. (实操)`grep "model name" /proc/cpuinfo` 查看 CPU 型号,`grep -c processor /proc/cpuinfo` 统计逻辑核心数。`head -3 /proc/meminfo` 查看内存总量(MemTotal)。
  5. (实操)`df -h` 看容量和挂载点,`lsblk` 看磁盘分区树。注意 `/boot/efi`、`/`、`/data`(如有)分别挂载在哪个分区。
  6. (实操)`du -sh ~/* | sort -rh | head -5`。若家目录有隐藏大目录(如 .cache),加 `du -sh ~/.[!.]*` 一并统计。
  7. (探究 🔍)`/etc/skel/` 是新用户家目录的模板:`useradd -m` 创建用户时会把 skel 的内容复制进新家目录。Ubuntu 的 skel 默认只有 `examples.desktop` 等少量文件,但管理员可以在里面预置 `.bashrc`、公钥等,让所有新用户自带统一配置。

学习检查点

学完本章后,请检验自己是否掌握以下内容:

检查项自测问题验证方法
概念理解能说出 /etc、/var、/usr、/home、/proc 各自存放什么尝试向他人讲解
命令操作能不查文档在绝对/相对路径之间自由切换(cd、pwd、~、..)在终端实际执行
原理掌握能解释"挂载点"概念和虚拟文件系统(/proc、/dev)的本质画出目录树与磁盘的映射图
故障排查能在陌生系统上通过 df、lsblk、/proc 快速了解磁盘与硬件状态找一台陌生机器实践
最佳实践能说明为什么脚本中要用绝对路径、重要数据不放 /tmp对比两种写法的结果

本章总结

FHS 给 Linux 的目录体系立了规矩:/etc 管配置、/var 管日志和数据、/home 管用户、/usr 管软件、/proc/dev 让内核与硬件"皆成文件"。理解绝对/相对路径和挂载点,你就拿到了阅读任何 Linux 系统的"地图"——接下来无论是找日志排错、改配置还是管理磁盘,都是在为这张地图上的具体坐标补细节。

速查表

概念一句话定义
FHS文件系统层次结构标准,统一各发行版目录布局
/etc系统配置文件
/var运行时可变数据(/var/log 日志)
/home普通用户家目录;/root 是 root 的家
/usr系统软件与库(/usr/bin、/usr/local)
/opt第三方独立软件
/tmp临时文件(重启清空)
/proc /sys /dev虚拟文件系统:内核状态与设备文件
绝对路径从 / 开始的完整路径,如 /etc/nginx/nginx.conf
相对路径相对当前目录,如 ../var/log、./script.sh
. / .. / ~当前目录 / 上级目录 / 家目录
挂载点目录与磁盘分区的关联点(df -h、lsblk 查看)

下一步:进入 ch06「文件查看与文本编辑」,学会查看文件内容和编辑文本——在走完地图后,开始阅读"地图上的文件"。

延伸阅读

  • man hier(7)——Ubuntu 官方手册对每个目录的权威解释
  • FHS 3.0 规范全文——Linux Foundation 发布的标准文档
  • 命令tree -L 2 /etcsudo apt install tree)——以树状图浏览目录结构,比 ls 直观得多
  • 命令lsblk -f——带文件系统类型的磁盘视图,比 df 更完整的"硬件地图"

常见问题

/etc、/usr、/var 分别存放什么?
/etc 存放系统配置文件(如 passwd、ssh/sshd_config、nginx/nginx.conf),/usr 存放只读的用户程序和数据(二进制、库、文档),/var 存放运行时变化的文件(日志在 /var/log、数据库在 /var/lib、邮件在 /var/mail)。理解这三个目录的职责有助于文件系统布局和维护。
/proc 目录里的文件是真实文件吗?
/proc 是虚拟文件系统(procfs),内容不在磁盘上,由内核动态生成。每个运行中的进程对应 /proc/PID 目录,/proc/cpuinfo 显示 CPU 信息,/proc/meminfo 显示内存使用。读取这些"文件"就是在查询内核状态,修改某些文件可以改变内核行为。
绝对路径和相对路径怎么区分?
绝对路径以 / 开头,从根目录开始定位,如 /home/user/docs/file.txt。相对路径不从 / 开始,相对于当前目录定位,如 docs/file.txt 或 ../docs/file.txt。脚本和配置文件中建议使用绝对路径,避免因当前目录不确定导致的错误。
↑ 回到顶部