磁盘管理与 LVM
大约 12 分钟约 3470 字
磁盘管理与 LVM
简介
磁盘管理是 Linux 系统运维的核心技能之一,涵盖磁盘分区、逻辑卷管理(LVM)、文件系统创建、挂载配置以及磁盘监控等内容。掌握这些技能可以帮助管理员高效利用存储资源、灵活扩展磁盘空间,并在磁盘故障时快速响应,保障系统稳定运行。
特点
磁盘信息查看
df 和 du 命令
# 查看所有文件系统磁盘使用情况(人类可读格式)
df -h
# 查看指定文件系统类型
df -hT
# 查看inode使用情况
df -i
# 查看指定目录的磁盘占用
du -sh /var/log
# 查看目录下各子目录的磁盘占用并排序
du -h --max-depth=1 /var | sort -rh | head -10
# 查看当前目录下所有文件和目录的大小
du -ah /home/user | sort -rh | head -20磁盘设备信息查看
# 列出所有块设备信息
lsblk
# 查看磁盘分区表
fdisk -l
# 查看UUID和文件系统类型
blkid
# 查看磁盘硬件信息
lshw -class disk
# 使用parted查看磁盘信息(支持GPT)
parted -l磁盘分区
fdisk 分区(MBR 格式,小于 2TB)
# 对/dev/sdb进行分区操作
fdisk /dev/sdb
# 交互命令:
# m - 帮助菜单
# n - 新建分区
# p - 打印分区表
# d - 删除分区
# w - 写入分区表并退出
# q - 不保存退出
# 创建主分区的完整流程
fdisk /dev/sdb << EOF
n
p
1
+50G
w
EOF
# 刷新分区表
partprobe /dev/sdbparted 分区(GPT 格式,大于 2TB)
# 将磁盘标记为GPT格式
parted /dev/sdb mklabel gpt
# 创建分区
parted /dev/sdb mkpart primary ext4 0% 50GB
parted /dev/sdb mkpart primary xfs 50GB 100%
# 查看分区表
parted /dev/sdb print
# 删除分区
parted /dev/sdb rm 1
# 调整分区大小
parted /dev/sdb resizepart 1 80GBLVM 逻辑卷管理
PV(物理卷)管理
# 创建物理卷
pvcreate /dev/sdb1 /dev/sdb2
# 查看物理卷信息
pvdisplay
# 查看物理卷简要信息
pvs
# 删除物理卷
pvremove /dev/sdb1
# 移动物理卷上的数据到其他PV
pvmove /dev/sdb1 /dev/sdb2VG(卷组)管理
# 创建卷组
vgcreate vg_data /dev/sdb1 /dev/sdb2
# 查看卷组信息
vgdisplay
# 查看卷组简要信息
vgs
# 扩展卷组(添加新的物理卷)
vgextend vg_data /dev/sdc1
# 从卷组中移除物理卷
vgreduce vg_data /dev/sdb1
# 重命名卷组
vgrename vg_data vg_app
# 删除卷组
vgremove vg_dataLV(逻辑卷)管理
# 创建逻辑卷(指定大小)
lvcreate -L 50G -n lv_data vg_data
# 创建逻辑卷(使用全部剩余空间)
lvcreate -l 100%FREE -n lv_data vg_data
# 查看逻辑卷信息
lvdisplay
lvs
# 扩展逻辑卷(需要先扩展LV,再扩展文件系统)
# ext4文件系统扩容
lvextend -L +20G /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data
# xfs文件系统扩容(xfs只支持扩容不支持缩容)
lvextend -L +20G /dev/vg_data/lv_data
xfs_growfs /dev/vg_data/lv_data
# 缩容逻辑卷(仅ext4支持,需先卸载)
umount /dev/vg_data/lv_data
e2fsck -f /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data 30G
lvreduce -L 30G /dev/vg_data/lv_data
# 删除逻辑卷
lvremove /dev/vg_data/lv_data文件系统与挂载
创建文件系统
# 创建ext4文件系统
mkfs.ext4 /dev/vg_data/lv_data
# 创建xfs文件系统
mkfs.xfs /dev/vg_data/lv_data
# 挂载逻辑卷到指定目录
mkdir -p /data
mount /dev/vg_data/lv_data /data
# 卸载文件系统
umount /data
# 查看挂载信息
mount | grep /data
findmnt /data配置 fstab 自动挂载
# 查看UUID
blkid /dev/vg_data/lv_data
# 编辑/etc/fstab文件,添加自动挂载配置
# 格式:设备/UUID 挂载点 文件系统类型 挂载选项 dump fsck顺序
cat >> /etc/fstab << 'EOF'
UUID="1234-5678-abcd" /data ext4 defaults 0 0
EOF
# 测试fstab配置是否正确(不实际挂载,仅检查语法)
mount -a -o noauto
# 重新挂载所有fstab中的文件系统
mount -a磁盘监控
常用监控命令
# 实时监控磁盘I/O
iostat -x 2 5
# 查看磁盘I/O(使用iotop需要安装)
iotop -oP
# 监控磁盘SMART信息(需要安装smartmontools)
smartctl -a /dev/sda
# 设置磁盘使用率告警脚本
cat > /usr/local/bin/disk_monitor.sh << 'SCRIPT'
#!/bin/bash
THRESHOLD=80
ADMIN_EMAIL="admin@example.com"
df -h | awk -v thresh="$THRESHOLD" '
NR>1 {
usage=$5; gsub(/%/,"",usage);
if (usage+0 > thresh+0) {
print "磁盘告警: " $6 " 使用率已达 " usage "%"
}
}
' | while read line; do
echo "$line" | mail -s "磁盘空间告警" "$ADMIN_EMAIL"
done
SCRIPT
chmod +x /usr/local/bin/disk_monitor.sh
# 结合crontab每30分钟检查一次
echo "*/30 * * * * /usr/local/bin/disk_monitor.sh" | crontab -LVM 快照管理
创建与使用快照
# 创建快照(快照大小取决于数据变化量)
lvcreate -L 10G -s -n lv_data_snapshot /dev/vg_data/lv_data
# 查看快照
lvs
lvdisplay /dev/vg_data/lv_data_snapshot
# 挂载快照进行备份
mkdir -p /mnt/snapshot
mount /dev/vg_data/lv_data_snapshot /mnt/snapshot
# 从快照恢复数据
umount /mnt/snapshot
umount /data
lvconvert --merge /dev/vg_data/lv_data_snapshot
mount /dev/vg_data/lv_data /data
# 删除快照
lvremove /dev/vg_data/lv_data_snapshot快照备份脚本
#!/bin/bash
# lvm_snapshot_backup.sh — LVM 快照备份脚本
VG="vg_data"
LV="lv_data"
SNAPSHOT_SIZE="10G"
BACKUP_DIR="/backup"
MOUNT_POINT="/mnt/snapshot"
DATE=$(date +%Y%m%d_%H%M%S)
SNAPSHOT_NAME="${LV}_snap_${DATE}"
# 创建快照
echo "创建快照: ${SNAPSHOT_NAME}"
lvcreate -L ${SNAPSHOT_SIZE} -s -n ${SNAPSHOT_NAME} /dev/${VG}/${LV}
# 挂载快照
mkdir -p ${MOUNT_POINT}
mount /dev/${VG}/${SNAPSHOT_NAME} ${MOUNT_POINT}
# 使用 tar 备份
echo "开始备份..."
tar czf ${BACKUP_DIR}/data_backup_${DATE}.tar.gz -C ${MOUNT_POINT} .
# 卸载并删除快照
umount ${MOUNT_POINT}
lvremove -f /dev/${VG}/${SNAPSHOT_NAME}
echo "备份完成: ${BACKUP_DIR}/data_backup_${DATE}.tar.gz"
# 清理超过 7 天的备份
find ${BACKUP_DIR} -name "data_backup_*.tar.gz" -mtime +7 -delete磁盘性能调优
文件系统选择
| 文件系统 | 最大分区 | 最大单文件 | 日志 | 适用场景 |
|---|---|---|---|---|
| ext4 | 1EB | 16TB | 有 | 通用场景,CentOS 7 默认 |
| xfs | 8EB | 8EB | 有 | 大文件、高并发 I/O,CentOS 8 默认 |
| btrfs | 16EB | 16EB | 有 | 快照、压缩、校验,适合存储服务器 |
| ext3 | 32TB | 2TB | 有 | 兼容老旧系统 |
格式化参数优化
# ext4 优化(适合通用场景)
mkfs.ext4 -O ^has_journal,large_file,huge_file,dir_nlink,extra_isize \
-b 4096 -E stride=128,stripe-width=256 \
/dev/vg_data/lv_data
# xfs 优化(适合大文件和高并发 I/O)
mkfs.xfs -f -b size=4096 -d su=128k,sw=1 -i size=512 -n size=8192 \
/dev/vg_data/lv_data
# RAID 阵列上的 xfs 参数
# su = RAID stripe unit, sw = RAID stripe width
# su=128k, sw=4 表示 4 块盘 RAID0,每块盘 stripe 128K
# btrfs 格式化(启用压缩)
mkfs.btrfs -f -O compress=lzo /dev/vg_data/lv_data挂载参数优化
# /etc/fstab 高级挂载选项
# ext4 — 性能优化
UUID=xxx /data ext4 noatime,nodiratime,data=writeback,barrier=0 0 0
# noatime — 不更新访问时间(减少 I/O)
# nodiratime — 不更新目录访问时间
# data=writeback — 写入不保证数据一致性(性能最高,有风险)
# data=ordered — 默认值,保证数据一致性
# barrier=0 — 关闭 barrier(有 UPS 才建议)
# xfs — 高性能挂载
UUID=xxx /data xfs noatime,nodiratime,allocsize=64m,logbufs=8 0 0
# allocsize=64m — 延迟分配策略,适合大文件写入
# logbufs=8 — 增大日志缓冲区数量
# btrfs — 压缩挂载
UUID=xxx /data btrfs noatime,compress=lzo,space_cache=v2 0 0
# compress=lzo — LZO 压缩(速度快,压缩率一般)
# compress=zstd — ZSTD 压缩(速度适中,压缩率高)
# 临时文件系统(tmpfs)
tmpfs /tmp tmpfs defaults,size=2G,nr_inodes=100k 0 0
# size=2G — 最大使用 2GB 内存
# nr_inodes=100k — 最多 100K 个 inodeI/O 调度器
# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
# 可选调度器:
# noop — 无调度,适合 SSD/虚拟化
# deadline — 截止时间调度,适合数据库
# cfq — 完全公平队列,适合桌面/通用
# 临时修改
echo deadline > /sys/block/sda/queue/scheduler
# 永久修改(通过 systemd-tmpfiles 或 udev 规则)
cat > /etc/udev/rules.d/60-ioscheduler.rules << 'EOF'
# SSD 使用 noop
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
# HDD 使用 deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
EOF
# 查看磁盘是否是 SSD
cat /sys/block/sda/queue/rotational
# 0 = SSD, 1 = HDD磁盘故障排查
常见磁盘问题
# 磁盘只读
# 原因:文件系统错误或磁盘硬件故障
mount -o remount,rw /data
# 如果失败,检查文件系统
umount /data
fsck -y /dev/vg_data/lv_data
mount /dev/vg_data/lv_data /data
# 文件系统损坏
umount /data
xfs_repair /dev/vg_data/lv_data # XFS 文件系统
e2fsck -y /dev/vg_data/lv_data # ext4 文件系统
# 磁盘空间满了但 du 显示未满
# 原因:已删除文件仍被进程占用
lsof | grep deleted
# 找到占用文件的进程并重启
kill -9 <PID>
# LVM 元数据损坏
vgck vg_data # 检查卷组元数据
pvck /dev/sdb1 # 检查物理卷元数据
lvck /dev/vg_data/lv_data # 检查逻辑卷元数据
# 备份和恢复 LVM 元数据
vgcfgbackup vg_data
vgcfgrestore --test vg_data
vgcfgrestore vg_data磁盘 I/O 性能分析
# iostat 详解
iostat -x 2 5
# 关键指标:
# %util — 磁盘利用率(持续超过 80% 说明 I/O 瓶颈)
# await — 平均 I/O 等待时间(ms,>20ms 需关注)
# r_await/w_await — 读/写等待时间
# avgqu-sz — 平均队列长度(>2 说明排队严重)
# 查看哪些进程占用磁盘 I/O
iotop -oP
# 或使用 pidstat
pidstat -d 1 5
# 查看系统 I/O 统计
vmstat 1 5
# bi/bo — 块输入/块输出(单位 KB/s)
# wa — I/O 等待占比(持续 > 5% 需关注)
# 查看 inode 使用情况(空间够但 inode 满也写不进去)
df -i
# inode 满的常见原因:大量小文件
find /var/spool/clientmqueue -type f | wc -l
find /tmp -type f | wc -l磁盘扩容实战
# 场景:在线扩容 LVM 逻辑卷(不停机)
# 1. 确认新增磁盘已被识别
lsblk
# 新增磁盘 /dev/sdc
# 2. 创建分区
fdisk /dev/sdc << EOF
n
p
1
w
EOF
partprobe /dev/sdc
# 3. 创建物理卷并加入卷组
pvcreate /dev/sdc1
vgextend vg_data /dev/sdc1
# 4. 扩展逻辑卷(使用所有可用空间)
lvextend -l +100%FREE /dev/vg_data/lv_data
# 5. 扩展文件系统
# ext4
resize2fs /dev/vg_data/lv_data
# xfs
xfs_growfs /data
# 6. 验证
df -h /data
lvs
# 场景:缩小逻辑卷(需先卸载,仅 ext4)
umount /data
e2fsck -f /dev/vg_data/lv_data # 强制检查
resize2fs /dev/vg_data/lv_data 30G # 先缩小文件系统
lvreduce -L 30G /dev/vg_data/lv_data # 再缩小逻辑卷
mount /dev/vg_data/lv_data /dataRAID 磁盘阵列
软件 RAID 管理
# 创建 RAID1(镜像)
mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
# 创建 RAID5(至少 3 块盘)
mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
# 创建 RAID10(4 块盘,镜像+条带)
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1
# 查看 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0
# RAID 状态监控
mdadm --monitor --mail=admin@example.com --delay=300 /dev/md0
# 磁盘故障替换
mdadm --manage /dev/md0 --fail /dev/sdb1 # 标记磁盘故障
mdadm --manage /dev/md0 --remove /dev/sdb1 # 移除故障盘
mdadm --manage /dev/md0 --add /dev/sdf1 # 添加新盘(自动重建)
# 保存 RAID 配置
mdadm --detail --scan >> /etc/mdadm.conf
# RAID 级别对比
# RAID0 — 条带化,无冗余,性能最高
# RAID1 — 镜像,50% 利用率,读写性能好
# RAID5 — 分布式奇偶校验,1块盘冗余,利用率 (n-1)/n
# RAID6 — 双奇偶校验,2块盘冗余,利用率 (n-2)/n
# RAID10 — RAID1+RAID0,性能和冗余兼顾,利用率 50%优点
缺点
总结
磁盘管理与 LVM 是 Linux 运维工程师的必备技能。通过合理使用 fdisk/parted 进行分区、利用 LVM 实现灵活的存储管理、配置 fstab 保证挂载持久化,以及建立完善的磁盘监控机制,可以有效提升系统的可用性和可维护性。建议在生产环境中使用 LVM 管理关键业务存储,并定期检查磁盘使用情况,提前规划扩容。
关键知识点
- 部署类主题的核心不是“装成功”,而是“稳定运行、可排障、可回滚”。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
适用场景
- 当你准备把《磁盘管理与 LVM》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
落地建议
- 固定版本号与镜像标签,避免“latest”带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
复盘问题
- 如果把《磁盘管理与 LVM》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《磁盘管理与 LVM》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《磁盘管理与 LVM》最大的收益和代价分别是什么?
