Linux 文件系统与目录结构:一张图看懂根目录下每个文件夹
运维学习路线系列 · 阶段一 Linux 地基 · 第 1 篇
适用环境:Ubuntu 24.04 LTS(CentOS Stream 9 差异会单独标注),普通用户(有 sudo)
阅读前提:零基础,有一台能开机的 Linux(虚拟机即可)
前言:第一个劝退现场
刚装好 Ubuntu 的你cd /然后ls一下,迎面而来一排目录:
bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var然后你打开网上的教程想找 nginx 配置,教程说"在/etc/nginx";想找日志,帖子说"在/var/log";想看 MySQL 数据目录,有人说/var/lib/mysql——为什么偏偏是这些目录?谁规定的?
这篇就干一件事:把根目录下每个文件夹的职责讲清楚,让你以后"猜都能猜到文件该在哪"。这不是背目录游戏,FHS(Filesystem Hierarchy Standard,文件系统层级标准)是后面所有篇目的地基——排错时 3 秒定位文件位置,靠的就是它。
一、一句话总纲:一切皆文件
Linux 的设计哲学是"一切皆文件":
- 硬盘是文件(
/dev/sda) - 键盘是文件(
/dev/input/event0) - 进程信息是文件(
/proc/1234/) - 随机数生成器是文件(
/dev/urandom)
好处是操作统一:读设备、读进程信息、读普通文件,用的是同一套cat/echo/重定向。记住这句话,后面很多"玄学"操作都会变得合理。
二、一张表看懂根目录(FHS 精华版)
| 目录 | 存什么 | 记忆锚点 | 你会什么时候碰它 |
|---|---|---|---|
/etc | 配置文件(全是文本) | EditableTextConfiguration | 改 nginx/mysql/sshd 配置,日常最高频 |
/home | 普通用户的家目录 | 每个用户一个文件夹 | cd ~就到这;代码、个人文件 |
/root | root 用户的家目录 | 注意:不在 /home 下 | 用 root 登录时的~ |
/var | 经常变化的数据:日志、缓存、数据库数据 | variable | /var/log排错必去;/var/lib/mysql |
/tmp | 临时文件,重启可能清空 | temporary | 程序运行时的中转站,别存重要东西 |
/usr | 系统软件资源(只读性质):程序、库、文档 | UnixSoftwareResource | /usr/bin大部分命令在这 |
/bin→/usr/bin | 可执行命令 | 现代发行版里/bin是软链接 | 敲的每条命令 |
/sbin→/usr/sbin | 系统管理命令(root 用) | super user bin | fdisk、ip、reboot |
/opt | 第三方/自装大型软件 | optional | 自己编译装的软件、某些商业软件 |
/srv | 对外提供服务的数据 | service | 网站根目录放过这,现在多在/var/www或/opt |
/boot | 内核与引导文件 | 🚨 别动,删了开不了机 | 只在修 GRUB 时碰(阶段二讲) |
/dev | 设备文件 | 一切皆文件的具象 | 挂载磁盘、看终端设备 |
/proc | 内核与进程的实时信息(内存里,不占磁盘) | process | 看进程参数、系统状态,排错神器 |
/sys | 内核对象(设备/驱动/总线)的接口 | 较少直接手改 | 调磁盘调度器等高级操作 |
/run | 开机以来的运行时数据(PID、socket) | 早期在/var/run | systemd 时代的产物 |
/mnt//media | 手动/自动挂载点 | mount/ U盘等媒体 | 插 U 盘、临时挂新硬盘 |
💡记忆优先级:先把
/etc(配置)、/var(日志数据)、/home(个人文件)、/proc(实时状态)四个记牢——运维日常 80% 的时间在这四个目录里打转。
三、重点目录展开讲
3.1 /etc:运维的主战场
# /etc 下你能背出来的高频文件/etc/nginx/nginx.conf# nginx 主配置/etc/mysql/mysql.conf.d/# MySQL 配置目录(Ubuntu 拆分风格)/etc/ssh/sshd_config# SSH 服务端配置(阶段二加固篇主角)/etc/fstab# 开机自动挂载清单(磁盘篇主角)/etc/hosts# 本机静态域名解析/etc/systemd/system/# 你自己写的 systemd 服务单元两个约定俗成:①/etc下的文件全是纯文本,改配置 = 改文本;②改配置前先备份:
sudocp/etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date+%F)这是能救你职业生涯的小习惯。
3.2 /var:日志与数据的水库
/var/log/ # 所有服务日志的家(syslog、auth.log、nginx/ 目录…) /var/lib/mysql/ # MySQL 数据目录 /var/lib/docker/ # Docker 数据目录(容器、镜像、卷全在这,阶段五讲过) /var/www/html/ # Debian 系默认网站根目录 /var/spool/cron/ # 用户的 crontab 文件(第 8 篇讲)为什么日志会撑爆磁盘?因为/var/log只进不出——这就是后面第 8 篇要讲的 logrotate(日志轮转)存在的意义,也是你已有 Runbook 里"磁盘 85% 告警"最常炸的位置。
3.3 /proc:不占磁盘的"假"目录
/proc里的内容是内核实时生成的,每次看都是"现场直播":
cat/proc/meminfo|head-3# 内存实况cat/proc/cpuinfo|grep"model name"|uniq# CPU 型号cat/proc/loadavg# 负载(阶段二性能排查篇细讲)ls/proc/# 数字目录 = 每个进程一个文件夹cat/proc/1234/status# 看指定进程的状态💡 回顾《S5-04 Docker 原理篇》的悬念:“容器里 top 看到整机内存”——因为容器默认挂载的
/proc就是宿主机的/proc。现在你能串起来了。
3.4 Ubuntu 与 CentOS 的主要差异
| 项 | Ubuntu 24.04 | CentOS Stream 9 |
|---|---|---|
| 默认软件源 | apt /.deb包 | dnf(yum) /.rpm包 |
| 网卡配置 | NetPlan(/etc/netplan/) | NetworkManager(nmcli) |
| 日志 | rsyslog + journald 并存 | 以 journald 为主 |
| 软件包安装位置 | 同样遵守 FHS,基本一致 | 同左 |
FHS 是跨发行版通用的,差异主要在"怎么改配置的工具",不在"配置在哪"——这也是先学 FHS 的价值。
四、绝对路径与相对路径,以及三个符号
绝对路径:从 / 开始,全世界唯一 /etc/nginx/nginx.conf 相对路径:从"当前所在位置"出发 ./nginx.conf 或 ../ssh/sshd_config| 符号 | 含义 | 例子 |
|---|---|---|
. | 当前目录 | ./run.sh明确执行本目录脚本 |
.. | 上一级目录 | cd .. |
~ | 当前用户的家目录 | cd ~回家;cd ~/projects |
- | (cd 专属)上一次所在目录 | cd -在两个目录间来回切 |
🚨经典坑:脚本里写cd test(相对路径)而不是cd /opt/app/test(绝对路径)——crontab 执行脚本时起始目录不是你登录时的目录,脚本就会"时灵时不灵"。规则:脚本里一律用绝对路径(第 8 篇 crontab 篇还会再踩这个坑)。
五、动手实验:10 分钟建立目录直觉
# ① 看目录结构树(装个 tree)sudoaptinstalltree-ytree-L1/ tree-L2/etc/nginx# 配置文件的组织方式# ② 验证 /proc 是"直播"cat/proc/uptime# 隔几秒执行两次,数字一直在涨# ③ 找一个服务的"三件套":配置(/etc)、数据(/var/lib)、日志(/var/log)ls/etc/nginx /var/log/nginx /var/www/html# ④ 看 /bin 是不是软链接ls-ld/bin /sbin# 输出 -> /usr/bin:这是 modern Linux 的 usrmerge,不是异常验收标准:不看表格,能回答——nginx 配置在哪个目录?MySQL 的数据落在哪?系统日志去哪看?重启后还想保留的文件绝对不能放哪个目录?(答案:/etc、/var/lib/mysql、/var/log、/tmp)
六、🚨 新手避坑清单
| # | 坑 | 后果 | 正确姿势 |
|---|---|---|---|
| 1 | 把重要文件放/tmp | 重启/清理后消失 | 要持久化的数据放/home、/opt或专门数据盘 |
| 2 | 动/boot里的文件"清理空间" | 🚨 系统无法启动 | /boot只留给内核升级机制 |
| 3 | 在/etc改配置不备份 | 改错且忘了原来什么样 | 改前cp xx xx.bak.日期 |
| 4 | 以为/bin是普通目录乱删 | 系统命令全没 | 理解软链接;删除操作想清楚再回车 |
| 5 | 脚本里用相对路径 | crontab 下行为诡异 | 脚本内一律绝对路径 |
| 6 | 手动编辑/proc下的文件当"配置" | 大多只读或不可持久 | /proc是内核接口,改参数用sysctl(阶段二讲) |
| 7 | 磁盘满了第一时间删/var/log全部日志 | 故障现场被销毁,没法排错 | 先定位大文件(阶段二性能篇),日志用轮转治理 |
| 8 | 混淆/root和/ | root 的家 ≠ 根目录 | /是根,/root只是 root 用户的 home |
七、一句话总结
配置去/etc找,日志去/var/log看,数据在/var/lib躺,实时状态问/proc——FHS 不是背出来的,是每一次排错用出来的。
💬 互动
你有没有过"明明文件就在那,程序就是找不到"的经历?最后发现是相对路径/挂载点的问题?评论区聊聊。
下一篇预告:《S1-02 文件与目录操作命令速查:ls、cp、mv、rm、find、tar》——知道文件在哪之后,怎么高效地搬动、查找、打包它们。