文件系统
概述
文件系统是操作系统用于组织和存储文件的机制,定义了数据在存储介质上的布局结构。
Linux 通过 VFS(Virtual File System) 提供统一的文件操作接口,屏蔽底层文件系统差异。
用户空间
open() / read() / write() / stat()
↓
VFS (Virtual File System)
↓
ext4 | xfs | btrfs | tmpfs | nfs | ...
↓
块设备层 / 网络层常见文件系统类型
| 类型 | 说明 |
|---|---|
ext4 | Linux 最常用的磁盘文件系统,支持日志 |
xfs | 高性能日志文件系统,RHEL/CentOS 默认 |
btrfs | 下一代写时复制(CoW)文件系统,支持快照 |
tmpfs | 基于内存的临时文件系统(/tmp、/run) |
proc | 内核进程信息虚拟文件系统(/proc) |
sysfs | 内核对象/设备信息虚拟文件系统(/sys) |
devtmpfs | 设备文件系统(/dev) |
nfs | 网络文件系统 |
cifs/smb | Windows 共享文件系统 |
vfat | FAT32,兼容 Windows/UEFI |
iso9660 | CD/DVD 光盘格式 |
overlay | 联合文件系统,Docker 使用 |
查看系统支持的文件系统类型:
bash
cat /proc/filesystemsUUID
设备名(如 /dev/sda1)会随内核发现设备的顺序而改变,因此推荐使用文件系统的通用唯一标识符(UUID)来挂载,确保挂载稳定。
bash
# 查看设备 UUID
blkid
blkid /dev/sda1
# lsblk 查看
lsblk -f
# 使用 UUID 挂载
mount UUID=xxxxxx-xxxx-xxxx /mnt/data
# /etc/fstab 中使用 UUID
UUID=xxxxxx-xxxx-xxxx /mnt/data ext4 defaults 0 2inode
每个文件/目录对应一个 inode,记录文件的元数据(不含文件名)。
inode 中存储的信息:
- 文件类型(普通文件、目录、链接等)
- 权限(rwx)
- 链接数
- UID / GID
- 文件大小
- 时间戳(atime 访问、mtime 修改内容、ctime 状态变更)
- 数据块指针
bash
# 查看文件的 inode 编号
ls -i file.txt
stat file.txt
# 查看文件系统 inode 使用情况
df -i
df -ih /若 inode 耗尽,即使磁盘空间充足也无法创建新文件。小文件(如日志、临时文件)容易耗尽 inode。
ext4
ext4 是 ext3 的后继版本,Linux 最广泛使用的磁盘文件系统。
特性
- 日志(Journaling):写操作先记录日志,崩溃后可恢复,避免数据不一致
- Extents:连续块描述符,替代传统间接块指针,提高大文件性能
- 延迟分配(Delayed Allocation):提高写性能,减少碎片
- 最大文件大小:16 TB
- 最大卷大小:1 EB
常用命令
bash
# 创建 ext4 文件系统
mkfs.ext4 /dev/sda1
mkfs.ext4 -L "data" /dev/sda1 # 设置卷标
# 查看文件系统信息
tune2fs -l /dev/sda1
dumpe2fs /dev/sda1 | head -40
# 检查并修复 ext4(需卸载)
fsck.ext4 /dev/sda1
e2fsck -f /dev/sda1
# 在线调整大小(扩容,LVM 扩容后执行)
resize2fs /dev/sda1
resize2fs /dev/sda1 20G # 指定目标大小
# 修改卷标
e2label /dev/sda1 "newlabel"
tune2fs -L "newlabel" /dev/sda1
# 调整 inode 数量(格式化时)
mkfs.ext4 -N 1000000 /dev/sda1xfs
XFS 是高性能 64 位日志文件系统,适合大文件和高并发 I/O。
bash
# 创建 xfs 文件系统
mkfs.xfs /dev/sda2
mkfs.xfs -L "data" /dev/sda2
# 查看信息
xfs_info /mnt/data
# 检查并修复(需卸载)
xfs_repair /dev/sda2
# 在线扩容
xfs_growfs /mnt/data
# 碎片整理
xfs_fsr /mnt/datatmpfs
基于内存(和 swap)的临时文件系统,重启后数据消失。
bash
# 挂载 tmpfs
mount -t tmpfs -o size=512m tmpfs /mnt/ramdisk
# /etc/fstab 中
tmpfs /tmp tmpfs defaults,size=2G,noatime 0 0
tmpfs /run tmpfs defaults,size=256m 0 0
# 查看 tmpfs 信息
df -h /tmp链接
硬链接(Hard Link)
bash
ln source.txt hard_link.txt
# 两个目录项指向同一个 inode,删除其中一个不影响另一个
# 不能跨文件系统,不能链接目录软链接(符号链接 Symbolic Link)
bash
ln -s /path/to/target symlink_name
# 类似快捷方式,存储目标路径
# 可跨文件系统,可链接目录
# 目标删除后符号链接悬空(dangling)
# 查看链接目标
readlink symlink_name
readlink -f symlink_name # 解析所有层级文件系统检查工具
bash
# 通用工具
fsck /dev/sda1 # 自动选择文件系统类型
fsck -t ext4 /dev/sda1 # 指定类型
# 查看挂载信息
mount
cat /proc/mounts
findmnt
findmnt -t ext4 # 只显示 ext4
# 磁盘使用率
df -Th # 含文件系统类型
# 目录大小
du -sh /var/*