07 - 磁盘管理与 LVM
一、磁盘管理基础
1.1 磁盘识别
bash
# 查看所有磁盘
lsblk # 最直观
fdisk -l # 详细信息
ls -l /dev/sd* # 设备文件
# 查看磁盘使用情况
df -h # 文件系统使用情况
df -Th # 显示文件系统类型
df -i # 查看 inode 使用情况
# 查看目录/文件占用空间
du -sh /var/log # 查看目录总大小
du -sh /* | sort -rh # 根目录下各目录大小排序
du -h --max-depth=1 /var # 查看一级子目录大小
1.2 磁盘命名规则
| 设备名 | 说明 |
|---|---|
| /dev/sda | 第一块 SCSI/SATA/USB 磁盘 |
| /dev/sdb | 第二块磁盘 |
| /dev/nvme0n1 | 第一块 NVMe SSD |
| /dev/vda | 虚拟磁盘(KVM) |
| /dev/sda1 | 第一块磁盘的第一个分区 |
二、磁盘分区
2.1 分区表类型
| 类型 | 最大磁盘 | 最大分区数 | 说明 |
|---|---|---|---|
| MBR (msdos) | 2TB | 4 主分区(或 3 主 + 1 扩展) | 传统方案 |
| GPT | 18EB | 128 分区 | 现代推荐 |
2.2 fdisk 分区(MBR,< 2TB)
bash
# 对 /dev/sdb 进行分区
fdisk /dev/sdb
# 交互操作:
# n - 新建分区
# p - 主分区 / e - 扩展分区
# 分区号、起始扇区、大小
# t - 修改分区类型(如 8e 为 LVM)
# p - 打印分区表
# w - 保存并退出
# q - 不保存退出
2.3 parted 分区(GPT,> 2TB 推荐)
bash
# 交互模式
parted /dev/sdb
# 设置分区表类型为 GPT
(parted) mklabel gpt
# 创建分区
(parted) mkpart primary 0% 100% # 使用全部空间
(parted) mkpart primary ext4 0GB 500GB # 指定大小
# 打印分区表
(parted) print
# 退出
(parted) quit
# 命令行一键操作
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary 0% 100%
2.4 分区对齐检查
bash
# 查看分区对齐情况
parted /dev/sdb align-check optimal 1
三、文件系统
3.1 创建文件系统(格式化)
bash
# 格式化为 ext4
mkfs.ext4 /dev/sdb1
# 格式化为 xfs
mkfs.xfs /dev/sdb1
# 格式化时指定参数
mkfs.ext4 -b 4096 -L data_disk /dev/sdb1
# -b 块大小 -L 卷标
# 格式化为 swap
mkswap /dev/sdb2
3.2 挂载与卸载
bash
# 临时挂载
mount /dev/sdb1 /data
# 指定文件系统类型挂载
mount -t ext4 /dev/sdb1 /data
# 查看挂载情况
mount | grep sdb1
df -h /data
# 卸载
umount /data
umount /dev/sdb1
# 强制卸载(设备忙时)
umount -l /data # 懒卸载,等不忙时自动卸载
fuser -km /data # 杀掉占用目录的进程后再卸载
3.3 开机自动挂载 - /etc/fstab
bash
# 编辑 /etc/fstab
# 格式:设备 挂载点 文件系统类型 挂载选项 dump fsck顺序
/dev/sdb1 /data ext4 defaults 0 0
# 推荐:使用 UUID 代替设备名
# 获取 UUID
blkid /dev/sdb1
# UUID="a1b2c3d4-..." /data ext4 defaults 0 0
# 测试 fstab 配置是否正确(重要!重启前必须验证)
mount -a
fstab 挂载选项
| 选项 | 说明 |
|---|---|
| defaults | rw, suid, dev, exec, auto, nouser, async |
| noexec | 不允许执行二进制文件 |
| nosuid | 不允许 setuid/setgid |
| noatime | 不更新访问时间(提升性能) |
| nodiratime | 不更新目录访问时间 |
| data=writeback | ext4 写回模式(性能优先,数据安全降低) |
3.4 swap 交换分区管理
bash
# 查看 swap 使用情况
free -h
swapon -s
# 创建 swap 分区
mkswap /dev/sdb2
swapon /dev/sdb2
# 创建 swap 文件(不需要额外分区)
dd if=/dev/zero of=/swapfile bs=1M count=2048 # 创建 2GB 文件
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永久生效
echo "/swapfile swap swap defaults 0 0" >> /etc/fstab
# 调整 swappiness(0-100,值越低越倾向于使用物理内存)
sysctl vm.swappiness=10 # 临时
echo "vm.swappiness=10" >> /etc/sysctl.conf # 永久
# 关闭 swap
swapoff /swapfile
四、LVM 逻辑卷管理
LVM(Logical Volume Manager)是 Linux 的高级磁盘管理方案,支持动态扩容、快照等功能。
4.1 LVM 架构
物理磁盘 (PV)
└── 卷组 (VG)
└── 逻辑卷 (LV)
└── 文件系统
PV (Physical Volume) 物理卷,磁盘或分区
VG (Volume Group) 卷组,PV 的集合
LV (Logical Volume) 逻辑卷,从 VG 中分配空间
PE (Physical Extent) 最小分配单元(默认 4MB)
4.2 创建 LVM
bash
# 1. 将分区/磁盘创建为 PV(物理卷)
pvcreate /dev/sdb1 /dev/sdc1
# 查看 PV
pvdisplay
pvs
# 2. 创建 VG(卷组)
vgcreate vg_data /dev/sdb1 /dev/sdc1
# 指定 PE 大小
vgcreate -s 16M vg_data /dev/sdb1
# 查看 VG
vgdisplay
vgs
# 3. 创建 LV(逻辑卷)
# 创建 50GB 的逻辑卷
lvcreate -L 50G -n lv_data vg_data
# 使用全部剩余空间
lvcreate -l 100%FREE -n lv_data vg_data
# 创建占 VG 50% 的逻辑卷
lvcreate -l 50%VG -n lv_data vg_data
# 查看 LV
lvdisplay
lvs
# 4. 格式化逻辑卷
mkfs.xfs /dev/vg_data/lv_data
# 5. 挂载
mkdir /data
mount /dev/vg_data/lv_data /data
# 6. 开机自动挂载
echo "/dev/vg_data/lv_data /data xfs defaults 0 0" >> /etc/fstab
4.3 LVM 扩容
场景一:VG 有剩余空间,直接扩容 LV
bash
# 扩容 LV(+20G)
lvextend -L +20G /dev/vg_data/lv_data
# 扩容到指定大小
lvextend -L 100G /dev/vg_data/lv_data
# 使用全部剩余空间
lvextend -l +100%FREE /dev/vg_data/lv_data
# 扩展文件系统(必须!否则操作系统看不到新空间)
# xfs 文件系统
xfs_growfs /data
# ext4 文件系统
resize2fs /dev/vg_data/lv_data
场景二:VG 没有剩余空间,先扩容 VG
bash
# 1. 新增磁盘,创建 PV
pvcreate /dev/sdd
# 2. 将 PV 加入 VG
vgextend vg_data /dev/sdd
# 3. 扩容 LV
lvextend -L +50G /dev/vg_data/lv_data
# 4. 扩展文件系统
xfs_growfs /data # xfs
resize2fs /dev/vg_data/lv_data # ext4
4.4 LVM 缩容
注意:xfs 文件系统不支持缩容,只有 ext4 支持。
bash
# 1. 卸载文件系统
umount /data
# 2. 检查文件系统
e2fsck -f /dev/vg_data/lv_data
# 3. 缩小文件系统
resize2fs /dev/vg_data/lv_data 30G
# 4. 缩小 LV
lvreduce -L 30G /dev/vg_data/lv_data
# 5. 重新挂载
mount /dev/vg_data/lv_data /data
4.5 LVM 快照
LVM 快照可以创建文件系统的一致性副本,常用于备份。
bash
# 创建快照(大小一般为源 LV 的 10%~20%)
lvcreate -L 5G -s -n lv_data_snap /dev/vg_data/lv_data
# 挂载快照
mkdir /mnt/snap
mount /dev/vg_data/lv_data_snap /mnt/snap
# 从快照中备份数据
tar -czf /backup/data_snapshot.tar.gz -C /mnt/snap .
# 备份完成后删除快照
umount /mnt/snap
lvremove -f /dev/vg_data/lv_data_snap
五、实战场景
场景一:新增加磁盘并挂载
bash
#!/bin/bash
# mount_new_disk.sh - 挂载新磁盘
DISK="/dev/sdb"
MOUNT_POINT="/data"
# 1. 确认磁盘存在
lsblk $DISK
# 2. 分区
parted $DISK mklabel gpt
parted $DISK mkpart primary xfs 0% 100%
# 3. 格式化
mkfs.xfs ${DISK}1
# 4. 创建挂载点
mkdir -p $MOUNT_POINT
# 5. 获取 UUID
UUID=$(blkid -s UUID -o value ${DISK}1)
# 6. 写入 fstab
echo "UUID=$UUID $MOUNT_POINT xfs defaults,noatime 0 0" >> /etc/fstab
# 7. 挂载并验证
mount -a
df -h $MOUNT_POINT
echo "磁盘 $DISK 已挂载到 $MOUNT_POINT"
场景二:根分区满了,通过 LVM 扩容
bash
# 1. 查看当前情况
df -h /
lsblk
lvs
# 2. 云服务器通常可以直接添加磁盘或扩容现有磁盘
# 假设新增了 /dev/sdb
# 3. 创建 PV 并加入根分区所在的 VG
pvcreate /dev/sdb
vgextend centos /dev/sdb # 假设 VG 名为 centos
# 4. 扩容根 LV
lvextend -l +100%FREE /dev/centos/root
# 5. 扩展文件系统
xfs_growfs / # CentOS 默认 xfs
# 6. 验证
df -h /
场景三:排查磁盘空间满
bash
# 1. 查看哪个分区满了
df -h
# 2. 查看大文件
find / -type f -size +1G 2>/dev/null
du -ah / | sort -rh | head -20
# 3. 常见空间杀手:日志文件
du -sh /var/log/*
journalctl --disk-usage
# 4. 清理 journal 日志
journalctl --vacuum-time=7d
journalctl --vacuum-size=500M
# 5. 查找已删除但未释放空间的文件
lsof | grep deleted
# 需要 kill 占用该文件的进程才能释放空间
六、小结
本篇介绍了磁盘分区(fdisk/parted)、文件系统创建与挂载、swap 管理以及 LVM 逻辑卷管理。LVM 是生产环境磁盘管理的推荐方案,其动态扩容能力可以避免停机加盘的麻烦。
上一篇 :06 - 网络配置与管理
下一篇 :08 - Shell 脚本编程入门