Linux 文件系统与存储

Linux 通过 VFS(Virtual File System) 抽象层统一不同文件系统的接口,使得用户态程序可以用同一套 read/write/open 系统调用访问 ext4、XFS、NFS 等底层实现。

VFS 核心对象

  • superblock — 描述已挂载的文件系统(块大小、状态、挂载选项)
  • inode — 文件元数据(权限、所有者、时间戳、数据块指针),不含文件名
  • dentry — 文件名到 inode 的映射,维护目录树结构
  • file — 进程打开的文件实例,含读写偏移量和访问模式

inode 结构

每个文件对应一个 inode,存储权限位(rwx/SUID/SGID/sticky)、UID/GID、三个时间戳(atime/mtime/ctime)以及数据块指针。inode 耗尽时即使磁盘有空间也无法创建新文件,这是 SRE 常见故障之一。

常见文件系统

文件系统特点典型场景
ext4成熟稳定,日志型通用 Linux 系统盘
XFS高性能并行 I/O,擅长大文件数据库、日志存储
btrfs快照、压缩、校验、子卷容器镜像层、需要快照的场景
tmpfs基于内存/tmp、/run、容器内临时目录

挂载与 /etc/fstab

mount -t xfs /dev/sdb1 /data          # 手动挂载
mount | grep sda                       # 查看挂载
lsblk -f                               # 列出块设备及文件系统
blkid /dev/sdb1                        # 查看 UUID
findmnt --target /data                 # 树形展示挂载关系

/etc/fstab 格式:<设备> <挂载点> <类型> <选项> <dump> <fsck顺序>

UUID=xxx  /data  xfs  defaults,noatime  0  2

noatime 减少写入提升性能;noexec 禁止执行挂载点上的二进制文件。

I/O 调度器

调度器策略适用场景
mq-deadline按截止时间排序通用、数据库
bfq按进程公平分配 I/O桌面、交互式负载
none不调度,直接下发NVMe 等低延迟设备
cat /sys/block/sda/queue/scheduler             # 查看当前调度器
echo mq-deadline > /sys/block/sda/queue/scheduler  # 临时切换

SRE 关键实践

磁盘空间监控

df -hT                                       # 文件系统使用概览
du -sh /var/log/* | sort -rh | head -20      # 按目录统计空间
find / -xdev -type f -size +500M -ls         # 查找大文件

告警阈值:80% warning,90% critical。

inode 耗尽排查

df -i                                        # inode 使用情况
for d in /*; do echo "$(find "$d" -xdev 2>/dev/null | wc -l) $d"; done | sort -rn | head -10

常见原因:大量小文件(邮件队列、session 文件、缓存目录)。

文件系统修复

umount /dev/sdb1                             # 必须先卸载
fsck.ext4 -y /dev/sdb1                      # ext4
xfs_repair /dev/sdb1                         # XFS(必须用专用工具)

XFS 不能用通用 fsck,操作前建议做快照备份。

只读恢复

dmesg | grep -i "error\|readonly"            # 确认原因
mount -o remount,rw /                        # 尝试重新挂载

若失败需在维护模式下 fsck。