1. 为什么需要LVM动态扩容?
在云平台环境中,虚拟机磁盘资源经常需要根据业务需求动态调整。想象一下这样的场景:你负责的在线商城遇到双十一大促,流量突然暴增导致存储空间不足。传统做法是停机、备份、扩容、恢复,整个过程可能需要数小时。而通过Kylin v10的LVM+cloud-init方案,只需在控制台调整磁盘参数,重启虚拟机就能自动完成扩容,整个过程不超过5分钟。
LVM(Logical Volume Manager)就像个智能的"磁盘管家",它把物理磁盘抽象成可灵活调整的逻辑卷。我经手过的金融行业客户,有80%的云主机都采用LVM方案,主要看中这三个优势:
- 空间池化管理:多个物理磁盘可以合并成一个大容量存储池
- 在线扩容:无需卸载文件系统就能调整分区大小
- 快照备份:秒级创建数据快照,特别适合数据库应用
2. 环境准备与基础配置
2.1 系统安装关键步骤
使用Kylin-Server-10-SP1-Release-Build04-20200711-arm64.iso安装时,这几个选项要特别注意:
- 语言选择英文(避免后续出现字符编码问题)
- 软件选择"Server with UKUI GUI"(包含图形化管理和必要工具)
- 分区方案选择"LVM自定义分区"
- 卷组名称建议改为非默认值(如vklas),避免与物理机冲突
实测中发现,如果安装时选了中文环境,后期运行growpart命令可能会报unexpected output in sfdisk --version错误。这是因为工具输出的中文提示导致解析失败。万一已经装了中文系统,可以通过修改/etc/locale.conf来修复:
LANG="en_US.UTF-8"2.2 必备软件包安装
除了官方源,建议添加银河麒麟的更新源获取最新软件包:
yum install -y cloud-init cloud-utils-growpart lvm2 xfsprogs这里有个坑要注意:不同版本的cloud-init对LVM支持程度不同。建议通过cloud-init --version确认版本不低于20.3,否则可能出现自动扩容失效的情况。
3. cloud-init深度配置实战
3.1 自动扩容核心配置
在/etc/cloud/cloud.cfg.d/目录下创建06_growpart.cfg,这是整个方案的核心:
#cloud-config growpart: mode: auto devices: [/dev/vda3] ignore_growroot_disabled: false runcmd: - [pvresize, /dev/vda3] - [lvextend, -l, +100%FREE, /dev/mapper/vklas-root] - [xfs_growfs, /]遇到过最典型的配置错误是把xfs_growfs /写成xfs_growfs /dev/mapper/vklas-root。新版工具要求参数必须是挂载点而不是设备路径,否则会报"is not a mounted XFS filesystem"错误。
3.2 两种触发机制对比
云平台扩容后,要使配置生效有两种方式:
方案A:runcmd+always模式修改/etc/cloud/cloud.cfg:
cloud_config_modules: - [runcmd,always]优点:无需额外重启,适合不能频繁重启的生产环境 缺点:依赖cloud-init服务正常运行
方案B:bootcmd模式修改06_growpart.cfg:
bootcmd: - [pvresize, /dev/vda3] - [lvextend, -l, +100%FREE, /dev/mapper/vklas-root] - [xfs_growfs, /]优点:每次启动自动执行,可靠性高 缺点:必须重启才能生效
金融客户通常选择方案B,因为他们的变更窗口本身就要求重启验证。而互联网公司更倾向方案A,追求服务不间断。
4. 镜像制作与云平台部署
4.1 镜像清理关键步骤
制作模板镜像前,必须执行这些清理操作:
cloud-init clean rm -rf /var/lib/cloud/* truncate -s 0 /etc/machine-id特别是machine-id文件,如果不清理会导致多台虚拟机ID冲突。曾经有客户反馈网络异常,排查半天发现就是因为这个文件没清理。
4.2 云平台上传注意事项
使用glance上传镜像时,这些参数直接影响LVM兼容性:
glance image-create \ --property hw_disk_bus=virtio \ --property hw_scsi_model=virtio-scsi \ --property os_distro=kylin在华为云实测中,缺少hw_scsi_model属性会导致磁盘识别为/dev/sda而不是/dev/vda,造成扩容脚本失效。
5. 常见问题排查指南
5.1 扩容失败排查流程
查看关键日志:
journalctl -u cloud-init -b # 检查服务状态 grep "growpart" /var/log/cloud-init.log # 定位扩容阶段常见错误及解决方案:
- GPT分区表报错:使用sgdisk调整分区表
- 剩余空间不足:确保云平台侧已真正扩容磁盘
- 文件系统锁冲突:umount后执行fsck检查
5.2 性能优化建议
对于数据库等IO敏感型应用,建议在扩容后执行:
lvchange --refresh vklas/root blockdev --rereadpt /dev/vda这样可以避免内核缓存导致的新容量识别延迟。某次Oracle数据库迁移项目中,这个操作将存储性能恢复了30%。
6. 进阶:多分区扩容方案
对于需要单独扩容/home等分区的场景,配置示例:
bootcmd: - [pvresize, /dev/vda3] - [lvextend, -L+10G, /dev/mapper/vklas-home] - [xfs_growfs, /home] - [lvextend, -l, +100%FREE, /dev/mapper/vklas-root] - [xfs_growfs, /]注意操作顺序:先扩容特定分区并预留缓冲空间,最后再将剩余空间全部分配给根分区。这个方案在某高校的HPC环境中成功管理过50TB的分布式存储。