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搬数据→切换挂载点。每一步都有对应命令,逻辑清晰,只要按顺序来、别跳步,基本不会出问题。把这篇文章收藏好,下次扩容直接照着敲命令就行。
