扩展云镜像磁盘空间案例:AlmaLinux 9 云镜像扩展
🎯 案例目标
将原始的 2GB AlmaLinux 9 云镜像扩展为 30GB,并进行必要的系统配置。
📋 详细步骤
步骤1:环境准备和文件检查
# 1.1 检查原始镜像信息
qemu-img info AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2# 输出示例:
# image: AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2
# file format: qcow2
# virtual size: 2 GiB (2147483648 bytes)
# disk size: 576 MiB
步骤2:分析原始镜像分区结构
# 2.1 查看镜像中的文件系统和分区信息
virt-filesystems --long -h --all -a AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2# 预期输出类似:
# Name Type Size Parent
# /dev/sda1 partition 1G /dev/sda
# /dev/sda2 partition 1G /dev/sda
# /dev/sda3 partition 512M /dev/sda
# /dev/sda4 partition - /dev/sda (这是我们要扩展的分区)
步骤3:创建目标磁盘镜像
# 3.1 创建 30GB 的新 qcow2 镜像
qemu-img create -f qcow2 alma94-expanded.qcow2 30G# 3.2 验证新镜像创建成功
qemu-img info alma94-expanded.qcow2
步骤4:扩展分区到新镜像
# 4.1 执行分区扩展
virt-resize --expand /dev/sda4 AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2 alma94-expanded.qcow2# 输出示例:
# [ 0.0] Examining AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2
# [ 5.2] Estimating required space for the expanded partition
# [ 5.2] Copying /dev/sda1
# [ 5.3] Copying /dev/sda2
# [ 5.4] Copying /dev/sda3
# [ 5.5] Expanding /dev/sda4 using the remaining space
# [ 5.6] Setting up logical volume manager
# [ 6.1] Expanding /dev/almalinux/root within the partition
步骤5:验证扩展结果
# 5.1 检查新镜像的分区结构
virt-filesystems --long -h --all -a alma94-expanded.qcow2# 5.2 检查文件系统是否正常扩展
guestfish --ro -i -a alma94-expanded.qcow2 <<EOF
df
vfs-type /
quit
EOF
步骤6:系统配置和自定义
# 6.1 设置root密码和基本配置
virt-customize -a alma94-expanded.qcow2 \--root-password password:cisco123 \--run-command 'df -h' \--selinux-relabel# 6.2 可选:安装额外软件包
virt-customize -a alma94-expanded.qcow2 \--install cloud-init,qemu-guest-agent,tree,vim \--update
步骤7:最终验证
# 7.1 启动测试虚拟机验证扩展结果
virt-install \--name test-expanded-vm \--memory 1024 \--vcpus 1 \--disk path=alma94-expanded.qcow2 \--import \--noautoconsole# 7.2 检查磁盘使用情况
virsh console test-expanded-vm
# 登录后执行:df -h 和 lsblk
🔧 完整脚本示例
#!/bin/bash
# expand_cloud_image.shORIGINAL_IMAGE="AlmaLinux-9-GenericCloud-9.4-20240805.x86_64.qcow2"
EXPANDED_IMAGE="alma94-expanded.qcow2"
NEW_SIZE="30G"echo "=== 开始扩展云镜像 ==="# 1. 检查原始文件
if [ ! -f "$ORIGINAL_IMAGE" ]; thenecho "错误: 原始镜像文件 $ORIGINAL_IMAGE 不存在"exit 1
fiecho "原始镜像信息:"
qemu-img info "$ORIGINAL_IMAGE"# 2. 分析分区结构
echo -e "\n=== 分析分区结构 ==="
virt-filesystems --long -h --all -a "$ORIGINAL_IMAGE"# 3. 创建新镜像
echo -e "\n=== 创建 $NEW_SIZE 目标镜像 ==="
qemu-img create -f qcow2 "$EXPANDED_IMAGE" "$NEW_SIZE"# 4. 扩展分区
echo -e "\n=== 执行分区扩展 ==="
virt-resize --expand /dev/sda4 "$ORIGINAL_IMAGE" "$EXPANDED_IMAGE"# 5. 系统配置
echo -e "\n=== 系统配置 ==="
virt-customize -a "$EXPANDED_IMAGE" \--root-password password:cisco123 \--run-command 'echo "磁盘扩展完成,当前磁盘空间:" && df -h' \--selinux-relabel# 6. 验证结果
echo -e "\n=== 验证扩展结果 ==="
echo "新镜像信息:"
qemu-img info "$EXPANDED_IMAGE"echo -e "\n分区结构:"
virt-filesystems --long -h --all -a "$EXPANDED_IMAGE"echo -e "\n=== 扩展完成 ==="
echo "新镜像: $EXPANDED_IMAGE"
echo "原始大小: $(qemu-img info "$ORIGINAL_IMAGE" | grep 'virtual size')"
echo "现在大小: $(qemu-img info "$EXPANDED_IMAGE" | grep 'virtual size')"
📊 执行结果验证
扩展完成后,可以通过以下命令验证:
# 检查磁盘空间
guestfish --ro -i -a alma94-expanded.qcow2 <<EOF
df
blkid
quit
EOF# 或者启动临时虚拟机验证
virt-install \--name verify-disk \--memory 512 \--disk alma94-expanded.qcow2 \--import \--noautoconsole \--wait 0
💡 总结说明
🎯 技术要点总结
-
工具链协同工作:
qemu-img
:创建和管理磁盘镜像virt-filesystems
:分析分区结构virt-resize
:安全扩展分区virt-customize
:离线系统配置
-
关键步骤:
- 预先分析:必须了解原始镜像的分区布局
- 安全扩展:
virt-resize
自动处理分区表和文件系统 - 配置更新:修改密码、重标 SELinux 确保系统可用性
-
风险控制:
- 原始镜像保持只读,所有修改在新镜像进行
- 扩展前备份重要数据
- 验证步骤确保扩展成功
🚀 应用价值
- 云环境部署:为 OpenStack、KVM 等准备大容量基础镜像
- 开发测试:快速创建满足特定磁盘需求的测试环境
- 批量运维:标准化镜像制备流程,提高部署效率
- 资源优化:按需调整磁盘空间,避免资源浪费
⚠️ 注意事项
- 分区选择:确保扩展的是正确的根分区
- 文件系统:某些文件系统可能需要额外步骤才能在线扩展
- 备份策略:生产环境务必先备份原始镜像
- 性能考虑:qcow2 格式的预分配策略影响性能
这个案例展示了完整的云镜像磁盘扩展流程,适用于各种 Linux 发行版的云镜像定制需求。