文件系统基础

磁盘已经分区,系统仍不能把它当作目录使用:还要在块空间上创建文件系统,再把这个文件系统接入 Linux 的目录树。格式、挂载和自动挂载分别改变不同层次,排障时也必须分开看。

ℹ️ 阅读指南
  • 适合你:已经理解整盘与分区,想选择 ext4/Btrfs/XFS,或需要看懂挂载与 /etc/fstab 的读者。
  • 读完能做到:解释 VFS 与具体文件系统的边界;用只读命令识别真实 UUID;完成一个安全的临时挂载练习;在可恢复测试环境验证一条 fstab 记录。
  • 前置与安全条件:会使用终端。临时挂载练习不格式化磁盘;fstab 练习只允许在有快照和救援介质的虚拟机,对非系统、可丢弃的测试文件系统操作。
  • 适用范围:截至 2026-07,面向使用 util-linux 工具的常见 Linux;发行版安装默认值会变化,应以本机探测与对应版本安装文档为准。
  • 预计用时:阅读 25 分钟;练习约 30 分钟。
  • 完成证据:文件系统选择表、一次 tmpfs 挂载前后记录,以及一份 fstab 备份/验证/回滚日志。

1. 文件系统与 VFS 分别负责什么

具体文件系统把块组织成 inode、目录项、文件数据与空闲空间等结构。Linux 内核中的 VFS(Virtual File System,虚拟文件系统)则提供统一的系统调用接口:应用使用 openreadwrite,VFS 再把操作分派给 ext4、Btrfs、XFS、tmpfs 或网络文件系统的实现。

可以把 VFS 想成统一插座,具体文件系统是不同设备的适配器。边界是:VFS 不会让所有文件系统拥有同样能力。快照、校验、在线扩容、大小写规则和修复工具仍由具体实现与挂载方式决定。

应用 → VFS → 挂载关系 → ext4 / Btrfs / XFS / tmpfs / NFS ... → 块设备或其他后端

因此一个 ext4 根文件系统下面可以挂载 Btrfs 数据盘;应用看到的是一棵目录树,管理员仍需理解每个挂载点背后的类型与设备。

2. 先观察当前文件系统

以下命令只读:

findmnt --real -o TARGET,SOURCE,FSTYPE,OPTIONS
lsblk -f
df -hT
sudo blkid
  • findmnt 以挂载关系为中心,适合回答“这个目录来自哪里”。
  • lsblk -f 以块设备为中心,显示文件系统类型、Label、UUID 和挂载点。
  • df -hT 显示已挂载文件系统的容量使用,不会列出未挂载分区。
  • blkid 读取块设备签名;普通用户权限不足时输出可能不完整。

针对某个路径,可以直接追踪实际挂载:

findmnt --target "$HOME"
stat -f -c 'type=%T block-size=%S' "$HOME"

不要从设备名猜身份。/dev/sdb1 可能随硬件探测顺序变化;持久配置优先使用 UUID=LABEL=PARTUUID=PARTLABEL=,并从本机输出复制真实值。

3. ext4、Btrfs 与 XFS 如何选择

没有一种文件系统在所有负载上都“最好”。选择前先问:是否需要快照/透明压缩、是否要缩小文件系统、故障恢复工具是否熟悉、发行版是否正式支持、备份流程是否已经独立存在。

文件系统主要能力重要限制/成本常见选择理由
ext4成熟的日志文件系统,工具普及;支持在线扩展、离线缩小不原生提供 Btrfs 式子卷、快照与透明压缩;缩小前需卸载并备份通用桌面/服务器、简单布局、重视工具熟悉度
Btrfs写时复制、数据与元数据校验和、子卷、快照、透明压缩;可在线扩缩空间核算与碎片行为更复杂;快照会共享故障域;多设备/RAID 模式需按当前文档评估需要系统快照、子卷或压缩的桌面与受控服务器
XFS成熟的 64 位日志文件系统,擅长大文件系统与并行 I/O;支持在线扩展截至本文范围不支持缩小;主要校验元数据而非普通文件数据;离线修复工具可能丢弃无法重建的元数据大容量、吞吐型工作负载,以及 RHEL 支持体系
⚠️ 一致性功能不等于备份

日志主要帮助文件系统在异常断电后恢复元数据一致性;校验和帮助发现部分损坏;快照保留某一时刻的共享数据。它们都不能替代另一设备/另一主机上的可恢复备份,也无法自动挽回误删后被同步删除的所有副本。

发行版默认值只能作为支持策略的线索。截至 2026-07,Fedora Workstation 的新安装自 Fedora 33 起默认使用 Btrfs(不代表 Fedora Server/Cloud 或升级系统);RHEL 10 的本地默认文件系统是 XFS。自定义分区、不同 Edition 和旧安装可能完全不同,最终仍以 findmnt -no FSTYPE / 为准。

需要子卷、压缩与配额时,继续阅读 Btrfs 进阶与透明压缩;本篇不在现有数据上执行格式化或转换。

4. 挂载把另一棵树接进来

挂载会把文件系统的根目录接到一个已有目录(mount point)。若挂载点原本非空,原内容不会被删除,但在挂载期间会被新的文件系统遮蔽;卸载后才重新可见。这个行为常被误判为“文件丢失”。

安全练习:用 tmpfs 观察遮蔽与恢复

本练习只在内存中创建最多 32 MiB 的 tmpfs,不接触磁盘分区。它会暂时遮蔽练习目录;关闭终端前必须完成卸载。

先创建标记文件并确认当前没有独立挂载:

lab="$HOME/linux-fs-lab"
target="$lab/mountpoint"
mkdir -p "$target"
printf 'visible before mount\n' > "$target/before.txt"
findmnt --mountpoint "$target"
ls -la "$target"

挂载并验证:

sudo mount -t tmpfs -o size=32M,nosuid,nodev tmpfs "$target"
findmnt --target "$target" -o SOURCE,TARGET,FSTYPE,OPTIONS
printf 'inside tmpfs\n' | sudo tee "$target/inside.txt"
ls -la "$target"

预期看到 FSTYPE=tmpfsinside.txt 可见而 before.txt 暂时不可见。若 mount 失败,不要继续创建文件;先检查错误并确认 target 的真实路径。

卸载就是本次状态变更的回滚:

sudo umount "$target"
findmnt --mountpoint "$target"
cat "$target/before.txt"

成功证据是 tmpfs 挂载消失、before.txt 再次显示原内容。若提示 target is busy,先保持目录不变,运行 findmnt --target "$target"sudo fuser -vm "$target" 找到占用者,关闭对应 shell/文件管理器后重试;不要使用强制卸载处理本练习。

5. /etc/fstab 的六个字段

/etc/fstab 是静态文件系统描述表。systemd 系统通常会在启动早期把它转换为 mount/swap 单元;写错关键挂载可能进入 emergency mode。

下面是一行结构示例<...> 必须替换为本机探测结果,不能原样执行:

UUID=<真实文件系统UUID>  /mnt/fs-test  ext4  defaults,nofail  0  2
字段示例含义
1. fs_specUUID=...文件系统来源,也可为设备、Label、PARTUUID、网络地址或 Swap 文件
2. fs_file/mnt/fs-test挂载目标;Swap 通常写 none
3. fs_vfstypeext4文件系统类型;应与真实签名匹配
4. fs_mntopsdefaults,nofail逗号分隔的挂载选项;defaults 的具体效果由内核/文件系统决定,nofail 表示缺失不应使启动失败
5. fs_freq0传统 dump 备份频率字段;多数现代系统写 0
6. fs_passno2启动时文件系统检查顺序:根常为 1,其他可检查文件系统常为 2,0 表示不安排此项检查;systemd 的处理与传统顺序细节不完全相同

subvol=@home 是 Btrfs 专用挂载选项,只在该 Btrfs 文件系统真实存在对应子卷时成立。不要把另一台机器的 UUID、子卷名或 0 1 直接复制到本机。

6. 安全实操:验证一条测试 fstab 记录

🚫 只允许非关键测试卷

本节会修改 /etc/fstab。必须使用有快照和救援 ISO 的虚拟机,以及一个已创建文件系统、没有重要数据、当前未挂载的测试分区/逻辑卷。目标不能是 //boot、ESP、/home、正在使用的 Swap 或宿主机直通盘。若无法唯一确认来源与 UUID,停止。

6.1 探测、核对、备份

lsblk -f
sudo blkid
findmnt --verify --verbose

从输出复制测试文件系统的真实 UUID 和类型,确认它当前未挂载。设置变量时把占位内容替换为真实值:

source_uuid="<从 blkid 复制的真实 UUID>"
target="/mnt/fs-test"
findmnt --source "UUID=$source_uuid"
findmnt --mountpoint "$target"

两个 findmnt 若没有匹配会以非零状态结束,这正是“尚未挂载”的预期证据;若显示现有挂载,停止并重新选择专用测试卷。

记录当前配置并准备空挂载点:

backup="/etc/fstab.bak.$(date +%Y%m%d-%H%M%S)"
sudo cp --preserve=all /etc/fstab "$backup"
sudo mkdir -p "$target"
printf 'fstab backup: %s\n' "$backup"

6.2 编辑、静态验证、实际挂载

sudoedit /etc/fstab
sudo findmnt --verify --verbose

在编辑器中只增加一行;文件系统类型必须来自 blkid,这里以 ext4 为例:

UUID=<真实文件系统UUID>  /mnt/fs-test  ext4  defaults,nofail  0  2

如果 findmnt --verify 报错,不要执行 mount、不要重启,立即恢复:

sudo cp --preserve=all "$backup" /etc/fstab
sudo findmnt --verify --verbose

静态验证通过后,按 fstab 中的目标发起这一次挂载:

sudo mount "$target"
findmnt --mountpoint "$target" -o SOURCE,TARGET,FSTYPE,OPTIONS,UUID

成功证据是 SOURCE/UUID 与探测值一致、FSTYPE 正确。findmnt --verify 只能检查语法和当下可发现的一致性;它不能保证移动硬盘下次启动一定在线,也不能覆盖所有驱动、网络和解密时序问题。

如果 mount 失败,保持系统不重启,运行:

findmnt --verify --verbose
journalctl -k -n 50 --no-pager

根据“UUID 不存在、类型不匹配、挂载点问题或文件系统错误”选择下一步,不要尝试 mount -a 扩大测试范围。

6.3 回滚并验证恢复

if mountpoint -q "$target"; then
  sudo umount "$target"
fi
sudo cp --preserve=all "$backup" /etc/fstab
sudo findmnt --verify --verbose
sudo rmdir "$target"

rmdir 只会删除空目录;若失败,先检查目录内容,不要递归删除。最后确认测试 UUID 未挂载,保存验证输出,然后才能删除虚拟机快照。

7. Swap 不是固定公式

Swap 可以是分区、文件、zram 设备,或多种方式组合。分区不天然比文件“更快”;实际差异取决于存储、文件系统、内核和布局。Swap 文件便于调整,但 Btrfs 等文件系统对 Swap 文件有专门约束,应使用发行版工具和当前文档创建。

先观察本机:

swapon --show --output=NAME,TYPE,SIZE,USED,PRIO
free -h
zramctl 2>/dev/null

容量规划至少区分:

  • 不休眠的桌面:Swap 是内存压力缓冲,需求取决于峰值工作集、RAM、OOM 策略和是否使用 zram;“RAM 的 1–2 倍”不是通用规则。
  • 需要休眠:必须让休眠实现有能力保存当时需写出的内存镜像,并正确设置 resume 路径;所需空间与实际已用内存、压缩和内核/发行版实现相关。
  • 服务器:需结合延迟目标、OOM 行为与监控;大量换页可能意味着内存不足,而不是继续扩大 Swap 就能解决。

发行版的“默认 Swap”会随版本、Edition 和安装方式改变。不要因文章声称某发行版默认使用 Swap 文件或 zram,就假定现有升级系统相同;以 swapon --show 为证据。

8. 常见故障与排查

症状可能原因最安全的诊断下一步决策
mount: wrong fs typefstab 类型写错、缺少驱动/工具,或签名损坏blkidlsblk -fjournalctl -k -n 50类型不符就修配置;疑似损坏时停止写入并走对应文件系统救援
挂载后原目录内容“不见了”非空目录被新文件系统遮蔽findmnt --target <目录>、在安全时段检查占用正常卸载后确认原内容;不要在新挂载上重建同名文件
umount: target is busy进程当前目录或打开文件位于挂载内sudo fuser -vm <挂载点>退出相关进程后重试;核心目录不要强制卸载
启动进入 emergency modefstab 的 UUID、类型、选项或必需设备错误救援 shell 中运行 findmnt --verify,查看 journalctl -xb恢复备份或修正明确错误;先不要运行文件系统写修复
findmnt --verify 通过但重启仍等待设备设备下次未出现、解密/网络/驱动时序不同journalctl -b -u '*.mount'systemctl --failed按设备性质设计 nofail/超时/依赖;验证真实启动场景
空间很多却写入失败inode/元数据/配额耗尽,或文件系统只读df -hTdf -ifindmnt -o OPTIONS先确认是哪种资源与只读原因,不要盲目删除系统文件
⚠️ 文件系统损坏的停止条件

出现 I/O error、介质掉线、重复校验错误,或重要卷无法只读挂载时,停止格式化、fsck -yxfs_repairbtrfs check --repair 等写操作。先制作可恢复副本并转到对应文件系统的救援流程。

9. 小结与下一站

你已经能区分 VFS 与具体文件系统,按能力和运维成本选择 ext4/Btrfs/XFS,用 UUID 追踪真实来源,并为 mount/fstab 操作完成探测、风险、备份、修改、验证和回滚。下一篇 Btrfs 进阶与透明压缩 会在这个基础上展开子卷、压缩与配额。

官方参考

修订记录

2026-02-24 初版发布 介绍 ext4、Btrfs、XFS、挂载与 Swap 基础。
2026-07-21 实质修订 补充 VFS、文件系统选型取舍、真实 UUID 发现、fstab 六字段与完整安全闭环、tmpfs 可观察练习、Swap 边界和分层排障。
Navigation