服务器磁盘配置与扩容手册
阅读说明:本文档适用于 Linux 服务器的磁盘初始化与扩容。文档仅包含两个核心场景:⚠️ 安全警告:以下操作会直接操作磁盘分区和文件系统,误操作可能导致数据丢失。请在执行前确认目标磁盘不包含重要数据,或已完整备份。
# 前置知识:理解磁盘管理的工作原理
# 磁盘管理的五个层级
Linux 中管理磁盘存储需要经历五个层级,理解这个流程就知道每个命令在做什么:
| 层级 | 名称 | 作用 | 类比 |
|---|---|---|---|
| 1 | 物理磁盘 | 实际的硬盘/SSD/NVMe 设备 | 毛坯仓库 |
| 2 | 物理卷(PV) | 将磁盘标记为 LVM 可用 | 登记为可用库房 |
| 3 | 卷组(VG) | 多个物理卷合并成的存储池 | 多个仓库合并成大仓库 |
| 4 | 逻辑卷(LV) | 从卷组中划分出的虚拟分区 | 仓库划分出的储藏区 |
| 5 | 文件系统 | 决定数据如何存储的结构 | 货架管理系统 |
# 为什么要用 LVM?
传统分区(如 /dev/sda1)大小固定,扩容需要迁移数据。LVM 允许在线扩容、缩减存储,是服务器的标准做法。
# 第一步:确认磁盘情况
在任何操作之前,先了解服务器上有哪些磁盘:
# 查看所有磁盘和分区
lsblk
# 查看已使用的物理卷(用于判断哪些磁盘已初始化)
pvs
2
3
4
5
如何看懂 **lsblk** 输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk ← 系统盘(不要动)
sdb 8:16 0 1.8T 0 disk ← 数据盘(可用)
nvme0n1 259:0 0 1.8T 0 disk ← NVMe 盘(可用)
2
3
4
TYPE = disk:整块磁盘,尚未分区TYPE = part:已有分区MOUNTPOINT:已挂载到目录sda/vda:通常是系统盘,不要操作
# 首次配置:全新磁盘初始化
适用于数据盘从未被使用,需要从头创建存储结构的情况。
# 整体流程
确认磁盘 → 创建物理卷(PV) → 创建卷组(VG) → 创建逻辑卷(LV) → 格式化 → 挂载
# Step 1:确认磁盘设备名
lsblk
需要做的事:确认要操作的磁盘设备名(例如 /dev/sdb、/dev/nvme0n1),不要使用系统盘(通常是 sda 或 vda)。
# Step 2:创建物理卷(PV)
# 将磁盘标记为 LVM 可用的物理卷
# 将 /dev/sdb 替换为你实际的磁盘设备名
pvcreate /dev/sdb
2
3
原理:告诉系统这块磁盘可以被 LVM 管理。这步不会删除数据,只是添加 LVM 元数据标记。
# Step 3:创建卷组(VG)
# 将物理卷加入卷组
# VolGroup01 是卷组名称,可以自定义(但不要与现有卷组重名)
vgcreate VolGroup01 /dev/sdb
2
3
原理:将一个或多个物理卷合并成一个存储池,后续逻辑卷都从这个池中划分。
💡 多盘合并:如果有多个磁盘,可以一次性全部加入:
vgcreate VolGroup01 /dev/sdb /dev/sdc /dev/nvme0n1
# Step 4:创建逻辑卷(LV)
# 从卷组中划分逻辑卷
# -l 100%FREE 表示使用全部剩余空间
# LogVol01 是逻辑卷名称,可以自定义
lvcreate -l 100%FREE VolGroup01 -n LogVol01
2
3
4
原理:从卷组中划分出一块「虚拟分区」,可以自由调整大小。
💡 指定大小:如果不使用全部空间,可以指定具体大小:
# 创建 500GB 的逻辑卷
lvcreate -L 500G VolGroup01 -n LogVol01
2
# Step 5:格式化文件系统
# 格式化为 XFS 文件系统(适用于 CentOS 7/8)
mkfs.xfs /dev/mapper/VolGroup01-LogVol01
2
原理:在逻辑卷上创建文件系统,才能存储文件。XFS 是 CentOS 的默认文件系统,支持大容量存储。
💡 ext4 文件系统:如果需要 ext4 格式(Ubuntu 常用):
mkfs.ext4 /dev/mapper/VolGroup01-LogVol01
# Step 6:创建挂载点并挂载
# 创建挂载目录(/data 是示例路径,可自定义)
mkdir -p /data
# 挂载到目录
mount /dev/mapper/VolGroup01-LogVol01 /data
2
3
4
5
原理:将逻辑卷关联到目录树的某个节点,之后向该目录写入的数据都会存储在这个逻辑卷上。
# Step 7:配置开机自动挂载(重要)
# 将挂载信息写入 /etc/fstab
echo "/dev/mapper/VolGroup01-LogVol01 /data xfs defaults 0 0" >> /etc/fstab
2
原理:/etc/fstab 记录了开机时要挂载的文件系统。写入后,服务器重启会自动挂载,无需手动操作。
⚠️ 建议:执行完这步后,运行
mount -a验证配置是否正确。如果 /etc/fstab 写错,服务器可能无法正常启动。
# 验证 fstab 配置(不会真的挂载,只会检查语法)
mount -a
# 查看挂载结果
df -h
2
3
4
# Step 8:验证配置
# 确认磁盘已挂载
df -h /data
# 确认可读写
touch /data/test && rm /data/test
2
3
4
5
# 在线扩容:扩大已有存储容量
适用于存储空间不足,需要扩大已有逻辑卷的情况。
# 整体流程
检查可用空间 → 扩展逻辑卷 → 扩展文件系统 → 验证
💡 前置条件:扩容有两种情况——① 卷组还有剩余空间(直接扩展);② 卷组没有剩余空间(需要先添加新磁盘)。
# Step 1:检查当前状态
# 查看当前逻辑卷大小
lvs
# 查看卷组剩余空间
vgs
2
3
4
5
如何判断:
- 如果
VFree(可用空间)> 0 → 跳到 Step 3 - 如果
VFree= 0 → 继续 Step 2 添加新磁盘
# Step 2:添加新磁盘到卷组(仅当卷组无剩余空间时执行)
# 将新磁盘创建为物理卷
pvcreate /dev/sdc
# 将新物理卷加入现有卷组
vgextend VolGroup01 /dev/sdc
2
3
4
5
原理:向现有卷组中添加新的物理卷,这样卷组就有了可用空间,可以继续扩展逻辑卷。
💡 多盘扩容:如果有多个新磁盘需要添加:
pvcreate /dev/sdc /dev/sdd
vgextend VolGroup01 /dev/sdc /dev/sdd
2
# Step 3:扩展逻辑卷
# 使用全部剩余空间扩展逻辑卷
lvextend -l +100%FREE /dev/mapper/VolGroup01-LogVol01
2
原理:将卷组中所有可用空间分配给逻辑卷,逻辑卷变大后文件系统才能使用这些空间。
💡 指定扩容大小:如果不使用全部空间,可以指定具体大小:
# 扩展 100GB
lvextend -L +100G /dev/mapper/VolGroup01-LogVol01
2
# Step 4:扩展文件系统
⚠️ 重要:扩展逻辑卷后,文件系统大小不会自动变化,必须执行这步才能真正使用新空间。
确认文件系统类型
# 先确认文件系统类型
lsblk -no FSTYPE /dev/mapper/VolGroup01-LogVol01
2
根据文件系统类型选择对应命令:
# 方式一:XFS 文件系统(CentOS 7/8 常用)
# 注意:XFS 只能扩展不能缩减,且 xfs_growfs 参数是挂载点不是设备名
xfs_growfs /data
# 方式二:ext4 文件系统(Ubuntu 常用)
resize2fs /dev/mapper/VolGroup01-LogVol01
2
3
4
5
6
原理:文件系统当前记录的大小不会自动更新,需要执行扩展命令让它知道可以使用更多空间。
# Step 5:验证扩容结果
# 查看可用空间是否增加
df -h /data
2
# 场景适配:如何根据实际情况调整命令
# 常见磁盘设备名对照
| 环境 | 数据盘设备名示例 | 说明 |
|---|---|---|
| 物理机 SATA/SAS 盘 | /dev/sdb、/dev/sdc | 多块盘按字母顺序编号 |
| 物理机 NVMe 盘 | /dev/nvme0n1、/dev/nvme1n1 | NVMe 盘命名格式不同 |
| 虚拟机 | /dev/vdb、/dev/vdc | 虚拟机通常使用 virtio 驱动 |
| 云服务器 | /dev/vdb、/dev/sdb | 根据云厂商不同而异 |
# 如何找到自己的磁盘设备名
# 查看所有未被使用的磁盘(TYPE=disk 且无 MOUNTPOINT)
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,FSTYPE
# 查看系统盘名称(通常有 boot 分区和根分区)
lsblk | grep -E "(boot|/$)"
2
3
4
5
# 多块盘合并为一个卷
如果有多块盘要合并使用,在创建物理卷时全部指定:
# Step 1:所有盘创建为物理卷
pvcreate /dev/sdb /dev/sdc /dev/sdd
# Step 2:所有盘加入同一个卷组
vgcreate VolGroup01 /dev/sdb /dev/sdc /dev/sdd
2
3
4
5
# 自定义目录名和卷组名
本手册使用 VolGroup01、LogVol01、/data 作为示例,你可以替换为有意义的名称:
| 示例 | 替换为 |
|---|---|
VolGroup01 | vg_data、data_vg |
LogVol01 | lv_data、data_lv |
/data | /mnt/storage、/app |
# 常见问题排查
# Q1:扩容后 df -h 显示容量没有增加
原因:跳过了「扩展文件系统」步骤。
解决:
# 查看逻辑卷大小(确认已扩展)
lvs
# 扩展文件系统
# XFS:
xfs_growfs /data
# ext4:
resize2fs /dev/mapper/VolGroup01-LogVol01
# 再次验证
df -h /data
2
3
4
5
6
7
8
9
10
11
# Q2:mount -a 报错
原因:/etc/fstab 格式错误或 UUID 不存在。
解决:使用 UUID 替代设备名更稳定:
# 获取设备的 UUID
blkid /dev/mapper/VolGroup01-LogVol01
# 输出示例:UUID="a1b2c3d4-1234-5678-90ab-cdef12345678"
# 修改 /etc/fstab,使用 UUID
echo "UUID=a1b2c3d4-1234-5678-90ab-cdef12345678 /data xfs defaults 0 0" >> /etc/fstab
# 再次测试
mount -a
2
3
4
5
6
7
8
9
# Q3:误删了 /etc/fstab 如何恢复
# 查看当前已挂载的文件系统
mount
# 临时恢复挂载
mount -a
# 编辑 fstab 修复
vi /etc/fstab
2
3
4
5
6
7
8
⚠️ 建议:每次修改 fstab 前先备份:
cp /etc/fstab /etc/fstab.bak
# Q4:如何确认哪些磁盘还没被使用
# 查看所有磁盘设备
ls /dev/sd* /dev/nvme*
# 查看已被 LVM 管理的设备
pvs
# 差集对比:哪些磁盘没有出现在 pvs 中
ls /dev/sd* | grep -v $(pvs -o pv_name --noheadings | tr -d ' ')
2
3
4
5
6
7
8
# 快速参考
# 首次配置完整命令
# 将所有数据盘合并为 /data 目录(根据实际情况修改设备名)
pvcreate /dev/sdb /dev/sdc
vgcreate VolGroup01 /dev/sdb /dev/sdc
lvcreate -l 100%FREE VolGroup01 -n LogVol01
mkfs.xfs /dev/mapper/VolGroup01-LogVol01
mkdir -p /data
mount /dev/mapper/VolGroup01-LogVol01 /data
echo "/dev/mapper/VolGroup01-LogVol01 /data xfs defaults 0 0" >> /etc/fstab
mount -a
2
3
4
5
6
7
8
9
# 扩容完整命令(卷组无剩余空间时)
# 添加新磁盘到卷组
pvcreate /dev/sdd
vgextend VolGroup01 /dev/sdd
# 扩展逻辑卷和文件系统
lvextend -l +100%FREE /dev/mapper/VolGroup01-LogVol01
xfs_growfs /data # XFS 用这个
# resize2fs /dev/mapper/VolGroup01-LogVol01 # ext4 用这个
2
3
4
5
6
7
8