1.5 Linux 文件系统结构
预计阅读时间:14 分钟
📖 目录
前置知识
- 1.4:基本文件操作命令 基本文件操作:
ls、cd、pwd、mkdir的基本用法 - 1.3:第一次进入命令行 命令提示符:理解
~符号在提示符中的含义
学习目标
学完本章后,你将能够:
- 理解 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准)的设计思想
- 说出
/etc、/var、/home、/usr、/proc、/dev等核心目录各自存放什么 - 区分绝对路径与相对路径(
.、..、~),并在两者之间自如切换 - 理解家目录的典型结构(隐藏文件、.config 等)
- 理解虚拟文件系统(
/proc、/sys、/dev)与真实磁盘文件的区别 - 在陌生系统上通过浏览目录结构快速判断它的用途和状态
知识关联
- 前置知识:1.4:基本文件操作命令 的
ls/cd/pwd——本章用它们走读目录树 - 后续影响:1.7:用户与权限管理 用户与权限(家目录权限、
/etc/passwd等系统文件);2.2:配置文件与系统设置 配置文件与系统设置(/etc目录深入);2.3:系统信息与性能查看 系统信息与性能查看(/proc实时状态);rhcsa01 磁盘分区与 LVM(挂载点概念) - 配套技术:1.3:第一次进入命令行 的 Tab 补全和
man在导航目录时最常用 - 在整个体系中的位置:目录结构是"Linux 世界的地图"。知道每个目录放什么,才能快速定位配置文件、日志和程序——这是所有系统管理工作的起点
核心知识
- FHS——Filesystem Hierarchy Standard,规定 Linux 目录体系的标准,让不同发行版保持一致的布局
- 根目录(/)——目录树的起点,所有路径都从它开始
- 绝对路径 vs 相对路径——绝对路径从
/开始,相对路径从当前目录开始(.、..、~) - /etc——系统配置文件的集中存放地("神经中枢")
- /var——运行时变化的数据:日志(
/var/log)、缓存、队列 - /home 与 /root——普通用户与 root 用户的家目录
- /usr——系统安装的软件与库(可理解为"系统资源")
- /proc、/sys、/dev——虚拟文件系统:内核状态、硬件设备在文件系统中的投影
- /tmp——临时文件目录(重启后清空)
原理讲解
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 | 普通用户的家目录 | 你的所有私人文件 |
/root | root 用户的家目录 | 普通用户无权限进入 |
/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 放系统启动必需的命令),现代发行版已经把它们合并,保留顶层目录名只是兼容习惯。ls、cat 等命令你写 ls 还是 /bin/ls 都指向同一个文件。
3. 你的日常区域——/home、/root 与 /tmp
/home 下每个用户一个目录,你的家目录结构长这样:
$ ls -a ~
. .. .bashrc .profile .ssh/ .cache/ .config/ Documents/ Downloads/ Pictures/
# 以 . 开头的文件是隐藏文件(配置文件都在这里)
# . = 当前目录,.. = 上级目录
- . 开头的文件默认不显示(
ls -a查看)——它们是用户级配置文件(.bashrc、.profile,2.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,用 cat、grep、echo 就能读写它们。
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 定义),也可以手动 mount(2.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/alice 或 cd ~。 |
| "用 Windows 盘符思维找文件" | Linux 没有盘符。所有磁盘都挂载在 / 树下(如 /data、/mnt/usb)。用 lsblk 和 df -h 查看挂载关系。 |
| "把临时文件放 / 或 /tmp 就忘了" | /tmp 重启自动清空,放重要数据会丢。/ 根目录不应随手放文件——会弄乱系统布局,建议建 /data 或放家目录。 |
| "在错误目录执行 rm -rf *" | 通配符 * 匹配当前目录所有内容。cd 后先用 pwd 确认位置,重要目录操作前先 ls 预览。用 rm -i 交互确认。 |
| "试图直接编辑 /proc 下的文件" | /proc、/sys 是内核虚拟文件,大部分只读;即使可写(如 /proc/sys/)也只是运行时临时生效。系统参数修改应该用 sysctl(2.2:配置文件与系统设置 讲)。 |
最佳实践
| # | 建议 | 说明 |
|---|---|---|
| 1 | 脚本和配置文件中一律用绝对路径 | 脚本可能在任意目录被调用,相对路径会"找不到文件"。交互操作才用相对路径。 |
| 2 | 个人文件放家目录,数据放 /srv 或 /data | 别往 / 根目录、/usr 里塞个人文件——升级系统时可能被覆盖,而且会干扰系统布局。 |
| 3 | 用 ~ 代替 /home/用户名 | 家目录位置可能变化(如挂载到 /home 之外),~ 永远指向"当前用户的家"。 |
| 4 | 掌握 lsblk 和 df -h 两个磁盘视角命令 | 一台陌生服务器到手,先跑这两个命令——磁盘布局一目了然,这是最有效的"熟悉环境"方式之一。 |
| 5 | 重要目录操作前先 pwd + ls 确认 | 避免在错误目录执行 rm -rf、mv 等破坏性操作。习惯性的"先确认再动手"能避免绝大多数事故。 |
| 6 | 把 /var/log 当作排错第一站 | 系统或服务出问题,先看 /var/log/syslog、/var/log/auth.log(登录审计)——日志文件的位置是 FHS 给你最大的便利。 |
练习题
- (概念)FHS 是什么?为什么发行版不同,
/etc和/var的用途却一样? - (概念)绝对路径和相对路径的区别是什么?写配置文件和脚本时应该用哪种?为什么?
- (实操)用一条命令列出
/etc下所有目录(不含文件)。提示:ls -d /etc/*/或find /etc -maxdepth 1 -type d。 - (实操)用
cat /proc/cpuinfo查看你的 CPU 型号和核心数;用cat /proc/meminfo查看总内存。 - (实操)用
df -h和lsblk查看你的系统有哪些分区,每个分区挂载在哪里,用了多少空间。 - (实操)用
du -sh ~/* | sort -rh | head -5找出家目录下最占空间的 5 个项目。 - (探究 🔍)研究
/etc/skel/目录的内容。创建一个新用户(sudo useradd -m testuser,学完 ch07 可以删掉它),用sudo ls -a /home/testuser对比/etc/skel/的内容——理解"家目录模板"机制。
点击查看答案
- (概念)FHS 是文件系统层次结构标准,规定目录布局。发行版都遵循它,所以 `ls /etc`、`ls /var/log` 在任何 Linux 上看到的东西大致相同。这降低了学习成本和运维工具的跨发行版适配成本。
- (概念)绝对路径从 `/` 开始、永远唯一;相对路径依赖当前目录。配置文件和脚本要写绝对路径,因为脚本可能在任意位置被调用,相对路径解析会随调用位置改变而失效。
- (实操)`ls -d /etc/*/`(结尾的 / 匹配目录)。`find /etc -maxdepth 1 -type d` 是更严谨的写法。
- (实操)`grep "model name" /proc/cpuinfo` 查看 CPU 型号,`grep -c processor /proc/cpuinfo` 统计逻辑核心数。`head -3 /proc/meminfo` 查看内存总量(MemTotal)。
- (实操)`df -h` 看容量和挂载点,`lsblk` 看磁盘分区树。注意 `/boot/efi`、`/`、`/data`(如有)分别挂载在哪个分区。
- (实操)`du -sh ~/* | sort -rh | head -5`。若家目录有隐藏大目录(如 .cache),加 `du -sh ~/.[!.]*` 一并统计。
- (探究 🔍)`/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 /etc(sudo apt install tree)——以树状图浏览目录结构,比 ls 直观得多 - 命令:
lsblk -f——带文件系统类型的磁盘视图,比 df 更完整的"硬件地图"