{T}

磁盘管理与存储运维

概述:掌握 Linux 磁盘空间监控、分区管理、文件系统格式化与挂载配置,为服务器存储运维建立完整操作能力。

前置知识

  • 熟悉 Linux 基本命令(ls、cd、cat)
  • 理解块设备、分区、文件系统的基本概念

学习目标

  • 使用 df/du/lsblk 监控磁盘使用情况
  • 理解 MBR/GPT 分区表与 fdisk 操作
  • 掌握文件系统格式化与挂载/卸载
  • 配置 /etc/fstab 实现开机自动挂载

1. 磁盘空间监控

1.1 df — 文件系统级空间

bash
# 人性化显示所有挂载点
df -h

# 输出示例
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        20G  5.2G   14G  28% /
tmpfs           992M     0  992M   0% /dev/shm
/dev/vdb1       100G   30G   70G  30% /data
字段含义
Filesystem设备名称(/dev/vda1 = 第一块虚拟磁盘第一分区)
Size / Used / Avail总容量 / 已用 / 可用
Use%使用百分比(超过 80% 需关注)
Mounted on挂载点
bash
# 显示文件系统类型
df -T

# 查看 inode 使用情况(小文件过多时 inode 先耗尽)
df -i

# 只看某个目录所在分区
df -h /home

1.2 du — 目录级空间

bash
# 查看目录总大小
du -sh /home/deploy

# 列出子目录大小并排序(找大文件)
du -h --max-depth=1 /home | sort -hr | head -10

# 输出示例
15G     /home/deploy
10G     /home/deploy/node_modules
3G      /home/deploy/.npm
2G      /home/deploy/projects

1.3 lsblk — 块设备拓扑

bash
lsblk -f

# 输出示例
NAME                      FSTYPE  LABEL  MOUNTPOINT
vda
├─vda1                    ext4           /
└─vda2                    swap           [SWAP]
vdb
└─vdb1                    ext4           /data

1.4 前端部署空间排查

bash
# 场景:部署失败提示 "No space left on device"

# 1. 确认哪个分区满了
df -h

# 2. 定位大目录
du -h --max-depth=1 / | sort -hr | head -10

# 3. 常见空间杀手
du -sh /var/log/           # 日志
du -sh /tmp/               # 临时文件
du -sh /home/*/.npm/       # npm 缓存
du -sh /home/*/node_modules/  # 依赖目录

# 4. 清理
sudo journalctl --vacuum-size=100M   # 清理 systemd 日志
npm cache clean --force              # 清理 npm 缓存
sudo apt autoremove                  # 清理孤立包

2. 磁盘分区

2.1 分区表类型

类型最大分区数单分区上限适用场景
MBR4 主分区2 TB旧系统、小磁盘
GPT128+18 EB现代系统(推荐)

2.2 设备命名规则

前缀含义示例
/dev/sd*SATA/SCSI 物理磁盘/dev/sda, /dev/sdb
/dev/vd*虚拟磁盘(KVM/云)/dev/vda, /dev/vdb
/dev/nvme*NVMe SSD/dev/nvme0n1
/dev/mapper/*LVM 逻辑卷/dev/mapper/vg-lv

2.3 fdisk 分区操作

bash
# 查看所有磁盘分区
sudo fdisk -l

# 对新磁盘创建分区
sudo fdisk /dev/vdb

fdisk 交互命令

命令说明
n新建分区
p主分区
d删除分区
t修改分区类型(8e = LVM)
w写入并退出
q不保存退出
bash
# 完整操作序列(创建 LVM 分区)
sudo fdisk /dev/vdb
# n → p → 1 → 回车 → 回车 → t → 8e → w

# 刷新分区表(无需重启)
sudo partprobe

# 验证
lsblk /dev/vdb

3. 文件系统格式化

3.1 文件系统选型

文件系统特点适用场景
ext4Linux 标准,稳定可靠通用场景(默认选择)
xfs大文件高性能,并行 I/O数据库、视频存储
btrfs快照、压缩、自修复需要快照的存储
overlay2联合文件系统Docker 容器存储

3.2 格式化命令

bash
# 格式化为 ext4(最常用)
sudo mkfs.ext4 /dev/vdb1

# 格式化为 xfs
sudo mkfs.xfs /dev/vdb1

# 查看已有文件系统类型
sudo blkid /dev/vdb1
# 输出: /dev/vdb1: UUID="xxx" TYPE="ext4"

警告:格式化会清除分区上所有数据。操作前务必用 lsblk 确认目标设备。


4. 挂载与卸载

4.1 手动挂载

bash
# 创建挂载点
sudo mkdir -p /data

# 挂载分区
sudo mount /dev/vdb1 /data

# 验证
df -h /data
mount | grep vdb1

# 卸载(确保无进程占用)
sudo umount /data
# 如果提示 "target is busy"
sudo fuser -mv /data    # 查看占用进程
sudo umount -l /data    # 懒卸载(最后手段)

4.2 开机自动挂载(/etc/fstab)

bash
# 查看当前挂载配置
cat /etc/fstab

# 格式: <设备>  <挂载点>  <类型>  <选项>  <dump>  <fsck>
# 推荐使用 UUID(设备名可能变化)
sudo blkid /dev/vdb1
# 输出 UUID="a1b2c3d4-..."

# 编辑 fstab
sudo vim /etc/fstab
# 添加:
UUID=a1b2c3d4-...  /data  ext4  defaults,noatime  0  2

# 测试配置是否正确(不重启)
sudo mount -a
# 无报错即成功

fstab 选项说明

选项含义
defaultsrw,suid,dev,exec,auto,nouser,async
noatime不更新访问时间(提升性能)
nofail设备不存在时不阻止启动
ro只读挂载

警告:fstab 配置错误可能导致系统无法启动。修改后务必执行 sudo mount -a 验证。


5. 磁盘健康检查

bash
# 检查文件系统一致性(需先卸载)
sudo umount /dev/vdb1
sudo fsck /dev/vdb1

# 查看磁盘 I/O 统计
iostat -x 1 5

# 查看磁盘健康状态(需安装 smartmontools)
sudo smartctl -a /dev/sda

# 查看坏块
sudo badblocks -v /dev/vdb

6. 常见问题与排错

问题原因解决方案
No space left on device磁盘/inode 满df -h + df -i 定位
mount: unknown filesystem缺少驱动安装 exfat-utils/ntfs-3g
umount: target is busy有进程占用fuser -mv /path 找到并关闭
fstab 错误导致无法启动配置语法错误进入 recovery mode 修复
新磁盘 fdisk -l 看不到未刷新/未热插拔sudo partprobe 或重启

7. 最佳实践

  1. UUID 挂载:fstab 中使用 UUID 而非设备名,避免设备名漂移
  2. noatime 选项:所有数据分区加 noatime,减少不必要的写操作
  3. 监控告警:磁盘使用率超过 80% 触发告警,90% 触发自动清理
  4. 日志轮转:配置 logrotate 防止日志撑满磁盘
  5. 操作前确认:格式化/分区前执行 lsblk 三次确认目标设备

8. 延伸阅读