文件系统基础
磁盘已经分区,系统仍不能把它当作目录使用:还要在块空间上创建文件系统,再把这个文件系统接入 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,虚拟文件系统)则提供统一的系统调用接口:应用使用 open、read、write,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 blkidfindmnt以挂载关系为中心,适合回答“这个目录来自哪里”。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=tmpfs,inside.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_spec | UUID=... | 文件系统来源,也可为设备、Label、PARTUUID、网络地址或 Swap 文件 |
2. fs_file | /mnt/fs-test | 挂载目标;Swap 通常写 none |
3. fs_vfstype | ext4 | 文件系统类型;应与真实签名匹配 |
4. fs_mntops | defaults,nofail | 逗号分隔的挂载选项;defaults 的具体效果由内核/文件系统决定,nofail 表示缺失不应使启动失败 |
5. fs_freq | 0 | 传统 dump 备份频率字段;多数现代系统写 0 |
6. fs_passno | 2 | 启动时文件系统检查顺序:根常为 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 type | fstab 类型写错、缺少驱动/工具,或签名损坏 | blkid、lsblk -f、journalctl -k -n 50 | 类型不符就修配置;疑似损坏时停止写入并走对应文件系统救援 |
| 挂载后原目录内容“不见了” | 非空目录被新文件系统遮蔽 | findmnt --target <目录>、在安全时段检查占用 | 正常卸载后确认原内容;不要在新挂载上重建同名文件 |
umount: target is busy | 进程当前目录或打开文件位于挂载内 | sudo fuser -vm <挂载点> | 退出相关进程后重试;核心目录不要强制卸载 |
| 启动进入 emergency mode | fstab 的 UUID、类型、选项或必需设备错误 | 救援 shell 中运行 findmnt --verify,查看 journalctl -xb | 恢复备份或修正明确错误;先不要运行文件系统写修复 |
findmnt --verify 通过但重启仍等待设备 | 设备下次未出现、解密/网络/驱动时序不同 | journalctl -b -u '*.mount'、systemctl --failed | 按设备性质设计 nofail/超时/依赖;验证真实启动场景 |
| 空间很多却写入失败 | inode/元数据/配额耗尽,或文件系统只读 | df -hT、df -i、findmnt -o OPTIONS | 先确认是哪种资源与只读原因,不要盲目删除系统文件 |
出现 I/O error、介质掉线、重复校验错误,或重要卷无法只读挂载时,停止格式化、fsck -y、xfs_repair 和 btrfs check --repair 等写操作。先制作可恢复副本并转到对应文件系统的救援流程。
9. 小结与下一站
你已经能区分 VFS 与具体文件系统,按能力和运维成本选择 ext4/Btrfs/XFS,用 UUID 追踪真实来源,并为 mount/fstab 操作完成探测、风险、备份、修改、验证和回滚。下一篇 Btrfs 进阶与透明压缩 会在这个基础上展开子卷、压缩与配额。
官方参考
- Linux Kernel:ext4 documentation
- Btrfs documentation
- Linux Kernel:XFS documentation
- util-linux:fstab(5)
- Fedora 33 Release Notes:Workstation 默认 Btrfs 的适用范围
- RHEL 10:Managing file systems