主题
磁盘管理
磁盘是数据的家。磁盘满了服务停摆、分区表写错系统启动不了——这些都是真实发生过的事故。本篇覆盖从分区到 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 # 激活 swapmount 与 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/fstabbash
# /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 → ext4LVM 实战:从零创建
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 /dataLVM 在线扩容(不停服务)
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 /dataXFS 不支持缩容
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查找大文件清理空间
加载练习题中...