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又可以不停机添加虚拟盘。这就是虚拟化和现代存储管理技术带给运维人员的最大便利。

相关推荐
曾小蛙6 分钟前
【TWIST2】 PICO重映射G1在ubuntu 22.04下环境配置
ubuntu·g1·twist2·gmr2·pico4u·xrobotoolkit
starvapour18 分钟前
Ubuntu部署gitlab频繁出现502的问题
linux·ubuntu·gitlab
jinglong.zha24 分钟前
LScript-从零基础到商业变现的AI自动化学习平台
运维·学习·自动化
Adorable老犀牛41 分钟前
Telegraf:InfluxData 出品的指标采集代理
运维·telegraf
北塔软件1 小时前
北塔软件智能体平台 | 不只监控,更是AI时代的数据资产
运维·人工智能·知识库·北塔软件
zhangfeng11331 小时前
ps aux讲解,结合国家超算中心 hpc apptainer
linux·服务器·网络
夜月yeyue1 小时前
STM32 DMA 双缓冲采样
linux·stm32·单片机·嵌入式硬件·系统架构
ScilogyHunter1 小时前
Buildroot完全指南:从入门到实战
linux·嵌入式·buildroot
毕竟是shy哥1 小时前
Claude Code 接入 DeepSeek 保姆级教程,WSL/Linux 通用
linux·安装教程·codex·deepseek·claude code·openclaw
AOwhisky2 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算