目录
Please enable Javascript to view the contents

Linux基础-FHS文件系统层次标准

 ·  ☕ 5 分钟
核心结论说明
FHS 解决“文件应该放哪里”的问题统一 Linux 目录用途,降低运维和软件适配成本
/etc 放配置,/var 放可变数据,/usr 放大部分用户态软件资源排查问题时先按目录职责定位
/proc/sys/run 多数不是普通磁盘文件它们常是内核或 systemd 提供的虚拟文件系统
现代发行版常启用 usr-merge/bin/sbin/lib 可能只是指向 /usr/* 的软链接

1.简介

FHS(Filesystem Hierarchy Standard,文件系统层次标准)定义 Linux 系统中各目录的用途。

它主要解决两个问题:

  1. 文件应该放在哪里;
  2. 出问题时应该去哪里找。

对于运维和后端开发,FHS 的价值不是背目录,而是建立排查路径:

  • 配置问题:优先看 /etc
  • 日志问题:优先看 /var/log
  • 运行时状态:优先看 /run
  • 进程和内核状态:优先看 /proc/sys
  • 第三方软件:优先看 /opt/usr/local

2.说明

2.1 FHS 的四类目录属性

FHS 按两个维度理解目录:

  1. 是否可以被多台机器共享;
  2. 内容是否经常变化。
类型可分享不可分享
不变/usr/opt/etc/boot
可变/var/mail/var/spool/news/var/run/var/lock

说明:

属性含义
可分享可以被其他系统挂载使用,例如只读共享 /usr
不可分享与本机强相关,例如主机配置、启动文件
不变安装后变化较少,例如程序和库文件
可变运行中经常变化,例如日志、缓存、锁文件

2.2 根目录常见路径

目录作用排查场景
/bin基础用户命令,现代系统常指向 /usr/binlscatcp 等基础命令
/sbin基础系统管理命令,现代系统常指向 /usr/sbinipmountreboot
/boot内核、initramfs、Bootloader 文件内核启动失败、GRUB 问题
/dev设备文件磁盘、终端、伪设备排查
/etc系统和服务配置配置文件、systemd override、网络配置
/home普通用户家目录用户配置、SSH key、shell 配置
/lib/lib64共享库,现代系统常指向 /usr/lib*动态库缺失、ld.so 问题
/media可移动设备挂载点U 盘、光盘自动挂载
/mnt临时手动挂载点临时挂载磁盘、NFS、镜像
/opt第三方独立软件手动安装的软件包
/proc进程和内核虚拟文件系统CPU、内存、进程、内核参数
/rootroot 用户家目录root 用户配置
/run运行时状态数据pid 文件、socket、lock
/srv服务对外提供的数据Web、FTP、业务服务数据
/sys内核设备模型虚拟文件系统设备、驱动、cgroup、内核对象
/tmp临时文件临时缓存,通常可被定期清理
/usr用户态程序、库、文档绝大多数系统软件资源
/var可变数据日志、缓存、队列、数据库运行数据
排查 Linux 问题时先按目录职责定位:配置找 /etc,日志找 /var/log,进程找 /proc,运行态找 /run

2.3 /usr/usr/local/opt 的区别

这三个目录容易混淆。

目录用途管理方式
/usr发行版软件包安装的主要位置包管理器管理,例如 apt/yum/dnf
/usr/local本机管理员手动安装的软件本机维护,不应被发行版包覆盖
/opt第三方独立软件目录软件自带目录结构,例如 /opt/google/chrome

示例:

1
2
3
/usr/bin/nginx              # 发行版包管理器安装
/usr/local/bin/mytool       # 本机手动安装
/opt/company/app/bin/app    # 第三方或内部应用独立安装

建议:

  • 不建议手动修改 /usr/bin 下由包管理器安装的文件;
  • 自编译小工具可以放 /usr/local/bin
  • 完整第三方软件包可以放 /opt/<name>

2.4 /etc 常见配置文件

路径说明
/etc/passwd用户账号信息
/etc/shadow用户密码哈希,权限敏感
/etc/group用户组信息
/etc/fstab开机挂载配置
/etc/hosts本地域名解析
/etc/resolv.confDNS 解析配置,可能由 NetworkManager/systemd-resolved 管理
/etc/hostname主机名
/etc/ssh/sshd_configSSH 服务端配置
/etc/sudoers/etc/sudoers.d/sudo 权限配置
/etc/systemd/system/本机 systemd unit 覆盖和自定义配置
/etc/profile/etc/profile.d/全局登录 shell 配置

修改配置建议:

1
2
3
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sshd -t
systemctl reload sshd

配置类文件修改前建议备份;服务类配置修改后建议先做语法检查,再 reload/restart。

2.5 /var 常见目录和日志

/var 存放运行中会变化的数据。

路径说明
/var/log日志目录
/var/cache应用缓存
/var/lib应用状态数据,例如数据库、包管理器状态
/var/spool队列数据,例如 mail、cron
/var/tmp跨重启保留时间更长的临时文件
/var/run旧路径,现代系统通常指向 /run
/var/lock旧路径,现代系统通常指向 /run/lock

常见日志:

日志文件说明
/var/log/messagesRHEL/CentOS 常见系统日志
/var/log/syslogDebian/Ubuntu 常见系统日志
/var/log/auth.logDebian/Ubuntu 认证日志
/var/log/secureRHEL/CentOS 认证日志
/var/log/croncron 任务日志,RHEL/CentOS 常见
/var/log/dmesg内核启动日志快照
/var/log/wtmp登录、注销、重启记录,last 查看
/var/log/btmp登录失败记录,lastb 查看
/var/log/lastlog用户最近登录记录,lastlog 查看

systemd 系统还需要关注 journal:

1
2
3
journalctl -b
journalctl -u sshd
journalctl --since "1 hour ago"

2.6 /proc/sys/run

这几个目录不是普通意义上的磁盘目录。

目录类型说明
/procprocfs进程、内核参数、系统状态
/syssysfs设备、驱动、内核对象、cgroup
/runtmpfs本次启动周期内的运行时状态

常见排查路径:

路径说明
/proc/cpuinfoCPU 信息
/proc/meminfo内存信息
/proc/loadavg系统负载
/proc/<pid>/指定进程状态
/proc/<pid>/fd/进程打开的文件描述符
/proc/mounts当前挂载信息
/sys/class/net/网卡设备信息
/run/systemd/systemd 运行态数据

示例:查看某进程打开了哪些文件:

1
ls -l /proc/<pid>/fd/

2.7 usr-merge 说明

现代发行版常见现象:

1
2
3
4
ls -l /bin /sbin /lib
# /bin -> usr/bin
# /sbin -> usr/sbin
# /lib -> usr/lib

这叫 usr-merge。

目的:

  • 简化系统目录结构;
  • 避免 /bin/usr/bin 中命令重复;
  • 让大多数只读系统资源集中到 /usr

影响:

  • 老文档中说 /bin 放基础命令,现代系统上可能实际在 /usr/bin
  • 排查命令路径时,以 whichtypereadlink -f 的实际结果为准。
1
2
type ls
readlink -f /bin/ls

3.总结

  1. FHS 是 Linux 目录用途规范,核心是明确文件应该放哪里、问题应该去哪里查;
  2. /etc 放配置,/var 放可变数据,/usr 放系统软件资源,/opt 放第三方独立软件;
  3. /proc/sys/run 多数是虚拟文件系统,不应按普通磁盘目录理解;
  4. 现代发行版常启用 usr-merge,/bin/sbin/lib 可能只是指向 /usr 的软链接;
  5. 排查问题时,先按目录职责定位,再结合 systemctljournalctl/proc 等工具确认。

4.参考

分享

Hex
作者
Hex
CloudNative Developer