Skip to content
 

Linux 磁盘与文件系统管理:原理、工具与实战 ​

更新: 8/29/2026字数: 0 字 时长: 0 分钟

在 Linux 系统中,“一切皆文件”,对存储设备(硬盘、SSD、U 盘)的管理本质上就是对分区、文件系统挂载与使用率监控的管理。

无论是扩展服务器存储、挂载新硬盘,还是排查磁盘空间爆满问题,掌握磁盘与文件系统管理都是 Linux 运维与开发的基本功。

1. 核心概念:从物理磁盘到文件系统 ​

硬盘接入服务器后,不能直接写入数据,需要经过以下三个步骤:

┌─────────────────┐     分区 (Partition)     ┌─────────────────┐
│  物理磁盘 (Block)│ ──────────────────────> │  磁盘分区 /dev/sdb1 │
└─────────────────┘                         └────────┬────────┘
                                                     │
                                                     │ 格式化 (Format)
                                                     ▼
┌─────────────────┐     挂载 (Mount)        ┌─────────────────┐
│ 目录节点 /data   │ <────────────────────── │ 文件系统 (ext4/xfs)│
└─────────────────┘                         └─────────────────┘
  1. 磁盘设备命名:Linux 中所有设备都在 /dev/ 目录下。
  • SATA / SAS / SCSI 硬盘:命名为 /dev/sda、/dev/sdb 等(字母代表第几块盘,数字代表第几个分区,如 /dev/sda1)。
  • NVMe M.2 固态硬盘:命名为 /dev/nvme0n1、/dev/nvme0n1p1。
  1. 分区表格式:
  • MBR:较老,最大支持 2TB 磁盘,最多 4 个主分区。
  • GPT:现代标准,支持 >2TB 大盘,几乎无分区数量限制。
  1. 文件系统 (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 10

2.3 查看磁盘块设备与分区列表:lsblk & fdisk ​

bash
# 查看系统所有磁盘及分区的树状结构(非常直观)
lsblk

# 查看磁盘分区的具体细节(需 root 权限)
sudo fdisk -l

3. 实战:给服务器添加新硬盘(分区、格式化、挂载) ​

假设你为服务器新增了一块 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/sdb1

3.3 步骤 3:挂载文件系统 (Mount) ​

将格式化好的分区连接到系统中的空目录:

bash
# 1. 创建挂载点目录
sudo mkdir -p /data

# 2. 临时挂载(重启后失效)
sudo mount /dev/sdb1 /data

# 3. 验证挂载结果
df -h | grep /data

3.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
  • 解决办法:
  1. 重启占用该句柄的服务(如 sudo systemctl restart nginx)。
  2. 针对日后清空日志,**不要直接 rm**,使用清空文件内容的方式:> app.log 或 cat /dev/null > app.log。

5. 总结 ​

  1. 监控三板斧:用 df -h 看整体空间,用 df -i 看 Inode 消耗,用 du -sh * 定位大文件。
  2. 挂载标准流程:分区 (fdisk) ➔ 格式化 (mkfs) ➔ 临时挂载 (mount) ➔ 写入 /etc/fstab ➔ 校验 (mount -a)。
  3. 安全规范:写入 /etc/fstab 时优先采用 UUID 方式,修改完毕务必执行 mount -a 确认无误。