Linux目录结构
Linux 目录结构由 FHS(Filesystem Hierarchy Standard) 规范定义,核心是两条设计原则:一切皆文件的统一抽象,以及按「可变性 × 共享性」两个维度划分目录职责。理解了这两点,任何陌生的路径都能推断出它的用途。
一切皆文件
一切皆文件是指 Linux 把所有资源抽象成文件:普通文件、目录、硬盘、键盘、进程信息,都通过同一套接口(open/read/write/close)访问。这样做的收益是工具链统一——cat、grep、重定向这些文本工具可以直接操作硬件和内核状态,不需要为每类资源发明专用 API。
| 资源 | 对应文件 | 示例 |
|---|---|---|
| 硬盘/分区 | 块设备文件 | /dev/sda、/dev/sdb1 |
| 键盘/鼠标 | 字符设备文件 | /dev/input/* |
| 进程运行状态 | /proc 下的虚拟文件 | /proc/cpuinfo、/proc/1/cmdline |
| 内核参数 | /sys、/proc/sys 下的虚拟文件 | /proc/sys/net/ipv4/ip_forward |
| 随机数源 | 字符设备 | /dev/urandom |
虚拟文件(/proc、/sys)不对应磁盘数据,由内核在读取时实时生成。修改它们等于修改内核状态:echo 1 > /proc/sys/net/ipv4/ip_forward 就直接开启了 IP 转发。
FHS 的两个分类维度
FHS 用两个维度决定数据放哪:是否可变(运行中会不会被修改)和是否可共享(能不能在多台主机间共享)。由此形成四象限:
| 可共享 | 不可共享(主机特有) | |
|---|---|---|
| 静态(运行中不变) | /usr(程序与库) | /boot(内核与引导)、/etc(本机配置) |
| 可变(运行中会变) | /var/mail(邮件)、/var/spool/news | /var/run(进程状态)、/var/lock(锁文件) |
这解释了常见疑问:配置文件在 /etc(静态+主机特有),日志在 /var/log(可变+主机特有),安装的软件在 /usr(静态+可共享——同一份程序理论上可挂载给多台机器)。
根目录核心条目
| 目录 | 职责 | 关键认知 |
|---|---|---|
/ | 根目录,一切路径的起点 | Linux 只有一个树,磁盘通过挂载(mount)接入树的某个节点 |
/etc | 系统与服务的纯文本配置文件 | 改配置来这里,如 /etc/fstab、/etc/ssh/sshd_config |
/var | 运行中不断变化的数据:日志、缓存、spool | /var/log 见 Linux日志系统 |
/usr | 用户程序与库(binary/lib/include/share) | 名字是 Unix System Resources,不是 user |
/bin、/sbin | 基础命令 / 管理员命令 | 现代发行版多为 /usr/bin 的符号链接 |
/home | 普通用户主目录 | /home/username,即 ~ |
/root | root 用户的主目录 | 不在 /home 下,避免 /home 未挂载时无法救急 |
/boot | 内核、initramfs、GRUB 配置 | 启动所需的最小集合,见 Linux启动流程 |
/dev | 设备文件 | sda 硬盘、null 黑洞、urandom 随机数 |
/proc | 内核与进程运行时信息(虚拟) | 每个进程一个数字目录,/proc/<pid>/ |
/sys | 设备与内核参数的结构化视图(虚拟) | 比 /proc 更规范的设备树 |
/tmp | 临时文件 | 带 Sticky Bit,重启可能清空,别放重要数据 |
/opt | 第三方大型软件 | 手动安装的软件常用 --prefix=/opt/xxx |
/mnt、/media | 手动挂载点 / 自动挂载可移动介质 | U盘插入后出现在 /media |
/run | 本次启动以来的运行时状态(PID 文件、socket) | 每次开机清空 |
挂载:目录树与磁盘的关系
Linux 只有一棵目录树,磁盘分区必须先挂载到某个目录才能被访问,该目录称为挂载点。挂载后分区的根目录就是挂载点目录,原目录内容被暂时遮盖。
# 查看当前所有挂载关系
mount
df -Th # 带文件系统类型与容量
# 挂载/卸载
mount /dev/sdb1 /mnt/data
umount /mnt/data开机自动挂载由 /etc/fstab 声明,字段含义见 Linux系统管理 的磁盘分区章节。
根分区挂了就全挂了
/ 本身也是一块分区挂载上来的。根分区损坏或满了,整个目录树失效——所以 /boot、/var 常被单独分区,隔离故障域(如日志写爆 /var 不会塞死根分区)。
常用路径操作
pwd # 当前所在路径
cd ~ # 回主目录;cd - 回上一次目录
ls -la /etc/passwd # 查看详情
which nginx # 命令实际位置(PATH 搜索)
readlink -f /usr/bin/python3 # 解析符号链接的真实路径PATH 决定命令搜索顺序,echo $PATH 查看;同名命令按 PATH 先后顺序命中,用绝对路径可强制指定。