Linux 文件系统层级标准 (FHS) 完全指南:运维人员快速定位问题的必备知识

引言

作为运维工程师,你是否曾经困惑过:为什么有些程序在 /bin,有些在 /usr/bin?日志文件应该去哪里找?系统配置文件又存放在哪里?

早期的 Linux 发行版各自为政,目录结构混乱不堪,给运维人员带来了巨大的困扰。为了解决这个问题,Linux 文件系统层级标准 (Filesystem Hierarchy Standard, FHS) 应运而生。它定义了一套统一的目录结构规范,让所有的 Linux 发行版都遵循相同的组织方式。

理解 FHS 不仅能让你在 Linux 系统中游刃有余,更能在故障排查、性能调优时快速定位问题根源。本文将带你深入了解 Linux 文件系统的核心目录及其用途。

一、可执行二进制文件目录 (Binaries)

1.1 /bin - 核心系统命令

用途: 存放操作系统核心程序,必须在系统启动时即可使用,无需挂载其他文件系统。

关键特点:

  • 包含系统启动和修复所需的基本命令
  • 即使其他分区未挂载也能使用
  • 所有用户都可以访问

常见命令:

1
2
3
4
5
6
7
8
9
ls      # 列出目录内容
cd      # 切换目录
cp      # 复制文件
mv      # 移动文件
rm      # 删除文件
cat     # 查看文件内容
grep    # 文本搜索
mount   # 挂载文件系统
bash    # Shell 解释器

运维场景:

  • 系统进入单用户模式时,只有 /bin 中的命令可用
  • 紧急修复场景下必须依赖这些核心命令

1.2 /usr/bin - 用户程序

用途: 存放非核心的主要用户程序和应用软件。

关键说明:

  • usr 不是 “user” 的缩写,而是 Unix System Resources (Unix 系统资源)
  • 包含大部分日常使用的命令和工具
  • 系统包管理器安装的程序通常在这里

常见程序:

1
2
3
4
5
6
python3     # Python 解释器
gcc         # C 编译器
vim         # 文本编辑器
ssh         # 远程登录工具
git         # 版本控制
docker      # 容器工具

1.3 /usr/local/bin - 本地编译安装的程序

用途: 存放管理员手动从源码编译安装的程序。

为什么需要这个目录:

  • 避免覆盖系统自带的同名程序
  • 便于区分系统自带和手动安装的软件
  • 升级系统时不会影响自定义安装的程序

典型使用场景:

1
2
3
4
5
6
7
8
# 从源码编译安装 nginx
./configure --prefix=/usr/local
make && make install
# 二进制文件会安装到 /usr/local/bin/nginx

# 检查程序位置
which nginx
# /usr/local/bin/nginx  (优先级高于 /usr/bin)

1.4 sbin 系列目录 - 系统管理命令

包括: /sbin, /usr/sbin, /usr/local/sbin

用途: 存放需要 root 权限的系统管理工具。

常见工具:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# /sbin 目录
iptables    # 防火墙配置
ifconfig    # 网络接口配置
fdisk       # 磁盘分区
reboot      # 系统重启
shutdown    # 系统关机

# /usr/sbin 目录
sshd        # SSH 守护进程
nginx       # Web 服务器
mysqld      # MySQL 数据库服务
cron        # 定时任务守护进程

权限说明:

1
2
3
4
5
6
7
# 普通用户执行系统命令会提示权限不足
$ iptables -L
iptables: Permission denied

# 需要使用 sudo 提权
$ sudo iptables -L
Chain INPUT (policy ACCEPT)

二、共享库文件 (Libraries)

2.1 /lib - 核心系统库

用途: 包含 /bin/sbin 中二进制文件运行所必需的核心共享库。

内容:

  • C 标准库 (libc)
  • 动态链接器
  • 内核模块

示例:

1
2
3
4
5
6
# 查看命令依赖的库文件
ldd /bin/ls
    linux-vdso.so.1
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
    /lib64/ld-linux-x86-64.so.2

2.2 /usr/lib - 用户程序库

用途: 存放非关键性用户程序的库文件。

常见库:

  • Python 运行时库
  • UI 库 (GTK, Qt)
  • 第三方库

示例:

1
2
3
/usr/lib/python3.11/
/usr/lib/x86_64-linux-gnu/libpython3.11.so
/usr/lib/systemd/

三、配置与用户数据

3.1 /etc - 系统配置文件

用途: Linux 配置文件的大本营,控制系统和服务的所有行为。

关键配置文件:

1
2
3
4
5
6
7
8
9
/etc/passwd          # 用户账户信息
/etc/shadow          # 用户密码哈希
/etc/group           # 用户组信息
/etc/hosts           # 主机名解析
/etc/resolv.conf     # DNS 配置
/etc/fstab           # 文件系统挂载配置
/etc/ssh/sshd_config # SSH 服务配置
/etc/nginx/          # Nginx 配置目录
/etc/systemd/        # systemd 服务配置

运维实战:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 查看系统登录用户
cat /etc/passwd

# 修改主机名解析
sudo vim /etc/hosts
192.168.1.100  db-server

# 检查 SSH 配置
sudo cat /etc/ssh/sshd_config | grep PermitRootLogin

# 重载配置
sudo systemctl reload nginx

3.2 /home - 普通用户主目录

用途: 普通用户存储个人文件、文档、项目的空间。

结构:

1
2
3
4
5
6
7
8
/home/
├── user1/
│   ├── Documents/
│   ├── Downloads/
│   └── .bashrc       # 用户个人 Shell 配置
├── user2/
└── developer/
    └── projects/

3.3 /root - 超级管理员主目录

用途: root 用户专用的独立主目录,与普通用户隔离。

为什么独立:

  • 安全隔离
  • 即使 /home 分区损坏,root 仍可登录
  • 存放系统管理相关的脚本和工具

四、动态与运行时数据

4.1 /var - 可变数据

用途: 存放经常变化的数据。

重要子目录:

/var/log - 系统日志 (最重要!)

运维必看:

1
2
3
4
5
6
/var/log/syslog          # 系统主日志 (Debian/Ubuntu)
/var/log/messages        # 系统主日志 (RHEL/CentOS)
/var/log/auth.log        # 认证日志
/var/log/nginx/          # Nginx 日志
/var/log/mysql/          # MySQL 日志
/var/log/kern.log        # 内核日志

故障排查实战:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看最近的系统错误
sudo tail -f /var/log/syslog

# 检查 SSH 登录失败记录
sudo grep "Failed password" /var/log/auth.log

# 分析 Nginx 访问日志
sudo tail -f /var/log/nginx/access.log

# 查找磁盘 I/O 错误
sudo dmesg | grep -i error

其他 /var 子目录

1
2
3
4
5
6
7
/var/cache/      # 应用缓存数据
/var/tmp/        # 临时文件 (重启后保留)
/var/spool/      # 队列数据 (如打印任务、邮件)
/var/lib/        # 应用状态数据
  ├── docker/    # Docker 数据
  ├── mysql/     # MySQL 数据库文件
  └── postgresql/

4.2 /run - 运行时易失性数据

用途: 存储运行时信息,系统重启后清空。

内容:

1
2
3
4
/run/
├── lock/           # 锁定文件
├── systemd/        # systemd 运行时数据
└── *.pid           # 进程 PID 文件

示例:

1
2
3
4
5
6
# 查看 Nginx 进程 ID
cat /run/nginx.pid
1234

# 检查 systemd 服务状态
ls /run/systemd/units/

五、虚拟文件系统 (高级)

5.1 /proc - 进程和内核信息

特点: 虚拟文件系统,内容存在于内存中,不占用磁盘空间。

用途: 检查操作系统状态和进程统计信息。

实用技巧:

查看 CPU 信息

1
2
3
4
5
cat /proc/cpuinfo
processor       : 0
model name      : Intel(R) Xeon(R) CPU
cpu MHz         : 2400.000
cache size      : 8192 KB

查看内存信息

1
2
3
4
cat /proc/meminfo
MemTotal:       16384000 kB
MemFree:         2048000 kB
MemAvailable:    8192000 kB

查看进程信息

1
2
3
4
5
6
7
8
# 查看进程 1234 的命令行
cat /proc/1234/cmdline

# 查看进程打开的文件
ls -l /proc/1234/fd/

# 查看进程的环境变量
cat /proc/1234/environ

系统性能监控

1
2
3
4
5
6
7
8
9
# 平均负载
cat /proc/loadavg
1.23 1.45 1.67 2/345 12345

# 网络统计
cat /proc/net/dev

# 磁盘统计
cat /proc/diskstats

5.2 /sys - 内核和硬件对象

用途: 暴露更低级别的内核与硬件信息,用于监控和配置。

实用场景:

网络接口管理

1
2
3
4
5
6
7
# 查看网卡速率
cat /sys/class/net/eth0/speed
1000

# 查看网卡状态
cat /sys/class/net/eth0/operstate
up

硬件温度监控

1
2
3
# CPU 温度
cat /sys/class/thermal/thermal_zone0/temp
45000  # 表示 45°C

块设备信息

1
2
3
4
5
6
7
# 查看磁盘调度器
cat /sys/block/sda/queue/scheduler
[mq-deadline] none

# 查看磁盘队列深度
cat /sys/block/sda/queue/nr_requests
128

六、其他重要目录

6.1 /tmp - 临时文件

特点:

  • 系统重启时清空
  • 所有用户可写
  • 通常挂载为 tmpfs (内存文件系统)

注意事项:

1
2
# 不要存放重要数据
# 定期清理可能被某些系统自动执行

6.2 /opt - 可选应用软件

用途: 第三方独立应用程序的安装目录。

示例:

1
2
3
/opt/google/chrome/
/opt/teamviewer/
/opt/custom-app/

6.3 /boot - 启动引导文件

内容:

  • 内核镜像 (vmlinuz)
  • 初始化 RAM 磁盘 (initrd)
  • GRUB 引导程序配置
1
2
3
4
ls /boot/
vmlinuz-5.15.0-56-generic
initrd.img-5.15.0-56-generic
grub/

6.4 /dev - 设备文件

用途: 硬件设备的文件接口。

常见设备:

1
2
3
4
5
/dev/sda         # 第一块 SATA 硬盘
/dev/sda1        # 第一块硬盘的第一个分区
/dev/null        # 空设备 (丢弃所有写入)
/dev/zero        # 零设备 (产生无限的零)
/dev/random      # 随机数生成器

七、运维实战:快速定位问题

7.1 性能问题排查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 1. 检查系统负载
cat /proc/loadavg
uptime

# 2. 查看 CPU 使用率
top
htop

# 3. 检查内存使用
free -h
cat /proc/meminfo

# 4. 查看磁盘 I/O
iostat
cat /proc/diskstats

# 5. 网络连接状态
ss -tunlp
cat /proc/net/tcp

7.2 服务故障排查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 1. 检查服务状态
systemctl status nginx

# 2. 查看服务日志
journalctl -u nginx -f
tail -f /var/log/nginx/error.log

# 3. 检查进程是否运行
ps aux | grep nginx
cat /run/nginx.pid

# 4. 查看配置文件
cat /etc/nginx/nginx.conf

# 5. 测试配置是否正确
nginx -t

7.3 安全审计

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 1. 检查登录失败记录
grep "Failed password" /var/log/auth.log

# 2. 查看最近登录用户
last
lastlog

# 3. 检查可疑进程
ps aux | grep -E 'defunct|zombie'

# 4. 查看开放端口
ss -tunlp

# 5. 检查定时任务
crontab -l
cat /etc/crontab

7.4 磁盘问题排查

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 1. 检查磁盘使用率
df -h

# 2. 查找大文件
du -sh /* | sort -hr | head -10
find /var -type f -size +100M

# 3. 查看磁盘 I/O 错误
dmesg | grep -i "I/O error"
cat /var/log/kern.log | grep -i error

# 4. 检查磁盘健康状态
smartctl -a /dev/sda

八、总结

理解 Linux 文件系统层级标准 (FHS) 是每个运维工程师的必备技能。通过本文,你应该掌握了:

  1. 二进制文件目录 (/bin, /usr/bin, /sbin): 快速找到系统命令和工具
  2. 配置文件目录 (/etc): 所有服务配置的中心
  3. 日志目录 (/var/log): 故障排查的第一站
  4. 虚拟文件系统 (/proc, /sys): 深入了解系统运行状态
  5. 运行时数据 (/var, /run): 掌握动态数据的位置

记住这个口诀:

  • 配置看 /etc
  • 日志看 /var/log
  • 性能看 /proc
  • 硬件看 /sys
  • 命令在 /bin/usr/bin

Linux 文件系统完整树形结构

下面是 Linux 文件系统的完整树形目录结构及各目录用途说明:

/(根目录)
├── bin/              # 基本用户命令(ls, cp, cat 等)
├── boot/             # 启动文件(内核、initramfs、GRUB 配置)
├── dev/              # 设备文件(硬盘、终端、USB 等)
├── etc/              # 系统配置文件
│   ├── systemd/      # systemd 服务配置
│   ├── nginx/        # Nginx 配置
│   ├── ssh/          # SSH 配置
│   └── cron.d/       # 定时任务配置
├── home/             # 普通用户家目录
│   └── username/     # 用户个人文件和配置
├── lib/              # 系统共享库文件(32位)
├── lib64/            # 系统共享库文件(64位)
├── media/            # 可移动设备挂载点(U盘、光盘)
├── mnt/              # 临时挂载点(手动挂载)
├── opt/              # 可选应用程序(第三方软件)
├── proc/             # 虚拟文件系统(进程和内核信息)
│   ├── cpuinfo       # CPU 信息
│   ├── meminfo       # 内存信息
│   └── [PID]/        # 进程运行时信息
├── root/             # root 用户家目录
├── run/              # 运行时数据(PID、socket)
├── sbin/             # 系统管理命令(仅root使用)
├── srv/              # 服务数据(Web、FTP 等)
├── sys/              # 虚拟文件系统(设备和驱动信息)
│   ├── block/        # 块设备信息
│   ├── class/        # 设备类别
│   └── devices/      # 物理设备树
├── tmp/              # 临时文件(重启清空)
├── usr/              # 用户程序和数据
│   ├── bin/          # 用户命令(非基本命令)
│   ├── sbin/         # 非必需的系统管理命令
│   ├── lib/          # 应用程序共享库
│   ├── local/        # 本地安装的软件
│   ├── share/        # 共享数据(文档、图标)
│   └── src/          # 源代码
└── var/              # 可变数据(日志、缓存、数据库)
    ├── log/          # 日志文件
    │   ├── syslog    # 系统日志
    │   ├── auth.log  # 认证日志
    │   └── nginx/    # Nginx 日志
    ├── cache/        # 应用程序缓存
    ├── lib/          # 状态信息(数据库文件)
    ├── spool/        # 队列数据(邮件、打印任务)
    ├── tmp/          # 临时文件(重启保留)
    └── www/          # Web 服务器数据

目录用途快速对照表:

目录用途典型文件/子目录
/bin基本命令ls, cat, cp, mv, rm
/boot启动文件vmlinuz, initrd.img, grub/
/dev设备文件sda, tty, null, random
/etc配置文件passwd, hosts, nginx.conf
/home用户目录/home/kaka, /home/admin
/lib共享库libc.so, ld-linux.so
/proc进程信息cpuinfo, meminfo, [PID]/
/sys硬件信息block/, class/, devices/
/tmp临时文件session-, tmp-
/usr用户程序bin/, lib/, share/, local/
/var可变数据log/, cache/, lib/, www/

掌握这些知识后,你将能够在 Linux 系统中快速定位问题,提升故障排查效率,成为更专业的运维工程师!

参考资料