Skip to content

磁盘管理 ​

磁盘是数据的家。磁盘满了服务停摆、分区表写错系统启动不了——这些都是真实发生过的事故。本篇覆盖从分区到 LVM 到排故,每个步骤都有可执行的命令。

查看磁盘使用 ​

bash
# 分区使用概览
df -h                            # 人类可读格式
df -i                            # inode 使用率(inode 满了也创建不了文件)

# 排查大文件
ncdu /                           # 交互式磁盘分析器(需 apt install ncdu)
du -sh /* 2>/dev/null | sort -hr | head -10    # 根下各目录大小
du -sh /var/log/* | sort -hr | head -5         # 日志目录
du -h --max-depth=1 /home | sort -hr           # 一级目录大小

# 找大文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
find / -type f -size +500M 2>/dev/null | xargs ls -lh

识别磁盘和分区 ​

bash
# 列出所有块设备
lsblk
lsblk -f                         # 含文件系统类型和 UUID

# 详细信息
sudo blkid                       # 显示 UUID 和文件系统
sudo fdisk -l                    # 分区表详情
sudo parted -l                   # 另一种查看方式

分区与格式化 ​

fdisk 分区(MBR ≤2TB) ​

bash
# /dev/sdb 是你要操作的新磁盘
sudo fdisk /dev/sdb
# n → 新建分区 → p 主分区 → 回车(默认分区号)→ 回车(默认起始扇区)
# → +50G(分区大小)→ w(写入并退出)

parted 分区(GPT,支持 >2TB) ​

bash
sudo parted /dev/sdb
# mklabel gpt           → 创建 GPT 分区表
# mkpart primary 0% 100% → 单分区占全盘
# print                 → 确认分区表
# quit

格式化 ​

bash
# 格式化分区
sudo mkfs.ext4 /dev/sdb1         # ext4(最常用)
sudo mkfs.xfs /dev/sdb1          # XFS(RHEL 默认,大文件优化)
sudo mkswap /dev/sdb2            # 创建 swap 分区
sudo swapon /dev/sdb2            # 激活 swap

mount 与 fstab ​

临时挂载 ​

bash
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data
df -h | grep /mnt/data           # 确认挂载成功

永久挂载(fstab) ​

bash
# 先用 blkid 获取 UUID
sudo blkid /dev/sdb1
# /dev/sdb1: UUID="a1b2c3d4-..." TYPE="ext4"

# 编辑 /etc/fstab,添加一行
sudo vim /etc/fstab
bash
# /etc/fstab 格式:
# <设备>          <挂载点>    <类型>  <选项>          <dump> <pass>
UUID=a1b2c3d4...  /mnt/data   ext4    defaults,noatime  0      2

# 字段说明:
# defaults = rw, suid, dev, exec, auto, nouser, async
# noatime  = 不记录访问时间,提高 SSD 性能和寿命
# dump     = 0 不备份,1 备份(几乎不用)
# pass     = 0 不检查,1 根分区,2 其他分区
bash
# 验证 fstab 是否正确(不真正挂载,只检查语法)
sudo mount -a
# 如果没有任何报错,说明 fstab 没问题

fstab 写错导致系统启动不了

  • 启动时会尝试挂载 fstab 中的所有条目
  • 如果某个条目有问题,系统可能进入 emergency mode
  • 解决:在 emergency mode 下,mount -o remount,rw / 然后修 fstab
  • 预防:修改 fstab 后立即 mount -a 验证

LVM(逻辑卷管理) ​

LVM 让你可以动态调整分区大小,不重启、不丢数据。生产环境强烈推荐。

概念 ​

物理卷(PV) → 卷组(VG) → 逻辑卷(LV) → 文件系统
/dev/sdb  →  vg_data  → lv_data   → ext4

LVM 实战:从零创建 ​

bash
# 1. 创建物理卷
sudo pvcreate /dev/sdb

# 2. 创建卷组
sudo vgcreate vg_data /dev/sdb

# 3. 创建逻辑卷(100G)
sudo lvcreate -L 100G -n lv_data vg_data

# 4. 格式化
sudo mkfs.ext4 /dev/vg_data/lv_data

# 5. 挂载
sudo mkdir -p /data
sudo mount /dev/vg_data/lv_data /data

LVM 在线扩容(不停服务) ​

bash
# 场景:lv_data 从 100G 扩到 150G

# 1. 检查 VG 是否有空闲空间
sudo vgs

# 2. 扩容逻辑卷
sudo lvextend -L +50G /dev/vg_data/lv_data   # 加 50G
# 或:sudo lvextend -L 150G /dev/vg_data/lv_data  # 扩到 150G

# 3. 扩容文件系统(不同文件系统命令不同)
sudo resize2fs /dev/vg_data/lv_data           # ext4
# sudo xfs_growfs /data                        # XFS(这里传挂载点不是设备)

LVM 缩容(ext4 支持,XFS 不支持缩容!) ​

bash
# ⚠️ 缩容有风险,必须先备份!
# ext4 缩容要求先 umount

sudo umount /data
sudo e2fsck -f /dev/vg_data/lv_data           # 先检查文件系统
sudo resize2fs /dev/vg_data/lv_data 80G        # 先缩文件系统
sudo lvreduce -L 80G /dev/vg_data/lv_data      # 再缩逻辑卷
sudo mount /data

XFS 不支持缩容

Red Hat 官方明确 XFS 不支持缩小。如果需要缩容功能,创建时选 ext4。

更常见的扩容场景:加新硬盘 ​

bash
# 已有 vg_data,加一块新硬盘

# 1. 把新硬盘做成 PV
sudo pvcreate /dev/sdc

# 2. 扩展现有 VG
sudo vgextend vg_data /dev/sdc

# 3. LV 扩容 + 文件系统扩容(同一命令一步到位)
sudo lvextend -r -L +200G /dev/vg_data/lv_data
# -r 自动 resize 文件系统,不必再手动 resize2fs

# 查看结果
df -h /data

完整实战:新硬盘全流程 ​

bash
# === 新硬盘 = /dev/sdc,要挂载到 /opt/backup ===

# 1. 确认磁盘
lsblk
# 看到 /dev/sdc,大小 500G,没有分区

# 2. 分区(GPT)
sudo parted /dev/sdc mklabel gpt
sudo parted /dev/sdc mkpart primary 0% 100%
lsblk /dev/sdc      # 应该看到 sdc1

# 3. 格式化
sudo mkfs.ext4 /dev/sdc1

# 4. 创建挂载点
sudo mkdir -p /opt/backup

# 5. 获取 UUID
sudo blkid /dev/sdc1

# 6. 写入 fstab
echo "UUID=xxx-xxx-xxx /opt/backup ext4 defaults,noatime 0 2" | sudo tee -a /etc/fstab

# 7. 验证并挂载
sudo mount -a        # 验证 fstab 语法
df -h | grep backup  # 确认挂载成功

常见坑 ​

坑 1:umount 提示 "target is busy" ​

bash
# 有进程正在使用该目录
# 找出是谁
sudo fuser -m /mnt/data
sudo lsof /mnt/data

# 杀掉占用进程
sudo fuser -km /mnt/data

# 或者懒卸载(等没人用了自动解除)
sudo umount -l /mnt/data

坑 2:df 和 du 对不上 ​

bash
# df 显示磁盘用了 80G,du 显示文件只占 10G
# 原因:有进程还持有已删除文件(deleted file)的句柄

# 找到 deleted 文件
sudo lsof | grep deleted | sort -k7 -nr | head
# 第7列是文件大小

# 解决方法:restart 或 kill 对应进程
# 如果进程不能停:清空文件内容
> /proc/<PID>/fd/<FD号>
# 或:echo "" > /proc/PID/fd/3

坑 3:inode 耗尽但磁盘有空 ​

bash
df -h          # 显示磁盘还有 50% 空间
df -i          # 但 inode 使用率 100%

# 原因:大量小文件(邮件、缓存、session 文件)
# 定位:哪个目录小文件最多
for dir in /var/*; do
    echo "$(find "$dir" -type f 2>/dev/null | wc -l) $dir"
done | sort -rn | head

# 没有 inode 就无法创建新文件,即使有剩余空间
# 解决方法:清理不再需要的小文件,或增大 inode(需重新格式化)

生产环境经验 ​

  • LVM 是标配:分区用 LVM,随时扩容不用停机
  • noatime 挂载:SSD 上 noatime 能大幅减少不必要的写入
  • 监控磁盘使用:df -h 超过 80% 告警,预留缓冲时间
  • XFS vs ext4:XFS 大文件性能好、支持更大容量;ext4 支持缩容、更通用
  • fstab 用 UUID:不要用 /dev/sdb1 这类设备名(可能因加盘而改变),用 UUID
  • 定期检查坏道:sudo smartctl -a /dev/sda | grep -i error

🎯 本章要点 ​

  • df 看分区空间,du 看目录/文件大小
  • inode 满了无法创建新文件(用 df -i 检查)
  • 用 find -size +100M 查找大文件清理空间
加载练习题中...

有问题或补充?欢迎留言