You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在Proxmox云初始化VM中脚本化安装QEMU Guest Agent的问题

在Proxmox云初始化VM中脚本化安装QEMU Guest Agent的问题

嘿,我之前用Proxmox批量制作云模板的时候也碰到过一模一样的问题——你直接用qm set --exec在模板创建阶段执行命令肯定会失败的,因为这时候VM还没启动呢,根本没法在虚拟机内部跑apt/dnf命令。我给你分享几个靠谱的解决办法,应该能帮你搞定这个需求:

先理清问题根源

qm set --exec这个命令是给正在运行的VM发指令用的,而你的脚本是在创建VM模板的流程里调用它,这时候VM只是生成了配置,连一次都没启动过,自然没法执行内部的包管理操作。所以得换个思路:要么让VM第一次启动时自动安装,要么在宿主机上直接修改镜像文件。


方案一:用Cloud-Init用户数据自动安装(最推荐)

Cloud-Init本来就是用来初始化云实例的,刚好适配你的场景。你只需要修改create_template函数,给不同发行版的VM注入对应的初始化脚本,让它们第一次启动时自动安装并启用QEMU Guest Agent。

修改后的函数示例:

function create_template() {
    #Print all of the configuration
    echo "Creating template $2 ($1)"

    #Create new VM
    qm create $1 --name $2 --ostype l26

    # 保留你原来的所有基础配置
    qm set $1 --net0 virtio,bridge=vmbr0
    qm set $1 --serial0 socket --vga serial0
    qm set $1 --memory 1024 --cores 4 --cpu host
    qm set $1 --scsi0 ${storage}:0,import-from="$(pwd)/$3",discard=on
    qm set $1 --boot order=scsi0 --scsihw virtio-scsi-single
    qm set $1 --agent enabled=1,fstrim_cloned_disks=1
    qm set $1 --ide2 ${storage}:cloudinit
    qm set $1 --ipconfig0 "ip6=auto,ip=dhcp"
    qm set $1 --cipassword password
    qm set $1 --ciuser ${username}

    # 新增:根据发行版生成Cloud-Init用户数据,自动安装Guest Agent
    local temp_user_data=$(mktemp)
    case $2 in
        # Debian/Ubuntu系列
        temp-debian-*|temp-ubuntu-*)
            cat > "$temp_user_data" <<EOF
#cloud-config
runcmd:
  - apt update && apt install -y qemu-guest-agent
  - systemctl enable --now qemu-guest-agent
EOF
            ;;
        # Fedora/CentOS Stream系列
        temp-fedora-*|temp-centos-*-stream*)
            cat > "$temp_user_data" <<EOF
#cloud-config
runcmd:
  - dnf install -y qemu-guest-agent
  - systemctl enable --now qemu-guest-agent
EOF
            ;;
        *)
            echo "Unsupported distribution: $2"
            rm -f "$temp_user_data"
            return 1
            ;;
    esac

    # 将用户数据上传到Proxmox的snippets存储(需确保存储启用snippets类型)
    local snippet_path="/var/lib/vz/snippets/userdata-$1.yaml"
    mv "$temp_user_data" "$snippet_path"
    qm set $1 --cicustom "user=local:snippets/userdata-$1.yaml"

    # 保留你原来的后续步骤
    qm disk resize $1 scsi0 8G
    qm template $1
    rm $3
}

注意事项

  • 要确保你的Proxmox存储(比如你用的main)已经启用了snippets内容类型。可以在Proxmox Web界面的「存储」设置里编辑对应存储,勾选「snippets」选项。
  • 这个方法会让VM第一次启动时自动执行安装命令,完全不需要手动干预,非常适合批量制作模板。

方案二:在宿主机上挂载镜像,手动修改(适合深度定制)

如果你不想依赖Cloud-Init,也可以直接在宿主机上挂载下载的VM镜像,用chroot进去安装Guest Agent。这种方法更繁琐,但适合需要对系统做更多定制的场景。

以Debian的qcow2镜像为例,步骤如下:

# 安装必要工具
apt install -y qemu-utils libguestfs-tools

# 创建临时挂载点
mkdir -p /tmp/template-mount

# 加载nbd模块,挂载qcow2镜像
modprobe nbd
qemu-nbd -c /dev/nbd0 debian-10-genericcloud-amd64.qcow2

# 挂载镜像的主分区(通常是/dev/nbd0p1,不同镜像可能有差异)
mount /dev/nbd0p1 /tmp/template-mount

# 挂载系统必要目录,方便chroot
mount --bind /dev /tmp/template-mount/dev
mount --bind /proc /tmp/template-mount/proc
mount --bind /sys /tmp/template-mount/sys

# 进入镜像系统环境安装Agent
chroot /tmp/template-mount /bin/bash
apt update && apt install -y qemu-guest-agent
systemctl enable qemu-guest-agent

# 退出并清理挂载
exit
umount /tmp/template-mount/sys
umount /tmp/template-mount/proc
umount /tmp/template-mount/dev
umount /tmp/template-mount
qemu-nbd -d /dev/nbd0
rmdir /tmp/template-mount

执行完这些操作后,再运行你的create_template函数创建模板即可。注意Fedora/CentOS系列要把包管理命令换成dnf install


方案三:直接用自带Guest Agent的官方镜像

其实很多官方云镜像已经默认预装了QEMU Guest Agent,比如Debian 11+、Ubuntu 20.04+的官方cloud镜像。你可以先检查一下镜像里有没有这个包:

apt install libguestfs-tools
virt-inspector debian-11-genericcloud-amd64.qcow2 | grep qemu-guest-agent

如果输出里能找到这个包,那你根本不需要额外安装——只需要确保脚本里的qm set $1 --agent enabled=1,fstrim_cloned_disks=1这一行存在,VM启动时Agent会自动运行。


备注:内容来源于stack exchange,提问作者nadermx

火山引擎 最新活动