CentOS系统下LVM磁盘扩容和数据迁移,说白了就是三件事:先给物理磁盘或虚拟机加盘,再用pvcreate把新空间纳入LVM管理,接着用vgextend扩展卷组、lvextend拉大逻辑卷,最后用resize2fs或xfs_growfs刷新文件系统让空间生效。如果涉及数据迁移,就是把旧盘的数据用dd或rsync搬到新逻辑卷上,再切换挂载点。下面我把每一步的操作命令、注意事项、常见坑全部讲透,不管你是物理机还是云服务器,照着做就行。

一、先搞清楚LVM的三层结构

很多人扩容出错,根本原因是没理解LVM的层级关系。LVM分三层:最底层是PV(物理卷),就是真实的磁盘分区或整块磁盘;中间层是VG(卷组),把多个PV组合成一个大的存储池;最上层是LV(逻辑卷),从VG里切出来的"虚拟分区",格式化后挂载使用。扩容的本质就是往VG里加PV,然后把LV撑大。你先用下面三条命令确认当前状态:

pvs          # 查看所有物理卷
vgs          # 查看所有卷组
lvs          # 查看所有逻辑卷

这三条命令是所有操作的起点,必须先看清楚你的PV、VG、LV分别叫什么名字、有多大空间,后面的命令才能对号入座。

二、新增物理磁盘并创建PV

如果你是物理机,直接插一块新硬盘;如果是云服务器,在控制台挂载一块新数据盘。新盘挂载到系统后,用fdisk -l看一下设备名,通常是/dev/sdb、/dev/sdc这种。接下来创建分区并设为LVM类型:

fdisk /dev/sdb
# 输入 n 新建分区
# 输入 p 主分区
# 输入 1 分区号
# 回车两次用默认起止扇区
# 输入 t 修改分区类型
# 输入 8e 设为Linux LVM
# 输入 w 保存退出

分区建好后,把它初始化为PV:

pvcreate /dev/sdb1

验证一下:

pvs

你应该能看到/dev/sdb1出现在列表里。如果你不想分区,直接把整块盘做成PV也行,命令是pvcreate /dev/sdb,但生产环境建议分区,方便管理。

三、扩展卷组VG

PV准备好了,下一步把它加入已有的卷组。先用vgs看你的卷组名,假设叫centos(CentOS默认就是这个名):

vgextend centos /dev/sdb1

再用vgs看一眼,VG的VFree(空闲空间)应该变大了。如果你有多块新盘要加,重复上面的pvcreate和vgextend就行,VG会自动把所有PV的空间汇总。

四、扩展逻辑卷LV

VG有了空闲空间,现在把LV拉大。先用lvs看你要扩容的逻辑卷路径,假设是/dev/centos/root或者/dev/centos/data:

lvextend -l +100%FREE /dev/centos/root

这条命令的意思是把VG里所有剩余空间都加给root这个LV。如果你只想加固定大小,比如加50G:

lvextend -L +50G /dev/centos/root

如果你要指定最终大小,比如扩到200G:

lvextend -L 200G /dev/centos/root

执行完用lvs确认一下LV的大小确实变了。

五、刷新文件系统让扩容生效

LV变大了不代表空间马上能用,文件系统还不知道。这一步根据文件系统类型分两种情况:

如果是ext4文件系统:

resize2fs /dev/centos/root

如果是xfs文件系统(CentOS 7/8默认就是xfs):

xfs_growfs /dev/centos/root

注意xfs_growfs后面跟的是挂载点路径,不是设备名。比如你的root挂在/,就写:

xfs_growfs /

执行完用df -h看一下,容量应该已经变大了。这一步千万别漏,否则你会发现LV大了但df显示没变化,应用还是报磁盘满。

六、数据迁移的完整操作流程

有时候你不是简单扩容,而是要把数据从旧盘搬到新的逻辑卷上,比如换了新硬盘或者要做存储迁移。这里有两种主流方案:

方案一:dd整盘克隆

适用于整块盘对整块盘的迁移,比如把/dev/sda上的数据搬到新的LV上。前提是目标LV的大小要大于等于源盘已用数据量:

dd if=/dev/sda of=/dev/centos/new_lv bs=4M status=progress

dd的优点是简单粗暴、保留所有分区结构和引导信息;缺点是慢、目标必须大于等于源、不能在线操作。如果是系统盘迁移,还需要重新安装引导:

grub2-install /dev/sda

方案二:rsync文件级迁移

适用于只迁移数据、不需要保留引导结构的场景。先把新LV格式化并挂载:

mkfs.xfs /dev/centos/new_lv
mkdir /mnt/new
mount /dev/centos/new_lv /mnt/new

然后用rsync同步数据:

rsync -avP /mnt/old/ /mnt/new/

同步完成后,修改/etc/fstab把旧挂载点换成新LV的设备名,然后umount旧的、mount新的。这种方式灵活、可控、支持增量同步,生产环境推荐用这个。

七、在线扩容根分区的特殊处理

如果你要扩容的是根分区/,而且系统正在运行,上面的resize2fs和xfs_growfs都支持在线操作,不需要重启。但有一个前提:你的LV必须是在线状态,而且文件系统没有被挂载为只读。如果是ext4,还需要确认内核版本支持在线扩容(CentOS 7以上都没问题)。

如果你发现根分区空间不够、又不敢在线操作,可以用Live CD启动,从外部系统挂载你的LV再做扩容,这样最安全。步骤是:用CentOS安装U盘启动,选择Rescue模式,手动挂载LV后执行lvextend和resize2fs。

八、缩容操作的风险提醒

扩容是安全的,但缩容(把LV变小)风险极高。xfs文件系统不支持缩容,ext4虽然支持但必须先卸载。如果你一定要缩,正确顺序是:卸载文件系统→检查文件系统→缩小文件系统→缩小LV。任何一步出错都可能丢数据。我的建议是:生产环境别缩容,直接加盘扩容,成本低风险小。

九、常见问题排查

问题1:vgextend报错"No physical volume label read"

说明你的新盘没有正确初始化PV,重新执行pvcreate /dev/sdb1即可。

问题2:lvextend后df没变化

99%是忘了执行resize2fs或xfs_growfs,回去补上就行。

问题3:扩容后重启进不了系统

检查/etc/fstab里的UUID是否和新LV一致,用blkid查看UUID,如果不对就更新fstab。如果是系统盘迁移,还要确认grub引导是否正确安装。

问题4:VG空间不够

用vgdisplay看VG的总空间和已用空间,如果确实不够,需要再加PV或者清理不用的LV。可以用lvremove删除不需要的逻辑卷释放空间,但删除前务必确认数据已备份。

十、最佳实践建议

第一,操作前一定要备份重要数据,哪怕你觉得只是扩容,意外随时可能发生。第二,养成记录的习惯,把pvcreate、vgextend、lvextend的命令和参数记下来,方便以后排查。第三,生产环境建议用LVM快照(lvcreate -s)做备份点,扩容前先打快照,出问题可以回滚。第四,监控磁盘使用率,设置告警阈值,别等到100%才想起来扩容。第五,如果是云服务器,优先用控制台在线扩容云盘,比加新盘再迁移更省事,很多云平台支持直接把云盘从50G扩到100G,然后在系统里执行lvextend和文件系统刷新就行。

总结一下,CentOS LVM扩容的核心流程就是:加盘→建PV→扩VG→扩LV→刷文件系统。数据迁移就是:建新LV→格式化挂载→dd或rsync搬数据→切换挂载点。每一步都有对应命令,逻辑清晰,只要按顺序来、别跳步,基本不会出问题。把这篇文章收藏好,下次扩容直接照着敲命令就行。