第五章:Linux 的文件系统:结构、标准与管理

第五章:Linux 的文件系统:结构、标准与管理

本章旨在建立对 Linux 文件系统组织方式的根本理解。我们将从其设计的核心哲学出发,剖析其与 Windows 文件系统的结构性差异。随后,将以可视化的目录树形式,系统性地介绍遵循文件系统层次结构标准(FHS)的核心目录及其功能,阐明在 Windows Subsystem for Linux (WSL) 环境下与主机文件系统交互的机制,并最终掌握分析和管理磁盘空间的核心命令行工具。


5.1. 概念差异:Windows 的多根文件系统与 Linux 的统一根文件系统

Windows 与 Linux 在文件系统设计上的根本差异,是理解后者的第一步。

Windows 操作系统采用多根(Multi-Root)文件系统结构。系统的存储空间被划分为多个逻辑卷,并以“盘符”(Drive Letter)如 C:D: 等进行标识。每一个盘符都是一个独立文件系统的起点或“根”,它们在逻辑上是并列的,形成了一个由多个独立文件树组成的集合。

与之相反,Linux 及其所有遵循 UNIX 设计哲学的操作系统,均采用单一、统一的树状文件系统结构。整个系统的唯一入口点是根目录(root directory),以一个正斜杠 / 表示。所有的存储设备,包括物理硬盘分区、USB 设备、网络驱动器等,都必须通过“挂载”(Mount)操作,关联到根文件树下的某个目录上,才能被访问。这个作为连接点的目录被称为“挂载点”(Mount Point)。

这一设计的核心是虚拟文件系统(Virtual File System, VFS)层,它提供了一个统一的抽象接口。无论底层硬件和文件系统类型为何(ext4, XFS, NTFS 等),VFS 都能使其以统一的方式呈现在根文件树下。这种“一切皆文件”的哲学延伸到了设备(如 /dev/sda)、进程间通信甚至内核参数,它们都在文件系统中拥有对应的节点。因此,在 Linux 中,我们关注的是文件在统一树状结构中的唯一路径,而非其所在的物理设备。

5.2. 文件系统层次结构标准 (Filesystem Hierarchy Standard, FHS)

为了保证不同 Linux 发行版之间的规范性、可预测性和互操作性,核心目录的组织遵循文件系统层次结构标准(FHS)。该标准定义了主要目录的用途,确保用户和软件都能可靠地找到所需的文件和资源。

以下是 Linux 核心目录结构的可视化树状图,及其详细功能阐述。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/ (root)
├── bin -> usr/bin
├── sbin -> usr/sbin
├── etc
├── home
│ └── <username>
├── root
├── usr
│ ├── bin
│ ├── sbin
│ ├── lib
│ └── local
├── var
│ ├── log
│ ├── cache
│ └── lib
├── tmp
├── dev
├── boot
└── mnt

目录功能详解

  • / (根目录)
    功能: 文件系统层次结构的起点。所有其他目录和文件都源于此。

  • /bin (Essential User Binaries)
    功能: 存放所有用户(包括普通用户)都能使用的核心系统命令。这些是系统启动和基本功能运行所必需的二进制可执行文件。
    内容示例: ls, cp, mv, cat, bash
    开发者相关性: 您在终端中使用的最基础的命令大多位于此处。

  • /sbin (Essential System Binaries)
    功能: 存放仅供系统管理员(root 用户)使用的核心系统管理和维护命令。
    内容示例: fdisk (磁盘分区), ip (网络配置), reboot, mkfs (创建文件系统)。
    开发者相关性: 当您需要进行系统级的配置,如设置网络、管理磁盘或启动服务时,会用到这里的命令。

在许多现代 Linux 发行版中,为整合资源,/bin/sbin 已成为指向 /usr/bin/usr/sbin 的符号链接。

  • /etc (Etcetera - System-wide Configuration Files)
    功能: 存放整个系统范围的、静态的配置文件。几乎所有系统服务和应用程序的全局配置都存储在此。
    内容示例: /etc/nginx/nginx.conf (Nginx 配置), /etc/ssh/sshd_config (SSH 服务配置), /etc/fstab (文件系统挂载配置), /etc/passwd (用户账户信息)。
    开发者相关性: 这是您作为开发者或运维人员最常打交道的目录之一。配置 Web 服务器、数据库、SSH 访问权限等都需要编辑此目录下的文件。

  • /home (User Home Directories)
    功能: 存放普通用户的个人数据、用户级别的配置文件和项目代码。每个用户在此目录下都有一个以其用户名命名的专属子目录。
    内容示例: /home/your_username/projects, /home/your_username/.bashrc
    开发者相关性: 这是您主要的工作区域。所有开发项目、代码仓库、个人脚本和自定义的 Shell 配置都应存放在您的家目录中,即 ~ (/home/<username>)。

  • /root (Root User’s Home Directory)
    功能: 超级用户 root 的专属家目录。将其与 /home 分离,是为了保证即使 /home 所在的分区出现问题,root 用户依然能够登录并执行系统修复任务。

  • /usr (Unix System Resources)
    功能: 存放由操作系统发行版管理的、用户安装的应用程序、共享库文件和文档。可以将其视为系统的主软件库。
    内容示例:

    • /usr/bin: 绝大多数非核心的用户命令。
    • /usr/lib: 应用程序和系统所需的共享库文件。
    • /usr/local: 留给系统管理员用于手动安装软件的路径,以区别于通过包管理器安装的软件。
  • /var (Variable Files)
    功能: 存放内容在系统正常运行过程中会持续变化的文件。
    内容示例:

    • /var/log: 系统和应用程序的日志文件。排查服务故障时必须查看这里。
    • /var/cache: 应用程序的缓存数据,如包管理器的缓存。
    • /var/lib: 应用程序的状态信息,如数据库的数据文件。
    • /var/www: 某些 Web 服务器(如 Apache)默认的网站根目录。
  • /tmp (Temporary Files)
    功能: 用于存放应用程序和用户创建的临时文件。系统重启后,此目录的内容通常会被清空。

  • /dev (Device Files)
    功能: 存放代表物理和虚拟硬件设备的特殊文件。例如,/dev/sda1 可能代表第一个硬盘的第一个分区。

  • /boot (Boot Loader Files)
    功能: 包含启动 Linux 系统所需的核心文件,包括 Linux 内核 (vmlinuz)、初始 RAM 磁盘映像 (initrd) 以及引导加载程序(如 GRUB)的配置文件。

  • /mnt (Mount point for temporarily mounted filesystems)
    功能: 一个通用的、临时的挂载点目录,通常用于手动挂载外部设备(如 U 盘)以进行临时访问。

5.3. 跨系统边界:WSL 2 中的 /mnt 挂载点

现在,我们来解答在 WSL 环境下如何访问 Windows 文件的问题。这正是通过 /mnt 目录实现的。

WSL 2 启动时,会自动将 Windows 系统中的固定驱动器(如 C 盘、D 盘)挂载到 Linux 系统下的 /mnt 目录中。这是一个自动化的挂载过程,其命名规则是直接使用 Windows 盘符的小写形式作为目录名。

  • Windows C:\ 驱动器对应于 WSL 中的 /mnt/c
  • Windows D:\ 驱动器对应于 WSL 中的 /mnt/d

这种跨文件系统的访问是通过一个名为 9P 的网络文件系统协议实现的。当您在 WSL 中对 /mnt/c 内的文件进行读写时,Linux 内核会将这些操作通过 9P 协议转发给 Windows 主机执行。

核心原则: 务必在 Linux 原生文件系统(如 /home/username/projects)内进行代码编译、依赖安装等 I/O 密集型开发工作。通过 /mnt/* 访问 Windows 文件会因协议转换产生显著的性能开销,导致操作异常缓慢。

5.4. 磁盘空间管理:dfdu

熟悉文件系统布局后,管理其空间占用是必备技能。dfdu 是两个互补的核心工具。

df:报告文件系统分区的使用情况

df(disk free)命令用于查看已挂载文件系统(即磁盘分区)的整体空间使用情况。

1
2
# -h 选项以人类可读的格式 (如 G, M, K) 显示大小
df -h

典型输出解析:

1
2
3
4
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdc 50G 20G 28G 42% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
C:\ 476G 350G 126G 74% /mnt/c
  • Filesystem: 文件系统的来源,可以是设备名或远程路径。
  • Size: 该文件系统的总容量。
  • Mounted on: 该文件系统在 Linux 树状结构中的挂载点。

du:估算当前文件和目录的空间占用

du(disk usage)命令用于递归地计算目录或文件所占用的磁盘空间。它更侧重于微观的文件和目录级别。

1
2
3
4
# 查看当前目录下,每个子目录和文件的总大小
# -s (summarize): 只显示每个参数的总计,不显示子目录的详细信息
# -h (human-readable): 以易读格式显示大小
du -sh

典型输出解析:

1
2
3
4.0K	another-project
8.0K my-project
1.2M some-archive.tar.gz

该输出清晰地列出了当前目录下每个项目占用的大小。