Linux 磁盘与文件系统管理:原理、工具与实战
更新: 8/29/2026字数: 0 字 时长: 0 分钟

在 Linux 系统中,“一切皆文件”,对存储设备(硬盘、SSD、U 盘)的管理本质上就是对分区、文件系统挂载与使用率监控的管理。
无论是扩展服务器存储、挂载新硬盘,还是排查磁盘空间爆满问题,掌握磁盘与文件系统管理都是 Linux 运维与开发的基本功。
1. 核心概念:从物理磁盘到文件系统
硬盘接入服务器后,不能直接写入数据,需要经过以下三个步骤:
┌─────────────────┐ 分区 (Partition) ┌─────────────────┐
│ 物理磁盘 (Block)│ ──────────────────────> │ 磁盘分区 /dev/sdb1 │
└─────────────────┘ └────────┬────────┘
│
│ 格式化 (Format)
▼
┌─────────────────┐ 挂载 (Mount) ┌─────────────────┐
│ 目录节点 /data │ <────────────────────── │ 文件系统 (ext4/xfs)│
└─────────────────┘ └─────────────────┘- 磁盘设备命名:Linux 中所有设备都在
/dev/目录下。
- SATA / SAS / SCSI 硬盘:命名为
/dev/sda、/dev/sdb等(字母代表第几块盘,数字代表第几个分区,如/dev/sda1)。 - NVMe M.2 固态硬盘:命名为
/dev/nvme0n1、/dev/nvme0n1p1。
- 分区表格式:
- MBR:较老,最大支持 2TB 磁盘,最多 4 个主分区。
- GPT:现代标准,支持 >2TB 大盘,几乎无分区数量限制。
- 文件系统 (File System):定义数据在磁盘上的组织方式。常用文件系统:
ext4:Linux 传统通用文件系统,兼容性好。xfs:CentOS/RHEL 默认文件系统,在大文件与高性能 I/O 表现上更优秀。
2. 磁盘使用率与健康度查看
2.1 查看磁盘空间占用:df (Disk Free)
df 用于查看文件系统级别的整体容量与使用率。
bash
# -h: 人性化显示 (Human-readable, MB/GB)
# -T: 显示文件系统类型 (ext4/xfs 等)
df -hT- 常见坑点:
df -h没满,但写不进文件? 输入df -i查看 Inode 使用率。如果系统中产生了数百万个小文件(如小日志、缓存),可能会出现“磁盘空间还很多,但 Inode 已 100% 耗尽”的情况。
2.2 统计目录/文件大小:du (Disk Usage)
du 用于深入具体目录,查找“到底是谁占用了大空间”。
bash
# 查看当前目录下各个文件夹的大小(深度为 1)
du -h --max-depth=1 /var/log
# 快速找出当前目录下最大的前 10 个文件/目录
du -ah . | sort -rh | head -n 102.3 查看磁盘块设备与分区列表:lsblk & fdisk
bash
# 查看系统所有磁盘及分区的树状结构(非常直观)
lsblk
# 查看磁盘分区的具体细节(需 root 权限)
sudo fdisk -l3. 实战:给服务器添加新硬盘(分区、格式化、挂载)
假设你为服务器新增了一块 100GB 的磁盘 /dev/sdb,需要将其挂载到 /data 目录供业务使用。
3.1 步骤 1:对磁盘进行分区
使用 fdisk 对磁盘进行交互式分区:
bash
sudo fdisk /dev/sdb- 输入
n新建分区。 - 依次按回车选择默认的主分区和范围。
- 输入
w保存分区表并退出。 - 此时通过
lsblk可以看到生成了新分区 /dev/sdb1。
3.2 步骤 2:格式化文件系统
创建完分区后,需要将其写入指定的格式(如 ext4 或 xfs):
bash
# 格式化为 ext4 文件系统
sudo mkfs.ext4 /dev/sdb1
# 或者格式化为 xfs 文件系统
sudo mkfs.xfs /dev/sdb13.3 步骤 3:挂载文件系统 (Mount)
将格式化好的分区连接到系统中的空目录:
bash
# 1. 创建挂载点目录
sudo mkdir -p /data
# 2. 临时挂载(重启后失效)
sudo mount /dev/sdb1 /data
# 3. 验证挂载结果
df -h | grep /data3.4 步骤 4:配置开机自动挂载(修改 /etc/fstab)
如果只做了 mount,服务器重启后挂载就会丢失。必须将挂载信息写入 /etc/fstab。
为了防止磁盘设备名(如 /dev/sdb1)在重启后漂移,强烈推荐使用 UUID:
bash
# 1. 查询 /dev/sdb1 的 UUID
sudo blkid /dev/sdb1
# 输出示例: /dev/sdb1: UUID="a1b2c3d4-e5f6-7890-abcd-1234567890ab" TYPE="ext4"
# 2. 编辑 /etc/fstab 文件
sudo nano /etc/fstab
# 3. 在文件末尾添加一行(格式:UUID 挂载点 文件系统类型 挂载参数 备份 检查):
UUID=a1b2c3d4-e5f6-7890-abcd-1234567890ab /data ext4 defaults 0 2
# 4. ⚠️ 极其关键的一步:测试 fstab 配置是否正确
sudo mount -a⚠️ 高危提醒:如果
/etc/fstab语法写错,服务器下次重启时会无法开机并直接进入紧急恢复模式(Emergency Mode)!修改后必须运行sudo mount -a,如果没有报错才说明配置正确。
4. 生产环境高频问题排查
场景:文件删除了,但 df -h 空间没有释放?
- 原因:当某个日志文件正在被某个运行中的进程(如 Nginx、Java)持续写入时,你直接使用
rm app.log删除了文件名,但进程依然持有该文件的文件句柄,导致磁盘空间并未真正释放。 - 排查方法:
bash
# 查找已经被删除但依然被进程占用的文件 (deleted)
sudo lsof | grep deleted- 解决办法:
- 重启占用该句柄的服务(如
sudo systemctl restart nginx)。 - 针对日后清空日志,**不要直接
rm**,使用清空文件内容的方式:> app.log或cat /dev/null > app.log。
5. 总结
- 监控三板斧:用
df -h看整体空间,用df -i看 Inode 消耗,用du -sh *定位大文件。 - 挂载标准流程:分区 (
fdisk) ➔ 格式化 (mkfs) ➔ 临时挂载 (mount) ➔ 写入/etc/fstab➔ 校验 (mount -a)。 - 安全规范:写入
/etc/fstab时优先采用 UUID 方式,修改完毕务必执行mount -a确认无误。