GNU⧸Linux文件系统层级结构
GNU⧸Linux文件系统层级结构
GNU/Linux 文件系统层级结构 (FHS)
文件系统层级结构标准(Filesystem Hierarchy Standard,FHS) 是 Linux 及类 Unix 操作系统中用于定义主要目录和其内容的规范。其目的是通过统一的目录布局,使用户和软件开发者能够轻松预知系统软件、数据文件、配置信息等的位置,从而提高跨发行版的兼容性。
FHS设计原则
独立于发行版:提供发行版之间共享的基准布局
可共享文件与不可共享文件分离:/usr、/opt 可以跨网络共享;而 /etc、/var 等为本地或运行态数据
可变文件与静态文件分离:静态文件(程序、库)位于 /usr,可变文件(日志、缓存、队列)位于 /var
发展历史:FHS 最初由 Linux 社区制定,曾经由Linux基金会维护,自2025年底起,其维护工作已转移至 FreeDesktop.org (opens new window),但标准内容本身未变。当前的最新版本是 FHS 3.0(2015 年发布),但大多数主流发行版(如 Debian、ubuntu、Fedora、Red Hat等)在遵循其核心原则的同时,也存在一定的实现差异。
官方文档:https://refspecs.linuxfoundation.org/fhs (opens new window)
FHS3.0规范:https://refspecs.linuxfoundation.org/FHS_3.0/fhs/index.html (opens new window)
根目录概览
/
├── boot
│ ├── efi(ESP分区挂载点)
│ │ └── EFI
│ │ ├── Boot
│ │ │ └── bootx64.efi
│ │ ├── GRUB
│ │ │ └── grubx64.efi
│ │ ├── log
│ │ │ ├── A.bin
│ │ │ └── log.bin
│ │ └── Microsoft
│ │ ├── Boot
│ │ └── Recovery
│ ├── grub
│ ├── amd-ucode.img
│ ├── initramfs-linux-fallback.img
│ ├── initramfs-linux.img
│ └── vmlinuz-linux
├── usr
│ ├── bin
│ ├── sbin -> bin
│ ├── lib
│ ├── lib64 -> lib
│ ├── lib32
│ ├── local
│ ├── include
│ ├── share
│ └── src
├── opt
├── etc
├── home
│ └── Remilia
├── root
├── media
├── mnt
├── var
│ ├── cache
│ ├── db
│ ├── empty
│ ├── games
│ ├── lib
│ ├── local
│ ├── lock -> /run/lock
│ ├── log
│ ├── mail -> spool/mail
│ ├── opt
│ ├── run -> /run
│ ├── spool
│ └── tmp
├── srv
├── dev
├── sys
├── proc
├── run
├── tmp
├── lib64 -> usr/lib
├── lib -> usr/lib
├── sbin -> usr/bin
└── bin -> usr/bin
发展变更
- 历史遗留问题+兼容性考虑:根目录下的bin,sbin目录分别软链接到/usr/bin和/usr/sbin
/bin -> /usr/bin
/sbin -> /usr/sbin
原本bin目录用于存放对所有用户都可执行的文件,sbin目录用于存放root用户可执行的文件
较为激进且主要面向单用户的发行版Fedora和ArchLinux还将/usr/bin和/usr/sbin进行了合并,最终结果如下
- /bin -> /usr/bin
- /sbin -> /usr/bin
- /usr/sbin -> /usr/sbin
- 历史遗留问题+兼容性考虑:其余lib,lib64目录软链接到/usr/lib
- /lib -> /usr/lib
- /lib64 -> usr/lib
- /usr/lib64 -> /usr/lib
根目录下各文件夹详细介绍
/boot 存放操作系统内核,启动引导器;(多系统通常共用)
/usr [Unix System Resource]
/usr/bin 可执行文件(包括二进制文件(和CPU架构强相关)和脚本文件)
/usr/lib 64位库文件
/usr/lib32 32位库文件
/usr/local 系统管理员手动编译安装的软件
/usr/include C/C++头文件
/usr/src 源代码
/usr/share 非代码资源,许多软件会在这里创建自己的子目录来存放资源
- /usr/share/man 手册默认存放位置
- /usr/share/doc 软件的详细文档、FAQ、示例配置文件、版权信息
- /usr/share/info GNU Info 系统文件
- /usr/share/licenses Application licenses
- /usr/share/fonts 系统全局字体
- /usr/share/icons 系统全局图标
- /usr/share/pixmaps 系统全局图标
- /usr/share/applications 存放.desktop 文件(这些文件定义了如何在图形化菜单中显示应用程序的启动器)
- /usr/share/metainfo 存储软件的元数据文件(用于向软件中心、包管理器和其他系统工具描述一个应用程序的详细信息;文件扩展名通常是.metainfo.xml或.appdata.xml)
- /usr/share/themes 桌面主题和窗口管理器主题
- /usr/share/sounds 系统音效(如提示音、通知声)
- /usr/share/wallpapers 系统自带的桌面壁纸
- /usr/share/mime MIME 类型数据库,定义如何根据文件内容和扩展名识别文件类型及其关联的应用程序
/opt [option] 可选的额外软件(如大型商业软件)
/etc [et cetera]系统级配置文件
/home 普通用户家目录文件夹
/root root用户家目录
/media 自动挂载可移动介质
/mnt [mount] 挂载点(手动在此目录下创建子目录,用于挂载硬盘分区或网络共享等)
/var [variable] 日志、缓存等可变数据
- /var/cache 应用程序缓存数据(可再生,主要用于提高性能)
- /var/log 日志文件
- /var/lib 应用程序状态信息
- /var/spool 任务队列数据
- /var/tmp 在多次重启之间保留的临时文件
/srv [service] 本机作为服务器,由系统提供服务的数据
/dev [device] 设备文件 (Virtual Filesystem)
/sys [system] 硬件设备、驱动、内核参数的接口 (Virtual Filesystem)
/proc [process] 内核和进程信息 (Virtual Filesystem)
/run 进程运行时数据 (临时内存文件系统tmpfs)
/tmp [temporary]临时文件 (临时内存文件系统tmpfs)
注:/tmp和/var/tmp文件夹权限drwxrwxrwt:任何用户都可读写,但只能删除自己创建的文件
文件系统层级和磁盘分区的对应关系(示例)
NAME SIZE TYPE MOUNTPOINTS
nvme0n1 1.9T disk
├─nvme0n1p1 1G part /boot/efi
├─nvme0n1p4 40G part /
├─nvme0n1p5 260G part /home
└─nvme0n1p6 16G part [SWAP]
XDG 基本目录规范
freedesktop.org制定XDG 基本目录规范,提供一个标准化的、有组织的方式来存储用户特定的数据。
XDG(X Desktop Group)
背景:随着桌面环境的发展,用户家目录 (~/) 变得非常混乱,充满了数以百计的以点号 (.) 开头的“隐藏”目录(如 .config, .vim, .cache),这些是应用程序存储其设置和数据的目录。这种混乱被称为“点文件瘟疫”(Dotfile Clutter)。
核心思想: 将用户文件按用途(配置、数据、缓存等)进行分类,并通过环境变量来指定这些文件的位置。
Question:XDG文件目录规范,通常用形如$XDG_CONFIG_DIR的变量表示,而不用固定的如~/.config的原因
Answer:
- 灵活与偏好:不是所有人都想把配置放在家目录。有人可能为了多系统共享配置,专门划一个独立分区挂载;或者想把所有缓存扔到内存盘来减少SSD磨损。变量让用户可以自由重定向,而不是被动接受。
- 整洁与隔离:用固定路径会导致家目录被.appname、.appnamerc这类点文件塞满,很难管理。更进阶的场景是多实例隔离,比如同时运行稳定版和测试版,可以通过临时改变量让它们读写不同配置,互不干扰。
- 系统级管理:在多用户服务器或嵌入式系统上,家目录可能根本不存在,甚至/home都是只读的。软件读取$XDG_CONFIG_DIRS,管理员就能把配置放在/etc/xdg/或/usr/share/这类全局位置,让软件在没有家目录的环境下依然可用。
- 符合Unix哲学:它遵循“机制,而非策略”的原则。软件只负责“去$XDG_CONFIG_DIR里找文件”这个机制,至于这个目录具体是~/.config还是/mnt/ssd/configs,那是用户的策略,软件不越俎代庖。
参考资料
官方文档:https://specifications.freedesktop.org/basedir/latest/ (opens new window)
视频资料1:https://www.bilibili.com/video/BV1W6cKzVE4L/ (opens new window)
视频资料2:https://www.bilibili.com/video/BV19Rgzz5Ev1/ (opens new window)
XDG基本目录规范(XDG Base Directory Specification)
| XDG环境变量 | 默认路径 | 功能 |
|---|---|---|
| $XDG_CONFIG_HOME | $HOME/.config | 用户专属配置文件目录(备份) |
| $XDG_CACHE_HOME | $HOME/.cache | 用户非必要的缓存数据(可以放心删除) |
| $XDG_DATA_HOME | $HOME/.local/share | 用户专属数据文件,应用运行中产生和使用的核心数据 (可以在不同电脑之间迁移) |
| $XDG_STATE_HOME | $HOME/.local/state | 记录应用的当前状态,方便下次打开时恢复原样 |
| $XDG_DATA_DIRS | /etc/xdg | 定义按优先级排列的目录列表,用来查找系统级配置文件 (优先级:用户配置文件>系统配置文件) |
| $XDG_CONFIG_DIRS | /usr/local/share: /usr/share | 用于查找系统级数据文件 |
| $XDG_RUNTIME_DIR | 无默认值 必须设置且符合特定权限 | 存放特定用户的运行时文件及其他文件对象 (如socket文件,pipe文件等用于进程之间通信文件) (权限0700,仅用户本人拥有,必须在本地文件系统中) (仅用户登录存在,当用户登出时,该目录及其中的所有文件都会被清空) |
说明
- $HOME/.local/bin 存储可执行文件(XDG推荐规范)
没有对应的XDG环境变量,但建议将用户自行安装的可执行文件置于此
很多发行默认将该路径加入系统的$PATH环境变量中,使放入的脚本和程序可以直接运行 - 当上述变量未定义时,应用程序直接使用默认路径;只有需要自定义覆盖默认路径时才需要定义环境变量
使用env命令查找环境变量不出现时,反而说明系统遵循了“保持干净”的原则
参考资料
XDG用户目录规范(User Directories)
由xdg-user-dirs软件包实现
系统级配置文件
- /etc/xdg/user-dirs.conf
- /etc/xdg/user-dirs.defaults #定义系统的默认目录名称
用户级配置文件(推荐使用xdg-user-dirs-update创建/修改)
- $XDG_CONFIG_HOME/user-dirs.dirs
- $XDG_CONFIG_HOME/user-dirs.locale
| 环境变量 | 默认目录名 | 中文名 | 说明 |
|---|---|---|---|
| $XDG_DESKTOP_DIR | Desktop | 桌面 | 桌面上显示的文件和快捷方式 |
| $XDG_DOWNLOAD_DIR | Downloads | 下载 | 软件的默认下载位置 |
| $XDG_DOCUMENTS_DIR | Documents | 文档 | |
| $XDG_MUSIC_DIR | Music | 音乐 | |
| $XDG_PICTURES_DIR | Pictures | 图片 | |
| $XDG_VIDEOS_DIR | Videos | 视频 | |
| $XDG_TEMPLATES_DIR | Templates | 模板 | 存放文件模板 供文件管理器在新建文件菜单中调用 |
| $XDG_PUBLICSHARE_DIR | Public | 公共 | 在局域网内分享文件 |
登陆时自动执行xdg-user-dirs-update(根据语言修改文件夹名称)
/etc/xdg/autostart/xdg-user-dirs.desktop
参考资料