KVM+LVM 零停机在线扩容 Ubuntu 根分区:从磁盘添加到逻辑卷扩展完整

文章目录

前言

在服务器运维中,最常见的突发问题之一就是根目录磁盘空间不足。传统物理机时代,扩容往往意味着停机、拆机箱、加硬盘、重新分区、迁移数据,整个过程耗时耗力还伴随着数据丢失风险。

但在虚拟化时代,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,新手友好)

  1. 打开virt-manager,右键点击目标虚拟机 → 选择"打开"
  2. 点击顶部"查看 → 详情"(或工具栏灯泡图标)
  3. 点击左下角"添加硬件" → 左侧选择"存储"
  4. 配置:创建磁盘映像 → 输入大小 → 磁盘类型选择"virtio磁盘"
  5. 点击"完成",磁盘立即添加成功

二、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,扩容完成!

三、关键注意事项与避坑指南

  1. 绝对不要操作已挂载的磁盘 :本次实践中/dev/vdb已挂载到/docker目录,任何对vdb的操作都会导致Docker数据永久丢失
  2. 数据备份:虽然LVM扩展是安全操作,但重要数据建议提前备份
  3. 文件系统区别 :ext4使用resize2fs,xfs使用xfs_growfs,不要搞混
  4. 热添加限制:部分旧版本KVM不支持热添加,需要先关闭虚拟机再添加磁盘
  5. 不能缩小: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又可以不停机添加虚拟盘。这就是虚拟化和现代存储管理技术带给运维人员的最大便利。

相关推荐
乐维_lwops2 小时前
案例解读|运维监控助力某大型卷烟厂构建高效运维监控体系
运维·运维案例
JiaWen技术圈2 小时前
网站用户注册行为验证码方案
运维·安全
仙柒4152 小时前
Docker存储原理
运维·docker·容器
DolphinDB2 小时前
漫长人工,耗费存储?用 BackupRestore 模块一站式解决跨环境数据同步难题
运维·后端·架构
闫记康2 小时前
Linux学习day5
linux·chrome·学习
TechPioneer_lp3 小时前
30 岁硕士 Linux C 开发背景,未来想去澳洲就业,研究方向该选 AI、SDN 漏洞还是 Linux 内核?
linux·人工智能·职业规划·澳洲求职
_kerneler4 小时前
[qemu+kvm]: trap 寄存器脱敏优化方法
linux
猫猫的小茶馆4 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
神奇椰子5 小时前
[特殊字符] 服务器搭建网站完整教程
运维·服务器