文章目录
-
- 前言
- 一、KVM宿主机端:热添加虚拟磁盘(零停机)
-
- [1.1 命令行方式(生产环境首选)](#1.1 命令行方式(生产环境首选))
- [1.2 图形界面方式(virt-manager,新手友好)](#1.2 图形界面方式(virt-manager,新手友好))
- 二、Ubuntu虚拟机内:LVM在线扩展根分区
-
- [2.1 环境验证(最关键的一步!)](#2.1 环境验证(最关键的一步!))
- [2.2 直接创建物理卷(PV)](#2.2 直接创建物理卷(PV))
- [2.3 扩展卷组(VG)](#2.3 扩展卷组(VG))
- [2.4 扩展逻辑卷(LV)](#2.4 扩展逻辑卷(LV))
- [2.5 调整文件系统大小](#2.5 调整文件系统大小)
- [2.6 验证扩容结果](#2.6 验证扩容结果)
- 三、关键注意事项与避坑指南
- 四、生产环境进阶技巧
-
- [4.1 一键扩容命令](#4.1 一键扩容命令)
- [4.2 LVM元数据备份](#4.2 LVM元数据备份)
- [4.3 空间监控](#4.3 空间监控)
- 五、常见问题解答
- 总结
前言
在服务器运维中,最常见的突发问题之一就是根目录磁盘空间不足。传统物理机时代,扩容往往意味着停机、拆机箱、加硬盘、重新分区、迁移数据,整个过程耗时耗力还伴随着数据丢失风险。
但在虚拟化时代,KVM热添加磁盘 + LVM逻辑卷管理 的黄金组合彻底解决了这个痛点。本文将基于一次真实的生产环境扩容实践,带你一步步实现零停机、无数据丢失的Ubuntu根分区在线扩容,全程无需重启虚拟机或宿主机。
一、KVM宿主机端:热添加虚拟磁盘(零停机)
KVM支持对运行中的虚拟机进行磁盘热添加,这是实现零停机扩容的基础。我们提供两种操作方式,生产环境推荐使用命令行。
1.1 命令行方式(生产环境首选)
bash
# 1. 创建qcow2格式的虚拟磁盘文件(推荐,支持快照和稀疏文件)
# 这里创建500G磁盘,根据实际需求调整大小
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/gpu-vm-disk3.qcow2 500G
# 2. 热添加磁盘到运行中的虚拟机
# 替换gpu为你的虚拟机名称,vdc为虚拟机内的设备名
sudo virsh attach-disk gpu \
--source /var/lib/libvirt/images/gpu-vm-disk3.qcow2 \
--target vdc \
--driver qemu \
--subdriver qcow2 \
--targetbus virtio \
--persistent
关键参数说明:
--targetbus virtio:使用virtio总线,性能远高于IDE或SCSI--persistent:必须添加,将磁盘永久写入虚拟机配置,重启后不会消失
1.2 图形界面方式(virt-manager,新手友好)
- 打开virt-manager,右键点击目标虚拟机 → 选择"打开"
- 点击顶部"查看 → 详情"(或工具栏灯泡图标)
- 点击左下角"添加硬件" → 左侧选择"存储"
- 配置:创建磁盘映像 → 输入大小 → 磁盘类型选择"virtio磁盘"
- 点击"完成",磁盘立即添加成功
二、Ubuntu虚拟机内:LVM在线扩展根分区
LVM(逻辑卷管理)允许我们将多块物理磁盘组合成一个逻辑卷,并在线调整其大小。本次我们采用直接使用整块裸磁盘作为物理卷的极简方式,无需创建分区,操作更简单且能100%利用磁盘空间。
2.1 环境验证(最关键的一步!)
绝对不能跳过这一步,否则可能误操作导致数据永久丢失。
bash
# 1. 查看所有磁盘设备,确认新磁盘已被识别
lsblk
# 2. 确认新磁盘(这里是vdc)没有任何挂载点
mount | grep /dev/vdc
# 3. 确认新磁盘没有任何分区
lsblk /dev/vdc
# 4. 确认新磁盘没有任何文件系统或LVM签名
sudo blkid /dev/vdc
✅ 安全状态 :以上后三个命令都应该没有任何输出,说明vdc是完全干净的空盘。
❌ 危险状态 :如果有任何输出,说明磁盘已有数据,绝对不能继续操作!
2.2 直接创建物理卷(PV)
LVM原生支持直接将整块磁盘作为物理卷使用,无需创建分区表:
bash
# 将整块/dev/vdc初始化为LVM物理卷
sudo pvcreate /dev/vdc
# 验证物理卷创建成功
sudo pvs
成功输出示例:
PV VG Fmt Attr PSize PFree
/dev/vda3 ubuntu-vg lvm2 a-- <498.00g 0
/dev/vdc lvm2 --- <500.00g <500.00g
2.3 扩展卷组(VG)
将新创建的物理卷添加到现有的卷组中:
bash
# Ubuntu默认卷组名称为ubuntu-vg,可通过sudo vgs确认
sudo vgextend ubuntu-vg /dev/vdc
# 验证卷组空间已增加
sudo vgs
成功输出示例:
VG #PV #LV #SN Attr VSize VFree
ubuntu-vg 2 1 0 wz--n- 997.99g <500.00g
可以看到卷组总容量已从约500G增加到约1TB,空闲空间500G。
2.4 扩展逻辑卷(LV)
将卷组中所有空闲空间全部扩展给根逻辑卷:
bash
# Ubuntu默认根逻辑卷路径为/dev/ubuntu-vg/ubuntu-lv
sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
其他常用扩展方式:
- 扩展指定大小:
sudo lvextend -L +200G /dev/ubuntu-vg/ubuntu-lv - 扩展到指定大小:
sudo lvextend -L 800G /dev/ubuntu-vg/ubuntu-lv
2.5 调整文件系统大小
这是最后一步,也是最容易被忽略的一步。逻辑卷扩展后,文件系统还不知道空间变大了,需要单独调整:
bash
# 对于ext4文件系统(Ubuntu默认)
sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
# 对于xfs文件系统(部分云服务器使用)
# sudo xfs_growfs /
这个过程可能需要1-3分钟(取决于磁盘速度和现有数据量),耐心等待完成即可。
2.6 验证扩容结果
bash
# 查看根分区最终大小
df -h /
成功输出示例:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv 982G 120G 812G 13% /
根分区已从原来的约500G成功扩展到约1TB,扩容完成!
三、关键注意事项与避坑指南
- 绝对不要操作已挂载的磁盘 :本次实践中
/dev/vdb已挂载到/docker目录,任何对vdb的操作都会导致Docker数据永久丢失 - 数据备份:虽然LVM扩展是安全操作,但重要数据建议提前备份
- 文件系统区别 :ext4使用
resize2fs,xfs使用xfs_growfs,不要搞混 - 热添加限制:部分旧版本KVM不支持热添加,需要先关闭虚拟机再添加磁盘
- 不能缩小:ext4和xfs文件系统都只支持在线扩大,不支持在线缩小
四、生产环境进阶技巧
4.1 一键扩容命令
以后再需要扩容时,只需在虚拟机内执行这一条命令即可完成所有操作:
bash
sudo pvcreate /dev/vdd && sudo vgextend ubuntu-vg /dev/vdd && sudo lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv && sudo resize2fs /dev/ubuntu-vg/ubuntu-lv
4.2 LVM元数据备份
在进行任何LVM操作前,一定要备份元数据:
bash
# 备份元数据
sudo vgcfgbackup -f /root/ubuntu-vg-backup-$(date +%Y%m%d).bak ubuntu-vg
# 如需恢复
sudo vgcfgrestore -f /root/ubuntu-vg-backup-xxxxxx.bak ubuntu-vg
4.3 空间监控
将以下命令加入监控系统,当卷组空闲空间低于20%时自动报警:
bash
# 查看卷组空闲百分比
sudo vgs --noheadings -o vg_name,vg_free_percent ubuntu-vg
五、常见问题解答
Q1:直接使用整块磁盘做PV,重启后会有问题吗?
完全不会。LVM的所有配置信息都直接存储在磁盘本身,系统开机时会自动扫描所有磁盘并识别LVM签名,自动组装卷组和逻辑卷。这是LVM官方标准支持的用法,生产环境中广泛使用。
Q2:直接用整块磁盘和先分区再做PV有什么区别?
| 方式 | 优点 | 缺点 |
|---|---|---|
| 整块磁盘直接做PV | 操作简单,100%利用磁盘空间 | 无分区表,部分老旧工具可能识别异常 |
| 先分区再做PV | 符合传统习惯,兼容性更好 | 多一步操作,有微小的分区表开销 |
在KVM虚拟机环境下,直接使用整块磁盘做PV是完全推荐的方式。
Q3:扩容过程中会影响业务运行吗?
完全不会。整个过程都是在线操作,不需要重启虚拟机,也不会中断任何正在运行的服务。
总结
KVM热添加磁盘 + LVM逻辑卷管理的组合,彻底解决了服务器磁盘扩容的痛点。整个扩容过程从添加磁盘到完成验证,只需要不到2分钟时间,且全程零停机、无数据丢失风险。
正如这次实践中感受到的:有逻辑卷是真方便,KVM又可以不停机添加虚拟盘。这就是虚拟化和现代存储管理技术带给运维人员的最大便利。