guestmount:修改 qcow2 镜像内容

1. 环境准备

(1) 下载 CentOS 镜像

(2) 验证虚拟化支持

1
2
3
4
5
# 检查 Intel CPU 虚拟化支持
cat /proc/cpuinfo | grep vmx

# 检查 AMD CPU 虚拟化支持
cat /proc/cpuinfo | grep svm

示例输出

1
2
3
4
5
flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36
clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon
pebs bts nopl xtopology tsc_reliable nonstop_tsc pni pclmulqdq vmx ssse3 cx16
pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand
hypervisor lahf_lm arat tpr_shadow vnmi ept vpid fsgsbase tsc_adjust smep

(3) 安装必要工具

1
2
3
4
5
6
7
8
9
# 安装 EPEL 仓库和 QEMU
yum install epel-release -y
yum install qemu -y

# 创建 qemu-kvm 软链接
ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm

# 安装 libguestfs 工具
yum install libguestfs-tools virt-install -y

2. 创建和准备镜像

(1) 创建 qcow2 磁盘镜像

1
qemu-img create -f qcow2 centos7.qcow2 10G

(2) 查看镜像分区信息

1
virt-filesystems -a centos7.qcow2

示例输出

1
2
3
/dev/sda1
/dev/sda2
/dev/sda3

3. 挂载并修改镜像

(1) 挂载镜像分区

1
2
3
4
5
# 切换到 root 用户
sudo su -

# 挂载目标分区(示例挂载 /dev/sda3)
guestmount -a centos7.qcow2 -m /dev/sda3 /mnt

(2) 进行修改操作

1
2
3
4
5
6
7
# 进入挂载点
cd /mnt

# 执行修改操作(示例)
echo "修改文件内容" > example.txt
cp /path/to/file /mnt/etc/config/
chmod 600 /mnt/root/.ssh/authorized_keys

(3) 解决挂载问题

常见错误处理

1
2
3
4
5
6
7
8
# 错误示例:未知文件系统类型
guestmount: error: mount_options: mount exited with status 32
mount: unknown filesystem type '(null)'

# 解决方案:
# 1. 使用 virt-filesystems 确认正确分区
# 2. 指定正确的文件系统类型(如有必要):
guestmount -a centos7.qcow2 -m /dev/sda3:/:fs-type=ext4 /mnt

4. 卸载镜像

1
2
3
4
5
6
7
8
# 确保所有操作已完成
sync

# 卸载镜像
guestunmount /mnt

# 或使用强制卸载(如需要)
guestunmount --force /mnt

关键注意事项

  1. 权限要求

    • 所有 guestmount 操作需要 root 权限
    • 普通用户使用时需加 sudo
  2. 分区选择

    • 使用 virt-filesystems -a <image> 查看可用分区
    • 通常系统根分区为 /dev/sda2/dev/sda3
  3. 文件系统类型

    • 如挂载失败,可尝试指定文件系统类型:
      1
      guestmount -a centos7.qcow2 -m /dev/sda2:/:fs-type=xfs /mnt
  4. 安全卸载

    • 修改后务必使用 guestunmount 而非常规 umount
    • 强制卸载可能导致镜像损坏
  5. 镜像验证

    • 修改后建议启动虚拟机验证更改是否生效:
      1
      qemu-kvm -hda centos7.qcow2 -m 2048